1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDBのメモリ管理関連まとめ

2022-01-19 10:45:57

MongoDBのメモリはどこで使われているのか?

   MongoDBでは、さまざまな依存ライブラリのメモリへのロード、クライアントからのリクエストの管理、メタデータ管理のストレージなど、すべてメモリを必要としますが、実際にメモリを使うのは、ストレージエンジンとクライアントからの接続リクエストの処理が大半を占めます。

   一方はストレージエンジンのキャッシュで、通常はパラメータ cacheSizeGB (後述) を使ってメモリ使用量を制御しますが、このメモリ使用量を超えると、MongoDBのストレージエンジンはメモリ上のデータページをいくつか削除します。

   通常稼働しているMongoDBインスタンスの場合、メモリ使用量はcacheSizeGBパラメータ値の約80%です。80%を超えると、メモリ消去ストラテジーが期限切れのデータページを消去し始めるからです。使用率が高すぎる場合は、現在のインスタンスにメモリ削減の圧力がかかっていることを意味することがほとんどです。その場合、リクエストは遅延する可能性があります。

   一方、クライアントが多くの接続を持ち、多くのtcpリンクを確立した場合、これらの接続の維持にはネットワークパケットの送受信のためのリードバッファとライトバッファが必要となり、これもオーバーヘッドとなる。1コネクションあたりのメモリサイズは2MB程度です。

MongoDBのメモリ使用量を制限するにはどうしたらいいですか?

   最近、ネットで面白い現象を発見しました。例えば、MySQLとMongoDBのサービスを展開したサーバーで、メモリアラームが85%以上使用されたと言う、この時、普通はサービスを移行することを考えます。MySQLやMongoDBのサービスを別のマシンに切り替えて、サーバーのメモリを節約できるようにする。

    しかし、実際に起こることは、MySQLのサービスを移行すると、サーバーのメモリは一時的に低下しますが、しばらくすると、MySQLによって解放されたメモリスペースをMongoDBもすべて使ってしまったため、再びアラームが鳴るようになるのです。

    MySQLで、より多くのメモリを消費するのは、innodb_buffer_poolと、その他のバッファの束であり、それに加えて、接続数も考慮すべき要素であることが分かっています。

     MongoDBでは、MongoDBのメモリ使用量を制限しないと、MongoDBができるだけ多くのメモリを占有して、読み込みと書き込みのパフォーマンスを向上させることになります。具体的な戦略は次のとおりです。

    MongoDB 3.4から、WiredTigerストレージエンジンのデフォルトキャッシュサイズは、以下の2つの値のうち大きい方になりました。

式1:0.5*(物理メモリ-1GB)

計算式2:256MB

     たとえば、物理メモリ4G、その後キャッシュサイズ= 1.5GB、もし物理メモリ1.5G、その後キャッシュサイズ= 0.5 * (1.5-1) = 250MB < 256MBので、256MBの値です。

     MongoDBが使用するメモリは、MongoDBの設定ファイルの内容によって制限することができ、主なパラメータは次のとおりです。

storage:
 wiredTiger:
  engineConfig:
   cacheSizeGB: <number> # Unit is GB, floating point
   journalCompressor: <string>
   directoryForIndexes: <boolean>
   maxCacheOverflowFileSizeGB: <number>
  collectionConfig:
   blockCompressor: <string>
  indexConfig:
   prefixCompression: <boolean>

    上記のパラメータは、一般的に、1台のマシンでシングルインスタンスを使用する場合、メモリの60%程度に設定することが推奨されています。

cacheSizeGB パラメータの設定に関する注意事項

いくつかの提案をします。

1. WiredTigerの内部キャッシュサイズをデフォルト値より大きくしないこと

2、WiredTigerのストレージエンジンは、WiredTigerの内部キャッシュとファイルシステムのキャッシュを使用する

3. WiredTigerは自動的に残りのすべてのファイルシステムキャッシュを使用する

4. 1台のマシンで複数のインスタンスを使用する場合は、必ずmongodのメモリ割り当て値を小さくしてください。

メモリ使用量を確認するには?

db.hostInfo()

このコマンドは、MongoDBのメモリ制限を表示することができ、以下のように表示されます。

SECONDARY> db.hostInfo()
{
  "system" : {
    "currentTime" : ISODate("2020-12-31T03:51:28.278Z"),
    "hostname" : "localhost.localdomain:24204",
    "cpuAddrSize" : 64,
    "memSizeMB" : 64393,
    "numCores" : 8,
    "cpuArch" : "x86_64",
    "numaEnabled" : false
  },

以上、MongoDBのメモリ管理についてまとめてみました。MongoDBのメモリ管理については、BinaryDevelopの他の関連記事にもご注目ください!