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


11

次の構成があります。

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

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

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

  1. MongoDBのRAM使用量を制限する:明らかにほとんどのRAMがWiredTigerキャッシュによって使い果たされています
  2. MongoDBのメモリ制限:ここで明らかに問題はログデータでした
  3. MongoDBのRAMメモリ使用量を制限します。ここでは、mongoのメモリを制限して、キャッシュ/ログ/データに使用するメモリ量を少なくすることを推奨しています。
  4. MongoDBが使用するメモリが多すぎる:ここでは、より高速なアクセスを提供するために可能な限り多くのRAMを使用する傾向があるのは、WiredTigerキャッシングシステムであると彼らは言います。彼らはまた述べています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スペースでも機能し、ほとんどのものをディスクからフェッチすることができました。しかし、私は--memoryand を使用して--memory-swap、mongo Dockerコンテナーのメモリを(たとえば8GBに)制限しましたが、mongoはメモリを使い果たすとすぐにクラッシュしました。

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


それはOOMキラーと呼ばれています。MongoDBは、一般的なハードウェアで実行するように設計されています。人為的に限られたリソースでは実行しません。小さなデータベースしかない場合、MongoDBは理想的な選択肢ではありません。大規模なデータベース(3百万から数十億のエントリ)がある場合、リソースを制限することは悪い選択です。あなたの問題に従って:あなたはケーキを持ってそれを食べることができません。選ぶ。
Markus W Mahlberg 2017

正しく構成されていれば、MongoDBはメモリ不足時にクラッシュしません。使用しているMongoDBサーバーとO / Sの特定のバージョンを確認し、クラッシュの詳細を説明できますか?たとえば、MongoDBログにメッセージがあるかdmesg、予期しないシャットダウンに関連していますか?Dockerで最も可能性が高いのは、コンテナー内のプロセスが、コンテナーの制限ではなく使用可能なRAM全体を検出することです。
Stennie

あたりとしてMongoDBの生産注:あなたが実行した場合mongod、コンテナ(でlxccgroupsん、ドッカーなど)ではないシステムで利用可能なRAMの全てへのアクセスを持って、あなたが設定しなければなりませんstorage.wiredTiger.engineConfig.cacheSizeGB少ないRAM利用可能で量よりも値にコンテナ。正確な量は、コンテナーで実行されている他のプロセスによって異なりますが、通常は、RAMの50%から1GBを引いたデフォルト値を超えることはできません。
Stennie

回答:


9

BOL MongoDBのあたりとしてここ バージョン3.4で変更:値はからの範囲であることができる256MB10TBしてもすることができますfloat。また、デフォルト値も変更されています。

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

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

ではWiredTiger、MongoDBは両方利用WiredTiger internal cachefilesystem cache

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

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

RAMの追加の消費者に対応するには、WiredTiger内部キャッシュサイズを減らす必要がある場合があります。

さらに参考になるWiredTigerストレージエンジン構成ファイルのオプション


4

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

はい、あなたはmonngodb設定パラメータを使用して問題解決しようとすることができcacheSizeGBを、しかし、コンテナ環境では、それが使用することをお勧めしてcgroupをあなたの3つのコンテナのいずれかを得ることをリソースを制限します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.