Mongodb

MongoDB 沒有將我所有的系統記憶體用於工作集?

  • May 30, 2013

我的機器有 42GB RAM,總索引大小為 40GB(工作集應該 100% 填充,因為索引都在 UUID 列上)。我懷疑我的工作集太大了,因為頁面錯誤開始急劇增加,例如從 avg 20 跳到 120。

我發現似乎 mongod 並沒有使用我所有的記憶,例如

ps ax | grep mongod
23051 mongod    20   0  338g 7.7g 7.5g S 87.8 16.4   1533:17 /usr/bin/mongod -f /etc/mongod.conf                                                                                                                                           

目前只使用7.7G。

而使用 2.4 的 workingSet 估計器,我發現 50 多歲的工作集只有 650MB 左右,這從我的數據大小看來是出乎意料的。

"workingSet" : {
   "note" : "thisIsAnEstimate",
   "pagesInMemory" : 166069,
   "computationTimeMicros" : 49281,
   "overSeconds" : 50
},

你有什麼主意嗎?

首先,我建議看看這裡:

https://jira.mongodb.org/browse/SERVER-9415

該問題討論的主題大致相同。總結一下:由於日誌在 MongoDB中的工作方式以及它重新映射記憶體的方​​式,它可能會導致mongod程序的常駐記憶體看起來人為地低。如果您查看free命令的輸出並且您的文件系統記憶體相對已滿,那麼您更有可能遇到此常駐記憶體報告異常(mongod當然,假設是系統上唯一真正消耗大量記憶體的人) .

但是,MongoDB(至少在 Linux 上)只報告硬(實際)頁面錯誤,而不是當程序請求頁面時發生的軟頁面錯誤,這些頁面已經在記憶體中但只是不被請求程序“擁有”。因此,您擔心頁面錯誤的增加是正確的,這是表明您的數據目前不適合記憶體的最佳測量方法之一,因此您必須訪問磁碟。

在確認您想要的一切都在記憶體中方面,您可以使用touch 命令將您想要的索引和數據載入到文件系統記憶體(非常駐)中。應該注意的是,這是一個有點生硬的工具,因為它只會將整個數據集和/或整個索引載入到記憶體中,並且可能會導致系統載入/鎖定 - 請謹慎使用。根據您的數據集,使用查找查詢和解釋載入最近或已知的熱門數據可能會更有效。像這樣的東西:

db.collection.find({criteria for loading data}).explain()

或者,要確保載入特定索引,請添加顯式提示:

db.collection.find({criteria for loading data}).hint({index name})explain()

其他需要注意的是,當您敲擊磁碟時,您將數據載入到記憶體中的效率。一般來說,這是 IO 和記憶體使用率之間的權衡,但是如果您的首要任務是記憶體效率並且您有一些備用 IO 可以解決問題,那麼在 MongoDB 上,您通常需要使用以下命令調整預讀設置blockdev. 有關更多資訊,請參閱此處此處的其他 Serverfault 問題/答案。

引用自:https://serverfault.com/questions/511886