關於mongodb佔用記憶體過大的問題
一、現象
最近發現自己伺服器記憶體越來越少,查了一下原來是部署的mongodb使用記憶體線上性增加。不查不知道,一查嚇一跳,竟然佔用了3G的記憶體。。
二、分析
1.記憶體增加的原因
mongo為了優化他的讀寫效率,將記憶體當做快取,所以你讀寫次數越多,快取就越大。預設值:
從3.4開始,WiredTiger內部快取預設使用較大的一個:
- 50%(RAM - 1 GB),或
- 256 MB。
例如,我是8G記憶體,那麼最大快取0.5*(8-1)=3.5G,看到了麼。。。mongo預設3.5G都是他的快取。
2.cacheSizeGB的介紹
storage.wiredTiger. engineConfig.cacheSizeGB
wiredtiger將使用所有資料的最大快取大小,wiredTiger快取工作集(working set)資料的記憶體大小,單位:GB,此值決定了wiredTiger與mmapv1的記憶體模型不同,它可以限制mongod對記憶體的使用量,而mmapv1則不能(依賴於系統級的mmap)。預設情況下,cacheSizeGB的值為假定當前節點只部署一個mongod例項,在MongoDB 3,預設情況下,wiredtiger快取,使用1 GB或安裝的實體記憶體的一半,以較大者為準。如果當前節點部署了多個mongod程序,那麼需要合理配置此值。如果mongod部署在虛擬容器中(比如,lxc,cgroups,Docker)等,它將不能使用整個系統的實體記憶體,則需要適當調整此值。預設值為實體記憶體的一半。
三、解決方案
修改(增加)cacheSizeGB配置。
配置如下:
engine: wiredTiger
# mmapv1:
wiredTiger:
engineConfig:
cacheSizeGB: 1