VM上で実行されているmongod
インスタンスがあり、使用可能なすべてのメモリを使用しているわけではないようです。これは通常よりも大幅にページ障害が発生しており、システムのパフォーマンスは最近大幅に低下しています。
具体的には、htop
mongod
の場合、次のように表示されます。
VMには約60GBのメモリがあり、現在、約4.6 GBが「使用」されており、残りはバッファまたはキャッシュにあります。
私の理解では、mongod
mmap
sはデータベースファイルです。 (これがVIRT
が巨大な理由です。)ただし、RES
がディスクからデータを必要とするためmongod
の数値が60GBに近くない理由は明確ではありません。 、このデータはプロセスRSSに取り込む必要がありますね。 Mongoは、ページに障害があると報告しているため、RSSは時間の経過とともに大きくなると考えられます。私たちのものは安定しています。
このマシンで実行されている重要なものは他にありません。 (これはデータベースサーバーです。)残りのバッファーとキャッシュを消費しているのは何ですか。具体的には、RES
のサイズがmongod
のサイズを拡張して使用可能なRAMを埋めないのはなぜですか?
これは長くて複雑なプロセスになる可能性がありますが、最初にこれを出発点として言いましょう。私(および私が一緒に仕事をした他の多くの人)は、常駐メモリの最大使用量にはるかに近づくことができました。その最大値が正確に何であるかはシステムごとに異なり、関係する多くの変数がありますが、私は通常60〜80%で撮影しますが、それより高いものはボーナスです。
次にやるべきことは、読書です。このトピックについては、多くの場合、他の観点から多くのことが書かれています(メモリ効率の向上、RAMがいっぱいになったときなど)にさらに適合します)。例:
これらすべてが邪魔にならないので、システムを調整して使用可能なメモリを最大限に活用する方法について適切なアイデアが得られることを願っています(通常、常にではありませんが、先読みをノックダウンして、 NUMAが無効になっている 正常に)、メモリ不足がどこから来ているのかを確認できます。次に理解する必要があるのは少しトリッキーで、MongoDBジャーナルがどのように機能するか、そしてそれがカーネルが個々のプロセスのメモリ使用量を追跡する方法とどのように相互作用するかを含みます。
これは、MongoDB Jiraの長い問題の一部として詳細に説明されています- SERVER-9415 。その問題を調査したときに発見したのは、読み取りと書き込みを組み合わせて実行するときのジャーナルの動作により、MongoDBプロセスで報告された常駐メモリが大幅に減少する可能性があることです(常にではありませんが、再現可能でした)。このメカニズムは Kristina Chodorow here によって詳細に説明されており、Jiraの問題にも詳細があります。
それで、それはどういう意味ですか?
これは、常駐メモリ統計のレポートと解釈が複雑であることを意味します。特に、書き込みも行っているシステムでは、特にそのシステムにmongod
プロセス外のメモリプレッシャーがある場合はそうです。一般的に、私は次の方法論をお勧めします。
通常、テスト中に MMS Monitoring (free)を実行することをお勧めします。これにより、メモリ統計、マップされていないメモリ、ページフォールトなど、および mongostat
(1分未満の解像度の場合)何が起こっているのかを適切に把握します。