私は、数百億の小さなASCII文字列の行で構成される大きなデータセットで遊んでいます。データセット内の各文字列の出現回数を数えたいのですが、文字列の一意の数は約10億だと思います。 WiredTigerストレージエンジンを使用して、レプリカセット内の3つの_32GB RAM
_マシン上のMongoDB 4.0データベース内のコレクションにそれらをアップセルしてきました。驚異的な数の_200.000.000
_行に到達するまで、問題はありません。その数の後、挿入速度が止まり始めます。一度に5000文字列のチャンクを一括でアップサートすると、一部の操作には1秒かかりますが、たまに40秒以上かかる操作もあります。レプリケーションラグも急増し始めています。
db.stats()
を調べると、唯一のインデックス__id
_がメモリの_8GB
_を占めることがわかります。ストレージサイズは約_6GB
_です。ワイヤードタイガーのキャッシュサイズのデフォルトはRAMの半分なので、約_15GB
_です。これらすべてを合計すると、ほぼ_29GB
_になります。 oplogにも数GBが必要だと思います。
RAMが不足していますか?ショットでデータセット全体をロードできると期待していました。ほとんどの場合、データは永続的であるため、3つのメンバーのレプリカセットを3つのシャードに変換します。ワイヤードタイガーのキャッシュサイズパラメーターを減らしますが、RAM =およびドキュメントの数。
MongoDBのドキュメント ここ としてWiredTigerを使用すると、MongoDBはWiredTiger内部キャッシュとファイルシステムキャッシュの両方を利用します。
3.4以降、WiredTiger
内部キャッシュはデフォルトで、次のいずれか大きい方を使用します。
50% of (RAM - 1 GB), or
256 MB.
例、合計4GBのRAMのシステムでは、WiredTigerキャッシュは1.5GBのRAM(0.5 *(4 GB-1 GB)= 1.5 GB)。逆に、合計1.25 GBのRAMを搭載したシステムでは、合計RAMの半分から1ギガバイト(0.5 *(1.25 GB-1 GB )= 128 MB <256 MB)。
MongoDBは、ファイルシステムキャッシュを介して、WiredTigerキャッシュや他のプロセスで使用されていないすべての空きメモリを自動的に使用します。
注:storage.wiredTiger.engineConfig.cacheSizeGB
は、WiredTiger内部キャッシュのサイズを制限します。オペレーティングシステムは、ファイルシステムキャッシュに使用可能な空きメモリを使用します。これにより、圧縮されたMongoDBデータファイルをメモリに保持できます。さらに、オペレーティングシステムは空きRAMを使用して、ファイルシステムブロックとファイルシステムキャッシュをバッファリングします。
RAMの追加消費者に対応するには、WiredTigerの内部キャッシュサイズを減らす必要がある場合があります。
デフォルトのWiredTiger内部キャッシュサイズ値は、マシンごとに単一の mongod インスタンスがあると想定しています。 1台のマシンに複数のMongoDBインスタンスが含まれている場合は、設定を減らして、他の mongod インスタンスに対応する必要があります。
Serverstatusの詳細を確認するには、次のようなコマンドを実行します。
db.runCommand( { serverStatus: 1 } )
監視アプリケーションは、このコマンドを定期的に実行して、インスタンスに関する統計を収集できます。
注:値(上記の1)は、コマンドの操作に影響を与えません。
次の例では、出力にすべてのrepl情報が含まれています。
db.runCommand( { serverStatus: 1, repl: 1 } )
出力フィールドは、MongoDBのバージョン、基盤となるオペレーティングシステムプラットフォーム、ストレージエンジン、ノードの種類( mongos 、 mongod または replica)など)によって異なりますset メンバー。
MongoDBのバージョンに固有の serverStatus 出力については、適切なバージョンのMongoDBマニュアルを参照してください。