現象
通過監控發現mongodb重啟了兩次,結合內存監控來看,很有可能是被kill了,時間點也對的上。
查找日志
cd /var/log
fgrep -i 'killed process' /var/log/messages 或者 journalctl -xb | fgrep -i 'killed process'
Sep 17 22:48:15 h27 kernel: Killed process 56106 (mongod) total-vm:40778532kB, anon-rss:38430872kB, file-rss:0kB, shmem-rss:0kB
Sep 17 22:48:15 h27 kernel: Killed process 56132 (ftdc) total-vm:40778532kB, anon-rss:38433100kB, file-rss:0kB, shmem-rss:0kB
Sep 17 22:48:15 h27 kernel: Killed process 2249 (Replica.xecutor) total-vm:40778532kB, anon-rss:38433100kB, file-rss:0kB, shmem-rss:0kB
Sep 18 07:18:15 h27 kernel: Killed process 16984 (mongod) total-vm:33426556kB, anon-rss:30856324kB, file-rss:0kB, shmem-rss:0kB
Sep 18 07:18:15 h27 kernel: Killed process 16988 (FlowCon.fresher) total-vm:33426556kB, anon-rss:30858472kB, file-rss:0kB, shmem-rss:0kB
Sep 18 12:43:18 h27 kernel: Killed process 13595 (mongod) total-vm:32848996kB, anon-rss:30967520kB, file-rss:0kB, shmem-rss:0kB
服務器的內存是64G,mongo的進程占了32G,還有一些其他程序,結果就OOM了。
kill 的機制:先 kill 內存占用較大的程序
解決問題
服務器內存就64G,rocksdbCacheSizeGB
設置成50G太大了。將 rocksdbCacheSizeGB
緩存從50G調整到20G。
cacheSizeGB 指的就是Cache size,包括數據和索引。Mongod本身使用內存如連接池堆棧以及sorting buffer等都是額外的,不會被統計到這個數字里面。如果索引在內存,查詢冷數據取決於IO能力。如果IO latency很低,系統也沒有是高負載,那響應時間應該是毫秒級的區別。但是如果查詢很頻繁,又涉及到很多范圍、批量查詢,IOPS又跟不上,那就有可能到幾百幾千毫秒都有可能。