MongoDB 內存管理相關總結
MongoDB的內存用在哪兒?
在MongoDB中,加載各種依賴的lib到內存、管理客戶端請求、元數據管理存儲等工作都需要占用內存,但其實內存使用的大部分還是在存儲引擎和客戶端連接請求處理方面。
一方面是存儲引擎的cache,通常情況下,我們可以使用參數cacheSizeGB參數(下面會講到)來控制內存使用率,一旦超過這個內存使用率,則MongoDB的存儲引擎會淘汰掉部分內存中的數據頁。
正常運行的MongoDB實例,內存使用率大約為80%的cacheSizeGB參數值,因為超過80%之后,內存淘汰策略就開始淘汰過期的數據頁了,如果出現(xiàn)使用率過大,則多半表示當前實例內存淘汰的壓力比較大。請求就有延時的可能。
另一方面,如果客戶端的連接數過多,建立過多的tcp鏈接,這些連接的維護,需要有read buffer和write buffer以用來收發(fā)網絡包,所以也會產生開銷。每個連接占用的內存大小約為2MB左右。
如何限制MongoDB對內存的使用?
最近在線上發(fā)現(xiàn)了一些有意思的現(xiàn)象,比如某一臺服務器上部署了MySQL和MongoDB的服務,然后內存報警,說是內存已經使用了超過85%了,這個時候,通常我們會想到遷移服務。將MySQL或者MongoDB的服務切換到其他的機器上,這樣,服務器的內存就可以節(jié)省下來。
但是實際的現(xiàn)象就是,如果我們遷移了MySQL的服務之后,服務器的內存臨時會降下來,但是一段時間過后,又會報警,因為MongoDB已經將MySQL騰出來的內存空間也占用完了。
我們知道,在MySQL中,占用內存比較多的就是innodb_buffer_pool,還有一堆其他的buffer,除此之外,連接數也是一個需要考慮的因素。
在MongoDB中,如果我們不限制MongoDB的內存使用,那么MongoDB就會盡可能的占用更多的內存來提高讀寫性能。具體的策略如下:
從MongoDB3.4開始, WiredTiger存儲引擎默認的cache size是下面2個值中較大的一個。
公式一:0.5*(物理內存-1GB)
公式二:256MB
例如,物理內存4G,則cache size=1.5GB,如果物理內存1.5G,則cache size=0.5*(1.5-1)=250MB < 256MB ,所以取值為256MB
MongoDB中可以通過配置文件的內容限定MongoDB所使用的內存,關鍵參數如下:
storage: wiredTiger: engineConfig: cacheSizeGB: <number> # 單位是GB,浮點型 journalCompressor: <string> directoryForIndexes: <boolean> maxCacheOverflowFileSizeGB: <number> collectionConfig: blockCompressor: <string> indexConfig: prefixCompression: <boolean>
上面的參數,一般情況下,單機單實例,建議配置在內存的60%左右。
cacheSizeGB參數配置的注意事項
幾點建議:
1、不要增加WiredTiger的內部cache size超過默認值
2、WiredTiger存儲引擎使用WiredTiger內部緩存和文件系統(tǒng)緩存
3、WiredTiger會自動使用所有剩余的文件系統(tǒng)緩存
4、單機多實例請務必減少mongod的內存分配值
如何查看內存使用情況?
db.hostInfo()
這個命令可以查看MongoDB的內存限制情況,查看結果如下:
SECONDARY> db.hostInfo()
{
"system" : {
"currentTime" : ISODate("2020-12-31T03:51:28.278Z"),
"hostname" : "localhost.localdomain:24204",
"cpuAddrSize" : 64,
"memSizeMB" : 64393,
"numCores" : 8,
"cpuArch" : "x86_64",
"numaEnabled" : false
},
以上就是MongoDB 內存管理相關總結的詳細內容,更多關于MongoDB 內存管理的資料請關注腳本之家其它相關文章!
相關文章
MongoDB快速入門及其SpringBoot實戰(zhàn)教程
MongoDB是一個開源、高性能、無模式的文檔型數據庫,當初的設計就是用于簡化開發(fā)和方便擴展,是NoSQL數據庫產品中的一種,它支持的數據結構非常松散,是一種類似于JSON的格式叫BSON,本文介紹MongoDB快速入門及其SpringBoot實戰(zhàn),感興趣的朋友一起看看吧2023-12-12
解決net start MongoDB 報錯之服務名無效的問題
這篇文章主要介紹了解決net start MongoDB 報錯之服務名無效的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
SqlServer與MongoDB結合使用NHibernate
這篇文章主要為大家詳細介紹了SqlServer與MongoDB結合使用NHibernate的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11

