MongoDB 在記憶體不足時終止
我有以下配置:
執行三個 docker 容器的主機:
- MongoDB
- 雷迪斯
- 使用前面兩個容器儲存數據的程序
Redis 和 MongoDB 都用於儲存大量數據。我知道 Redis 需要將其所有數據保存在 RAM 中,我對此很好。不幸的是,mongo 開始佔用大量 RAM,一旦主機 RAM 已滿(我們在這裡談論 32GB),mongo 或 Redis 就會崩潰。
我已閱讀以下有關此問題的先前問題:
- 限制 MongoDB RAM 使用:顯然大部分 RAM 都被 WiredTiger 記憶體用完了
- MongoDB 限制記憶體:這裡的問題顯然是日誌數據
- 限制 MongoDB 中的 RAM 記憶體使用:這裡他們建議限制 mongo 的記憶體,以便它的記憶體/日誌/數據使用更少量的記憶體
- MongoDB 使用太多記憶體:這裡他們說它是 WiredTiger 記憶體系統,它傾向於使用盡可能多的 RAM 來提供更快的訪問。他們還說
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- 有沒有限制 mongodb 記憶體使用的選項?:再次記憶體,他們還添加
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- MongoDB 索引/RAM 關係:引用:
MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
- 如何釋放 MongoDB 使用的記憶體?: 與5中相同的答案。
現在我似乎從所有這些答案中了解到的是:
- 為了更快地訪問,mongo 最好將所有索引都放在 RAM 中。但是,就我而言,我對部分駐留在磁碟上的索引很好,因為我有一個非常快的 SSD。
- RAM 主要用於 mongo 的記憶體。
考慮到這一點,我希望 mongo 嘗試使用盡可能多的 RAM 空間,但也能夠使用很少的 RAM 空間並從磁碟獲取大部分內容。但是,我通過使用
--memory
and限制了 mongo Docker 容器的記憶體(例如 8GB)--memory-swap
,但不是從磁碟獲取內容,mongo 只是在記憶體不足時立即崩潰。如何強制 mongo 僅使用可用記憶體並從磁碟中獲取不適合記憶體的所有內容?
根據 MongoDB BOL Here **Changed in version 3.4:**值的範圍可以從
256MB
to10TB
並且可以是float
. 此外,預設值也發生了變化。從 開始
3.4
,WiredTiger內部記憶體預設使用以下兩者中的較大者:50% of RAM minus 1 GB, or 256 MB.
MongoDB使用
WiredTiger
了WiredTigerinternal cache
和filesystem cache
.通過
filesystem cache
,MongoDB 自動使用所有未由WiredTiger cache
或 其他程序使用的空閒記憶體。storage.wiredTiger.engineConfig.cacheSizeGB限制了
WiredTiger
內部記憶體的大小。作業系統會將可用的空閒記憶體用於文件系統記憶體,這允許壓縮的 MongoDB 數據文件保留在記憶體中。此外,operating system
將使用任何空閒 RAM 來緩衝文件系統塊和文件系統記憶體。為了適應RAM的額外消費者,您可能必須減小
WiredTiger
內部記憶體大小。進一步了解您的參考WiredTiger 儲存引擎和配置文件選項