都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢? 先 ps 一下看看。 $ ps aux|grep mongodmongo 26994 9.0 20.0 797264324 13243052 ? Sl May16 117:03 /path/to/mongodb/bin/mongod 總共 760G 多的虛擬內存,但是物理內存就只有 12.6G 。這
都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢?
先 ps 一下看看。
$ ps aux|grep mongod mongo 26994 9.0 20.0 797264324 13243052 ? Sl May16 117:03 /path/to/mongodb/bin/mongod
總共 760G 多的虛擬內存,但是物理內存就只有 12.6G 。這個機器可是有 64G 內存的哦,這看起來 MongoDB 完全沒用多少內存嘛。
再看看 free 的結果。
$ free -m total used free shared buffers cached Mem: 64544 64279 265 0 134 60413 -/+ buffers/cache: 3731 60813 Swap: 31999 0 31999
內存倒是占得差不多了,基本都是 cached ,也就是文件系統緩存。MongoDB 是通過 mmap 方式讓操作系統來處理持久化和緩存的。每個數據文件都直接映射到某個虛擬內存地址。訪問的時候如果這一頁不在內存中,系統就會嘗試把這一頁加載進來。這些內存都是算進 cache 里的。在 mongodb 的官方文檔里有這樣一個說法,top 或 ps 里的 RSIZE 段顯示的是機器的全部內存大小,因為 mongodb 會盡可能占用全部內存。但是事實上,這些緩存并沒有算在里面。因此在 top 或 ps 中是看不出 MongoDB 的實際內存使用情況的。而 free 雖然可以看到系統的內存使用情況,但是沒法確定這些內存里究竟有多少真的是 MongoDB 使用的。
還好有人做了 vmtouch 這個工具。可以檢查文件在緩存中的情況,另外也可以把文件直接加載進緩存或者踢出去。只需要對 MongoDB 的所有數據文件檢查一下緩存加載情況,就可以知道 MongoDB 到底緩存了多少數據了。
$ vmtouch -m4G /path/to/mongodb/data/ Files: 256 Directories: 3 Resident Pages: 15465901/100219772 58G/382G 15.4% Elapsed: 4.072 seconds
這里 -m4G 是 vmtouch 檢查的文件大小限制。MongoDB 的數據文件比較大,通常會超過默認的 500M。這樣看來,緩存用了 58G,這還差不多。Resident Pages 左側的數字是頁的數量,頁的數量乘以文件系統頁大小才是內存使用量。頁的大小可以通過
getconf PAGESIZE
查看,通常是 4096,也就是 4KB。
MongoDB 在 NUMA 的機器上運行,并且內存被固定到一個 node 的時候,會有一個警告
WARNING: You are running on a NUMA machine. We suggest launching mongod like this to avoid performance problems: numactl –interleave=all mongod [other options]
也許是認為,這種情況下只能用上一個節點的內存。但 MongoDB 的緩存是由操作系統管理的。NUMA 似乎對此并沒有影響。而內存不太小的時候 MongoDB 本身很難用掉一個節點的內存。這種情況下,是否開啟 numactl –interleave=all 作用已經不大了。能做的也許只能是加內存,sharding,或者換 ssd 了。
原文地址:MongoDB 內存使用, 感謝原作者分享。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com