MongoDB:RAM要件


20

インデックス全体をメモリ/ RAMに格納するだけで十分ですか、またはmongodbは、高速読み取り用のデータさえ格納するためにできるだけ多くのRAMを割り当てようとしますか?

mongodb +他のアプリケーションを実行したいのですが、「max_memory_allocated_or_reserved = 8GB」と言えば、mongodbがRAMの範囲を定義できない唯一のアプリケーションのようです。

そうする方法がない場合、私はom-killerに、mongodは「悪い」プロセスであり、私の意見ではベストプラクティスではないことを説明する必要があります。

回答:


18

求められたとおりにできない(メモリを制限する)ことができない本当の理由は、MongoDBが直接使用するメモリを管理しないためです。OSに実行させることができます。MongoDBは、すべてのデータをメモリマップし、必要に応じてOSページにメモリを出し入れします。その結果、MongoDBがこれを完全に異なる方法で実装するか、OSが許可するまで、使用量を直接管理することはできません(Linuxでは2.4日以降不可能です)。

現在、リソースを本当に分離する唯一の方法は、仮想化ソリューションを使用して、MongoDBを独自のVMで分離することです。はい、オーバーヘッドが伴います(ハイパーバイザーはかなり良くなっていますが)が、現時点ではそのレベルのリソース制御に対して支払うべき価格です。

OOM Killerに関しては、ホスト上に他のプロセスがなくても、データセットとインデックス全体が使用可能なメモリを超えている限り、MongoDBはOOM Killerの問題を引き起こす可能性があります。これは、データがメモリからページアウトされる方法のためです-メモリのプレッシャーがなく(常駐メモリを必要とするものが他にない場合)、新しいデータとインデックスを追加/タッチし続けると、最終的に利用可能なすべてのRAMを消費します。したがって、MongoDBを実行するときは常にいくつかのスワップを構成することをお勧めします。

https://docs.mongodb.com/manual/administration/production-notes/#swap

もちろん、LRUデータは最初にページアウトされ、他のプロセスもres memを使用できますが、データセットをメモリにロードしてから静的にしない限り、この概念は適用されます。あなたが心配している場合に行うべき最善のことは、MMSにそれを入れて、時間の経過とともに使用状況を追跡することです:

http://mms.mongodb.com

更新:2015年8月

私がこの答えを書いて以来、物事はいくらか進んでおり、情報は少し古くなっています。たとえば、Linuxには現在、cgroupと関連テクノロジー(たとえばDockerコンテナー)があり、実稼働環境のプロセスで消費されるリソース(メモリーを含む)をより適切に分離および制限できるようになっています。 MongoDBのようなメモリマッピング。

さらに、MongoDB 3.0+のWiredTigerのようなMMAPを超える新しいストレージエンジンの出現により、組み込み機能を使用してMongoDBのキャッシュサイズ制限できます。したがって、現在のRAM要件は、MongoDBの構成方法、実行する環境、および選択するストレージエンジンによって実際に異なります。


WiredTigerに関する: " storage.wiredTiger.engineConfig.cacheSizeGBは、mongodが使用するメモリの総量ではなく、WiredTigerキャッシュのサイズのみを制限します。WiredTigerキャッシュは、MongoDBが使用するRAMの1つのコンポーネントにすぎません。ファイルシステムキャッシュを経由して、マシンの空きメモリ...
ステファン・Rogin

正しいが、ディスクからデータをページングするアプリケーションでも同じことが言えます。FSキャッシュは、MMAPストレージエンジンのメモリマップファイルの場合のように、データの主なキャッシュ方法ではなくなりました
Adam C

6

MongoDBは、使用可能な空きメモリをキャッシュに使用し、必要に応じてディスクにスワップして、同じサーバー上の他のアプリケーションにメモリを割り当てます。最高のパフォーマンスを得るには、インデックスと頻繁に使用するデータ(「ワーキングセット」)をメモリに保持するのに十分なRAMが必要です。

参考文献:


3

MongoDBについては、年々何かが変更されます。

TL; DR

MMAPv1ストレージエンジンをMongoDBで使用する場合、working setサイズはRAMに収まる必要がありますhttps://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

WiredTigerストレージエンジンがMongoDBで使用されている場合、RAMが適切working setかどうかを気にする必要はありませんhttps://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

WiredTigerストレージエンジンのメモリ診断

ワーキングセットのサイズはRAMに適合しなければなりませんか?

いや

アプリケーションに必要なRAMの量を計算するにはどうすればよいですか?

WiredTigerでは、MongoDBはWiredTiger内部キャッシュとファイルシステムキャッシュの両方を利用します。

バージョン3.2で変更:MongoDB 3.2以降、WiredTigerの内部キャッシュは、デフォルトで次のいずれか大きい方を使用します。

RAMの60%から1 GB、つまり1 GB。


この答えはあまり役に立たず、非常に正確でもありません。
フィリップシフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.