MongoDBメモリ使用量、管理、および要件

MongoDBメモリ使用量、管理、および要件

  • ITOps・DevOps
6分で読めます 更新日 Feb 27, 2019

ポイント: MongoDBのメモリ管理は、データオーバーロードによるサーバーのダウンを防ぐために重要です。メモリ使用量の監視と、必要に応じてノードを追加してスケールするためのガイドラインを提供します。

  • MongoDBは、高速なデータ取得のためにキャッシングを使用し、インメモリデータベースではありません。
  • 無料の監視サービスは、メモリ使用量とサーバーのパフォーマンスを追跡するのに役立ちます。

MongoDBデータベースにデータを入れすぎると、サーバーがメモリ不足になります。これが迅速に起こる場合もあり、bashシェルが応答しなくなるため、mongo dbプロセスをシャットダウンすることすらできません。この解決策は、クラスタに別のノードを追加することです。サーバーがメモリ不足になるとどうなるかを示すために、8GBのマシンにサポートできないデータを意図的に追加し、そのデータに対してクエリを実行します。その後、ログがどのように見えるか、そしてこの状況を監視するために使用できるツールを示します。215MBのデータでは、このサーバーは複数の検索を行うと常に11%のメモリを使用していました。その後、3.5GBのデータを追加したところ、92%のメモリ使用量に達したときにロックアップしました。

MongoDBがメモリ不足になったときは、別のノードを追加

MongoDBはインメモリデータベースではありません。ただし、そのように実行するように構成できます。しかし、キャッシュを多用しており、データレコードは迅速な取得のためにメモリに保持され、ディスク上ではありません。サーバーがメモリ不足になったときに何をすべきかについて、StackOverflowには多くの誤った情報があります。要するに、mongodプロセスはキャッシュが満杯になるにつれて、ますます多くのメモリを消費します。したがって、コンピュータがメモリ不足になっている場合、MongoDBに利用可能なメモリを制限すべきだと考えられています。しかし、そのような設定はありません。MongoDBは、デフォルト設定では、256MBまたは(ram - 1GB)の半分のいずれか大きい方をキャッシュサイズとして使用します。cacheSizeGB引数を/etc/mongod.conf設定ファイルに追加することで、MongoDBのキャッシュサイズを制限できますが、MongoDBは内部キャッシュとシステムのファイルシステムキャッシュの両方を使用します。したがって、1つの場所で制限を設けると、他の場所でより多くを消費することになります。したがって、それは解決策ではありません。

    storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  wiredTiger:
      engineConfig:
         cacheSizeGB: 1

MongoDBの無料監視サービス

MongoDBが提供する無料の監視サービスを利用するべきです。これは彼らのウェブサイトでホストされていますが、クラウドサービス(Atlas)を使用する必要があるわけではありません。自分のサーバーでも機能します。それを利用するには、mongoシェルを開き、このコマンドを貼り付けてください:

    db.enableFreeMonitoring()

彼らのウェブページの一部はこのように見えます。この8GBのマシンではメモリが不足しています。これによりMongoDBは使用状況統計を彼らのウェブサイトに送信し、その状態を追跡してウェブページにホストします。彼らはあなたのサイトを追跡するためのURLを提供します。それは持続的なURLであり、彼らはあなたのインストールに一意のIDを割り当てます。

メモリMongoDB使用量を表示

これらのメトリクスには、CPU使用量などが含まれます。上記では、メモリセクションのみを示しています。それは:

  • resident—プロセスによって使用される実際の物理メモリ(RAM)の量。
  • virtual—RAMに加えて、ファイルシステムキャッシュに拡張されたメモリ、すなわち仮想メモリ。
  • mapped—MongoDBはバージョン3.2以降、ファイルのメモリマッピングを行っていません。これは以前のメモリ管理モジュールMMAPv1によって使用されていました。現在はデフォルトでWiredTigerを使用しています。

ファイルシステムキャッシュを確認するには、free -k を実行して、キロバイト単位の利用可能な仮想メモリを表示します。以下は、私のサーバーがメモリ不足になったときに5分間隔でどのように見えたかです。注目すべき列はavailableです。表示された数値を1024*1024で割ると、この数値をギガバイトに変換できます。

    free -k


             total        used        free      shared  buff/cache   available
Mem:        8173744     1088440     6753392        9052      331912     6816176
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        8173744     4654600     2663432        9080      855712     3249520
Swap:             0           0           0
              total        used        free      shared  buff/cache   available
Mem:        8173744     7992568      119508        9052       61668       45682

もちろん、top -p (mongod pid)を使ってメモリを監視することもできます。VIRTとRESは仮想メモリと常駐メモリです。以下の例では、mongodがシステムのメモリの91%を使用していることがわかります。その時点でシステムは応答しなくなりました。

