次の構成があります。
- 3つのDockerコンテナーを実行するホストマシン:
- MongoDB
- Redis
- 前の2つのコンテナーを使用してデータを格納するプログラム
RedisとMongoDBはどちらも、大量のデータを格納するために使用されます。RedisがすべてのデータをRAMに保持する必要があることはわかっています。これで問題ありません。残念ながら、mongoは大量のRAMを消費し始め、ホストRAMがいっぱいになると(ここでは32GBについて話している)、mongoまたはRedisがクラッシュします。
これに関する次の以前の質問を読みました。
- MongoDBのRAM使用量を制限する:明らかにほとんどのRAMがWiredTigerキャッシュによって使い果たされています
- MongoDBのメモリ制限:ここで明らかに問題はログデータでした
- MongoDBのRAMメモリ使用量を制限します。ここでは、mongoのメモリを制限して、キャッシュ/ログ/データに使用するメモリ量を少なくすることを推奨しています。
- MongoDBが使用するメモリが多すぎる:ここでは、より高速なアクセスを提供するために可能な限り多くのRAMを使用する傾向があるのは、WiredTigerキャッシングシステムであると彼らは言います。彼らはまた述べています
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- 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
- 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.
- MongoDBで使用されているキャッシュを解放する方法 :5と同じ答え。
これらすべての答えから私が理解しているように見えるのは、
- より高速にアクセスするには、mongoがすべてのインデックスをRAMに収める方が良いでしょう。ただし、私の場合、SSDが非常に高速であるため、インデックスが部分的にディスク上に存在するので問題ありません。
- RAMは主にmongoによるキャッシュに使用されます。
これを考慮して、私はmongoができるだけ多くのRAMスペースを試して使用することを期待していましたが、少ないRAMスペースでも機能し、ほとんどのものをディスクからフェッチすることができました。しかし、私は--memory
and を使用して--memory-swap
、mongo Dockerコンテナーのメモリを(たとえば8GBに)制限しましたが、mongoはメモリを使い果たすとすぐにクラッシュしました。
mongoに使用可能なメモリのみを使用させ、メモリに収まらないものすべてをディスクからフェッチさせるにはどうすればよいですか?
dmesg
、予期しないシャットダウンに関連していますか?Dockerで最も可能性が高いのは、コンテナー内のプロセスが、コンテナーの制限ではなく使用可能なRAM全体を検出することです。
mongod
、コンテナ(でlxc
、cgroups
ん、ドッカーなど)ではないシステムで利用可能なRAMの全てへのアクセスを持って、あなたが設定しなければなりませんstorage.wiredTiger.engineConfig.cacheSizeGB
少ないRAM利用可能で量よりも値にコンテナ。正確な量は、コンテナーで実行されている他のプロセスによって異なりますが、通常は、RAMの50%から1GBを引いたデフォルト値を超えることはできません。