Mongodb
即使所有數據都駐留在 RAM 中,MongoDB 也會出現頁面錯誤
我製作了一個範例應用程序來模擬我的真實應用程序。它只是一遍又一遍地遍歷特定集合的所有文件。
我啟動
mongo
(作為 Windows 服務)並mongostat
顯示幾乎沒有常駐記憶體。insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time *0 *0 *0 *0 0 1|0 0 6.03g 6.12g 71m 0 local:0.0% 0 0|0 0|0 62b 3k 3 09:35:11
我在我擁有的單個集合(大約大小)上使用
touch
命令並顯示:2GB``mongostat
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time *0 *0 *0 *0 0 5|0 0 6.03g 6.12g 2.1g 427937 HamsterSchool:0.0% 0 0|0 0|0 408b 4k 3 09:39:59 *0 *0 *0 *0 0 1|0 0 6.03g 6.12g 2.1g 0 local:0.0% 0 0|0 0|0 62b 3k 3 09:40:00
看起來好像整個集合現在都駐留在記憶體中,但是當我執行範例應用程序時,無論多長時間,總會出現很多頁面錯誤:
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time *0 68 *0 *0 0 1|0 0 6.03g 6.12g 2.1g 35616 HamsterSchool:0.0% 0 0|0 1|0 6k 74m 4 09:43:15 *0 68 *0 *0 0 4|0 0 6.03g 6.12g 2.1g 36068 HamsterSchool:0.0% 0 0|0 0|0 6k 75m 5 09:43:16
那麼,如果一切都已經“觸及”,為什麼還會有任何頁面錯誤?重要的是要注意 mongo 在
32GB
RAM64bit
windows 機器上執行,並且27GB
RAM 始終是免費的。
Windows 上 MongoDB 的頁面錯誤度量本質上包含硬(實際上是命中磁碟)和軟(重新分配記憶體中的指針)頁面錯誤。如果您在 Linux 上執行相同的實驗,頁面錯誤指標僅報告硬頁面錯誤,您將看到您期望的行為。
這是 Windows 版本的一個已知問題,跟踪/投票的相關問題是SERVER-5799