MongoDB 內(nèi)存管理相關(guān)總結(jié)
MongoDB的內(nèi)存用在哪兒?
在MongoDB中,加載各種依賴的lib到內(nèi)存、管理客戶端請(qǐng)求、元數(shù)據(jù)管理存儲(chǔ)等工作都需要占用內(nèi)存,但其實(shí)內(nèi)存使用的大部分還是在存儲(chǔ)引擎和客戶端連接請(qǐng)求處理方面。
一方面是存儲(chǔ)引擎的cache,通常情況下,我們可以使用參數(shù)cacheSizeGB參數(shù)(下面會(huì)講到)來控制內(nèi)存使用率,一旦超過這個(gè)內(nèi)存使用率,則MongoDB的存儲(chǔ)引擎會(huì)淘汰掉部分內(nèi)存中的數(shù)據(jù)頁。
正常運(yùn)行的MongoDB實(shí)例,內(nèi)存使用率大約為80%的cacheSizeGB參數(shù)值,因?yàn)槌^80%之后,內(nèi)存淘汰策略就開始淘汰過期的數(shù)據(jù)頁了,如果出現(xiàn)使用率過大,則多半表示當(dāng)前實(shí)例內(nèi)存淘汰的壓力比較大。請(qǐng)求就有延時(shí)的可能。
另一方面,如果客戶端的連接數(shù)過多,建立過多的tcp鏈接,這些連接的維護(hù),需要有read buffer和write buffer以用來收發(fā)網(wǎng)絡(luò)包,所以也會(huì)產(chǎn)生開銷。每個(gè)連接占用的內(nèi)存大小約為2MB左右。
如何限制MongoDB對(duì)內(nèi)存的使用?
最近在線上發(fā)現(xiàn)了一些有意思的現(xiàn)象,比如某一臺(tái)服務(wù)器上部署了MySQL和MongoDB的服務(wù),然后內(nèi)存報(bào)警,說是內(nèi)存已經(jīng)使用了超過85%了,這個(gè)時(shí)候,通常我們會(huì)想到遷移服務(wù)。將MySQL或者M(jìn)ongoDB的服務(wù)切換到其他的機(jī)器上,這樣,服務(wù)器的內(nèi)存就可以節(jié)省下來。
但是實(shí)際的現(xiàn)象就是,如果我們遷移了MySQL的服務(wù)之后,服務(wù)器的內(nèi)存臨時(shí)會(huì)降下來,但是一段時(shí)間過后,又會(huì)報(bào)警,因?yàn)镸ongoDB已經(jīng)將MySQL騰出來的內(nèi)存空間也占用完了。
我們知道,在MySQL中,占用內(nèi)存比較多的就是innodb_buffer_pool,還有一堆其他的buffer,除此之外,連接數(shù)也是一個(gè)需要考慮的因素。
在MongoDB中,如果我們不限制MongoDB的內(nèi)存使用,那么MongoDB就會(huì)盡可能的占用更多的內(nèi)存來提高讀寫性能。具體的策略如下:
從MongoDB3.4開始, WiredTiger存儲(chǔ)引擎默認(rèn)的cache size是下面2個(gè)值中較大的一個(gè)。
公式一:0.5*(物理內(nèi)存-1GB)
公式二:256MB
例如,物理內(nèi)存4G,則cache size=1.5GB,如果物理內(nèi)存1.5G,則cache size=0.5*(1.5-1)=250MB < 256MB ,所以取值為256MB
MongoDB中可以通過配置文件的內(nèi)容限定MongoDB所使用的內(nèi)存,關(guān)鍵參數(shù)如下:
storage: wiredTiger: engineConfig: cacheSizeGB: <number> # 單位是GB,浮點(diǎn)型 journalCompressor: <string> directoryForIndexes: <boolean> maxCacheOverflowFileSizeGB: <number> collectionConfig: blockCompressor: <string> indexConfig: prefixCompression: <boolean>
上面的參數(shù),一般情況下,單機(jī)單實(shí)例,建議配置在內(nèi)存的60%左右。
cacheSizeGB參數(shù)配置的注意事項(xiàng)
幾點(diǎn)建議:
1、不要增加WiredTiger的內(nèi)部cache size超過默認(rèn)值
2、WiredTiger存儲(chǔ)引擎使用WiredTiger內(nèi)部緩存和文件系統(tǒng)緩存
3、WiredTiger會(huì)自動(dòng)使用所有剩余的文件系統(tǒng)緩存
4、單機(jī)多實(shí)例請(qǐng)務(wù)必減少mongod的內(nèi)存分配值
如何查看內(nèi)存使用情況?
db.hostInfo()
這個(gè)命令可以查看MongoDB的內(nèi)存限制情況,查看結(jié)果如下:
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 內(nèi)存管理相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于MongoDB 內(nèi)存管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決MongoDB6.0報(bào)錯(cuò):"mongo"不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件
這篇文章主要給大家介紹了關(guān)于解決MongoDB6.0報(bào)錯(cuò):"mongo"不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05MongoDB數(shù)據(jù)庫forEach循環(huán)遍歷用法
這篇文章主要介紹了MongoDB數(shù)據(jù)庫forEach循環(huán)遍歷用法,需要的朋友可以參考下2014-07-07關(guān)于Mongodb參數(shù)說明與常見錯(cuò)誤處理的總結(jié)
這篇文章主要給大家介紹了關(guān)于Mongodb參數(shù)說明與常見錯(cuò)誤處理的相關(guān)資料,文中通過一步步的步驟介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-07-07MongoDB整庫備份與還原以及單個(gè)collection備份、恢復(fù)方法
mongodb數(shù)據(jù)庫維護(hù)離不開必要的備份、恢復(fù)操作,而且一般不會(huì)出錯(cuò),所以我們?cè)谑褂玫臅r(shí)候大部分時(shí)候使用備份和恢復(fù)操作就可以了2013-08-08MongoDB在Windows平臺(tái)的安裝及配置方法
這篇文章主要介紹了MongoDB在Windows平臺(tái)的安裝及配置方法,簡(jiǎn)單分析了MongoDB的下載、設(shè)置方法、操作命令等具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04mongodb 數(shù)據(jù)庫操作詳解--創(chuàng)建,切換,刪除
mongodb是nosql里面最像關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫。單表操作,基本上可以和關(guān)系型數(shù)據(jù)庫差不多。mongodb比較易學(xué),易用,分幾期記錄一下,學(xué)習(xí)和使用mongodb過程。2014-07-07MongoDB的基礎(chǔ)查詢和索引操作方法總結(jié)
MongoDB使用JavaScript作為shell腳本,可以代替關(guān)系型數(shù)據(jù)庫中的SQL語句完成查詢操作,包括索引下的查詢操作,這里我們就來整理MongoDB的基礎(chǔ)查詢和索引操作方法總結(jié):2016-07-07