1. 程式人生 > 實用技巧 >rocksdbCacheSizeGB過大導致mongodb被kill

rocksdbCacheSizeGB過大導致mongodb被kill

現象

通過監控發現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又跟不上,那就有可能到幾百幾千毫秒都有可能。

參考

MongoDB記憶體配置 --wiredTigerCacheSizeGB