MongoDB のマッピングされていない仮想メモリの使用率が非常に高いことがわかります。大量の仮想メモリが表示されtop
、pmap
そのほとんどがファイルに割り当てられていないことがわかります。さらにMMS
、マップされていない大量の仮想メモリを表示することで、これを確認します。
グラフのMMS
説明には、マップされていない仮想メモリについて次のように記載されています。
この数値が非常に高い (数ギガバイト) 場合は、ファイルのメモリ マッピング以外の側面で過剰なメモリが使用されていることを示しています。マップされていないメモリが大量に使用される最も一般的なケースは、データベースへの接続が非常に多い場合です。各接続にはスレッド スタックがあり、それらのスタックのメモリは合計するとかなりの量になる可能性があります。ここで使用されるメモリはキャッシュに使用できないため、この統計を適度に低く保つことが重要です。
だから今、私はここに表示されている金額が不当であるかどうか、それが実際に問題なのか、それとも問題ないのか疑問に思っています. 金額は画像でも分かりますが、念のため本文でも説明します。
私のデータベースサイズは約12.5GBです。常駐メモリの使用量は 11GB、マップは 18GB、仮想はなんと 118GB です。データベースへの接続数は約 50 (40 から 60 の間を移動) であるため、それが原因ではないようです。
pmap
出力に次のようなエントリが多数表示されることに注意してください。
0000013f9dfff000 521296K ----- [ anon ]
000001439e400000 1024K ----- [ anon ]
000001439e500000 1024K rw--- [ anon ]
000001439e600000 2048K ----- [ anon ]
000001537ce33000 820K ----- [ anon ]
000001537cf00000 20K rw--- [ anon ]
000001537cf05000 4K ----- [ anon ]
000001537cf06000 996K rwx-- [ anon ]
000001537cfff000 4K ----- [ anon ]
000001537d000000 20K rw--- [ anon ]
000001537d005000 4K ----- [ anon ]
000001537d006000 996K rwx-- [ anon ]
特に最初の約 .5GB のエントリは過剰に思えます。grepによると、159回、非常に頻繁に戻ってくることがわかります。それで、私が見ている金額のほとんどを説明できます。ただし、これらのエントリがどこから来ているのかはわかりません。
CentOS 6.4 (64 ビット) で MongoDB v2.4.1 を使用しています。