また、シェルでMongoDBからメモリ使用統計を取得することもできます:

    db.serverStatus().mem
{
	"bits" : 64,
	"resident" : 907,
	"virtual" : 1897,
	"supported" : true,
	"mapped" : 0,
	"mappedWithJournal" : 0
}

CまたはC++プログラミングを行ったことがある場合は、mallocに精通しているでしょう。それは、マシンのためにメモリを予約する必要があるときに呼び出すシステム関数です。MongoDBがそれを行えなくなると、/var/log/mongodb/mongod.logにこの警告が表示され始めます:

    2019-02-19T03:44:18.738+0000 I COMMAND  [ftdc] serverStatus was very slow: { after basic: 202, after asserts: 686, after backgroundFlushing: 890, after connections: 1399, after dur: 1717, after extra_info: 2039, after freeMonitoring: 3003, after globalLock: 3389, after locks: 4073, after logicalSessionRecordCache: 4782, after network: 5520, after opLatencies: 6068, after opcounters: 6477, after opcountersRepl: 6818, after repl: 7441, after security: 7799, after storageEngine: 8616, after tcmalloc: 9676, after transactions: 10081, after transportSecurity: 10412, after wiredTiger: 22733, at end: 24170 }

最終的に次のように表示されます:

    2019-02-19T03:45:17.456+0000 F -        [free_mon] out of memory.

また、mongoにログインして、以下の2つのコマンドを繰り返すことができます(出力を更新するために両方を実行する必要があります)サーバーがダウンするにつれてメモリ使用量が急増するのを観察します。

    var mem = db.serverStatus().tcmalloc;

mem.tcmalloc.formattedString

こちらが出力です。見ての通り、この8GBのマシンではすべての利用可能なメモリを使い果たしています。mongoにログインして、以下の2つのコマンドを繰り返すこともできます(出力を更新するために両方を実行する必要があります)サーバーがダウンするにつれてメモリ使用量が急増するのを観察します。

    ------------------------------------------------
MALLOC:       73048776 (   69.7 MiB) Bytes in use by application
MALLOC: +      3792896 (    3.6 MiB) Bytes in page heap freelist
MALLOC: +       508776 (    0.5 MiB) Bytes in central cache freelist
MALLOC: +       978848 (    0.9 MiB) Bytes in transfer cache freelist
MALLOC: +      1399344 (    1.3 MiB) Bytes in thread cache freelists
MALLOC: +      1335552 (    1.3 MiB) Bytes in malloc metadata
MALLOC:   ------------
MALLOC: =     81064192 (   77.3 MiB) Actual memory used (physical + swap)
MALLOC: +            0 (    0.0 MiB) Bytes released to OS (aka unmapped)
MALLOC:   ------------
MALLOC: =     81064192 (   77.3 MiB) Virtual address space used
MALLOC:
MALLOC:            816              Spans in use
MALLOC:             21              Thread heaps in use
MALLOC:           4096              Tcmalloc page size
------------------------------------------------

MongoDBガイド

  1. MongoDB概要:MongoDBの始め方
  2. UbuntuとMacへのMongoDBのインストール方法
  3. MongoDBでのデータベースの作成
  4. MongoDBシェル基本コマンド
  5. MongoDB Compass:Mongo GUIの使用
  6. MongoDBロールベースのアクセス制御(RBAC)の説明
  7. MongoDBプロジェクションおよびプロジェクション演算子の説明
  8. MongoDB集約関数の説明
  9. MongoDBソート:sort()メソッドと例
  10. MongoDBにおけるプッシュおよびプル演算子の使用
  11. MongoDB $unwindの使用方法
  12. 23の一般的なMongoDBクエリ演算子とその使用方法
  13. MongoDBジオロケーションクエリの例
  14. MongoDBトランザクションの紹介
  15. MongoDBインデックス:主要なインデックスタイプとその管理方法
  16. 知っておくべき主要なMongoDBコマンド
  17. MongoDBレプリケーション:完全な紹介
  18. MongoDBクラスタの設定方法
  19. MongoDBシャーディング:概念、例、およびチュートリアル
  20. MongoDB Atlas:マネージドMongoDBの設定と使用
  21. MongoDBをDockerコンテナとして実行する方法
  22. MongoDBメモリ使用量、管理、および要件
  23. MongoDBバックアップのためのmongodumpの使用方法
  24. MongoDBバックアップを復元するためのmongorestoreの例
  25. PyMongoの使用方法
  26. MongoDBとNodeJSのためのMongooseの使用方法
  27. MongoDBチートシート
  28. MongoDB対Cassandra:NoSQLデータベースの比較
  29. PostgreSQL対MongoDB:データベースの比較
  30. MySQL対MongoDB:データベースの比較
  31. MongoDB認定の紹介

これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

ITOps・DevOpsの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。