ポイント: 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ガイド
- MongoDB概要:MongoDBの始め方
- UbuntuとMacへのMongoDBのインストール方法
- MongoDBでのデータベースの作成
- MongoDBシェル基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBロールベースのアクセス制御(RBAC)の説明
- MongoDBプロジェクションおよびプロジェクション演算子の説明
- MongoDB集約関数の説明
- MongoDBソート:sort()メソッドと例
- MongoDBにおけるプッシュおよびプル演算子の使用
- MongoDB $unwindの使用方法
- 23の一般的なMongoDBクエリ演算子とその使用方法
- MongoDBジオロケーションクエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス:主要なインデックスタイプとその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスタの設定方法
- MongoDBシャーディング:概念、例、およびチュートリアル
- MongoDB Atlas:マネージドMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBメモリ使用量、管理、および要件
- MongoDBバックアップのためのmongodumpの使用方法
- MongoDBバックアップを復元するためのmongorestoreの例
- PyMongoの使用方法
- MongoDBとNodeJSのためのMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認定の紹介
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を表すものではありません。