web-dev-qa-db-ja.com

MongoDBはメモリ不足になると終了します

次の設定があります。

  • 3つのdockerコンテナーを実行するホストマシン:
    • MongoDB
    • Redis
    • 前の2つのコンテナーを使用してデータを格納するプログラム

RedisとMongoDBはどちらも、大量のデータを格納するために使用されます。 RedisはすべてのデータをRAMに保持する必要があることを知っています。これで問題ありません。残念ながら、mongoは大量のRAMそして、ホストRAM=がいっぱいになると(ここでは32GBについて話している)、mongoまたはRedisがクラッシュします。

これに関する次の以前の質問を読みました。

  1. MongoDBの制限RAM使用法 :明らかにほとんどRAMは、WiredTigerキャッシュによって使用されます
  2. MongoDB制限メモリ :ここで明らかに問題はログデータでした
  3. RAM MongoDBでのメモリ使用量 を制限する:ここでは、mongoのメモリを制限して、キャッシュ/ログ/データに使用するメモリ量を少なくすることをお勧めします
  4. MongoDBが使用するメモリが多すぎる :ここでは、WiredTigerキャッシングシステムがより多くのアクセスを使用する傾向があると言いますRAMより高速なアクセスを提供します。また、it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. mongodbのメモリ使用量を制限するオプションはありますか? :再度キャッシュし、MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questionsも追加します
  6. MongoDBインデックス/ RAM関係 :引用:MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
  7. MongoDBで使用されているキャッシュを解放する方法 :5と同じ回答。

これらすべての答えから私が理解しているように見えるのは、

  1. より高速にアクセスするには、mongoがすべてのインデックスをRAMに収める方が良いでしょう。ただし、私の場合は、かなり高速なSSDを使用しているため、インデックスが部分的にディスクに常駐しているので問題ありません。
  2. RAMは主にmongoによるキャッシュに使用されます。

これを考慮して、私はmongoができる限り多くのRAMスペースを試して使用することを期待していましたが、少数のRAMスペースで機能し、ほとんどのものをフェッチすることもできますただし、--memory--memory-swapを使用して、mongo Dockerコンテナーのメモリを(たとえば8GBに)制限しましたが、mongoはメモリを使い果たすとすぐにクラッシュしました。

Mongoに使用可能なメモリのみを使用させ、メモリに収まらないものすべてをディスクからフェッチさせるにはどうすればよいですか?

11
Simone Bronzini

MongoDB BOLに従って ここバージョン3.4で変更:値は256MBから10TBの範囲で指定できますfloatにすることもできます。また、デフォルト値も変更されています。

3.4以降、WiredTiger内部キャッシュは、デフォルトで、次のいずれか大きい方を使用します。

50% of RAM minus 1 GB, or
256 MB.

WiredTigerを使用すると、MongoDBはWiredTigerinternal cachefilesystem cacheの両方を利用します。

MongoDBはfilesystem cacheを介して、WiredTiger cacheまたは他のプロセスで使用されていないすべての空きメモリを自動的に使用します。

storage.wiredTiger.engineConfig.cacheSizeGBは、WiredTiger内部キャッシュのサイズを制限します。オペレーティングシステムは、ファイルシステムキャッシュに使用可能な空きメモリを使用します。これにより、圧縮されたMongoDBデータファイルをメモリに保持できます。さらに、operating systemは、ファイルシステムブロックとファイルシステムキャッシュをバッファリングするために、任意の空きRAMを使用します。

[〜#〜] ram [〜#〜]の追加のコンシューマーに対応するには、WiredTiger内部キャッシュサイズを減らす必要がある場合があります。

詳細については、参照 WiredTiger Storage Engine および 構成ファイルオプション

9

実際、よく見ると、「メモリ不足」で死ぬのはmongodではなく、最大のメモリ使用量を持っているため、mongodを強制終了するのはカーネルOOM(メモリ不足)マネージャです。

はい、monngodb構成パラメーター cacheSizeGB で問題の解決を試みることができますが、コンテナー環境では、 cgroups を使用して3つのリソースのいずれかを制限することをお勧めしますコンテナーが取得します。

4
JJussi