mongodb佔(zhàn)物理內(nèi)存,我們一臺(tái)伺服器8G內(nèi)存,沒有開mongodb的時(shí)候,物理內(nèi)存只佔(zhàn)11%,當(dāng)開了mongodb,mongodb進(jìn)程的內(nèi)存顯示是60M,但物理內(nèi)存已經(jīng)是99%,請問是什麼原因?有沒有最佳化的辦法,我們是在WINDOWS系統(tǒng).
ringa_lee
我記得,一個(gè)叫唐建法的人說:mongodb不是吃內(nèi)存,而是它設(shè)計(jì)初衷就是要故意佔(zhàn)內(nèi)存。
mongodb本身就是不做記憶體管理的,它的記憶體管理完全依賴系統(tǒng)。你可以用系統(tǒng)效能監(jiān)視器看下記憶體和虛擬記憶體。簡單點(diǎn)來說你有多少記憶體mongdb就會(huì)吃多少,就是這麼貪得無厭,它會(huì)把絕大部分熱數(shù)據(jù)都會(huì)放在記憶體裡來提升效能,畢竟這也是它的優(yōu)點(diǎn)。
我們的伺服器是windows server 2008,有32G內(nèi)存,運(yùn)行了一段時(shí)間後,也是被吃光,但性能讓人驚喜,但那臺(tái)伺服器上不光只有mongodb,所以經(jīng)常影響到其他程序,後來我們嘗試用windows的系統(tǒng)資源管理器WSRM,限制mongodb進(jìn)程的內(nèi)存,確實(shí)有效果你可以試試看。
但我是前年開始使用mongodb的,當(dāng)時(shí)版本比較老,限制內(nèi)存後mongodb很不穩(wěn)定,偶爾掛掉,看日誌顯示大體意思是找不到映射的內(nèi)存了。所以後來我們放棄了限制內(nèi)存,改用每天定點(diǎn)用程式使用mongodb的指令釋放內(nèi)存{closeAllDatabases:1}
這個(gè)指令也是有成本的,會(huì)阻塞到指令完整,而且剛釋放完後效率會(huì)降低,要經(jīng)過一段時(shí)間的「暖身」才能慢慢恢復(fù)。
我覺得後面這種方法不錯(cuò),而且透過這兩年的觀察一切都比較穩(wěn)定。當(dāng)然你們要是能單獨(dú)給mongodb一臺(tái)伺服器那是再好不過的了。
新的 MongoDB 引擎會(huì)認(rèn)為自己是系統(tǒng)中唯一重要的服務(wù),因此會(huì)盡量佔(zhàn)用記憶體來作為自己的快?。ú皇亲鳂I(yè)系統(tǒng)的快取)。如果你需要為其它進(jìn)程保留內(nèi)存,或者有多個(gè) MongoDB 實(shí)例,可以使用 --cacheSizeGB
參數(shù)來限制 MongoDB 的快取大小。