6

MongoDB がクエリ結果を長時間 RAM に保持するようにしたい (メモリが利用可能な場合は 30 分など)。出来ますか?または、後続のクエリの前に、データが RAM に事前にロードされていることを確認する方法はありますか。

実際、MongoDB による単純なクエリ結果のパフォーマンスについて疑問に思っています。10GB RAM の専用サーバーがあり、db.stats() は次のとおりです。

db.stats();
{
    "db": "test",
    "collections":16,
    "objects":625690,
    "avgObjSize":68.90,
    "dataSize":43061996,
    "storageSize":1121402888,
    "numExtents":74,
    "indexes":25,
    "indexSize":28207200,
    "fileSize":469762048,
    "nsSizeMB":16,
    "ok":1
}

ここで、Web サービスから単一のドキュメント (ここで説明したように) をクエリすると、1.3 秒で読み込まれます。同じクエリの後続の呼び出しは 400 ミリ秒で応答を返し、数秒後に再び 1.3 秒かかり始めます。RAM にマップされたデータを要求するクエリが他にないため、MongoDB はメモリから以前にクエリされたドキュメントを失ったようです。

これについて説明し、その後のクエリの応答を速くする方法を教えてください。

4

1 に答える 1

8

最初のクエリで観察されたパフォーマンスの問題は、次の問題のいずれかである可能性があります (大まかな順序で)。

1) アプリケーション/Web サービスには、最初の要求で初期化するためのオーバーヘッドがあります (つまり、メモリの割り当て、接続プールの設定、DNS の解決など)。

2) リクエストしたインデックスまたはデータはまだメモリにないため、ロードする必要があります。

3)クエリ オプティマイザーは、クエリ パターンのプラン実行を比較しているため、最初の要求で実行するのに少し時間がかかる場合があります。

シェルを介してクエリをテストし、オーバーヘッドが MongoDB または Web サービスに関連しているかどうかを分離することは非常に役立ちますmongo(両方のタイミングをとるのではなく)。

以下は、MongoDB に関する注意事項です。

キャッシング

MongoDB には、メモリ内のドキュメントの「キャッシュ」時間がありません。ディスク I/O にメモリ マップ ファイルを使用し、メモリ内のドキュメントは、アクティブなクエリ (最近読み込んだドキュメント/インデックス) と使用可能なメモリに基づいています。オペレーティング システムの仮想メモリ マネージャは、キャッシングを担当し、通常、Least-Recently Used (LRU) アルゴリズムに従って、メモリからスワップ アウトするページを決定します。

メモリ使用量

予想される動作は、時間の経過とともに MongoDB が成長し、すべての空きメモリを使用してアクティブな作業データ セットを格納することです。

提供された数値を見ると(そしてそれが唯一db.stats()のデータベースであると仮定して)、データベースのサイズは現在約1Gbであるように見えるため、次の場合を除き、すべてを合計RAM 10Gb以内に保つことができるはずです。

  • メモリをめぐって競合する他のプロセスがあります
  • サーバーを再起動しましたがmongod、それらのドキュメント/インデックスはまだリクエストされていません

MongoDB 2.2 にはtouch、サーバーの再起動後にインデックスまたはドキュメントをメモリにロードするために使用できる新しいコマンドがあります。これは、最初の起動時にサーバーを「ウォームアップ」するためにのみ使用する必要があります。そうしないと、実際の「アクティブな」データをメモリから追い出すのに役に立たない可能性があります。

たとえば、Linux システムでは、次のtopコマンドを使用すると、次のように表示されます。

  • 仮想バイト/VSIZE は、データベース全体のサイズになる傾向があります
  • サーバーで他のプロセスが実行されていない場合、常駐バイト/RSIZE がマシンの合計メモリになります (これにはファイル システム キャッシュの内容が含まれます)。
  • mongodスワップを使用しないでください (ファイルがメモリマップされているため)

このmongostatツールを使用すると、mongodアクティビティをすばやく確認できます。さらに便利なことに、MMSなどのサービスを使用して、メトリックを経時的に監視することもできます。

クエリ オプティマイザー

MongoDBクエリ オプティマイザーは、約 1,000 回の書き込み操作ごとにクエリ パターンのプラン実行を比較し、次にオプティマイザーが実行されるまで、またはexplain()そのクエリで を明示的に呼び出すまで、「勝った」クエリ プランをキャッシュします。

これは簡単にテストできるはずです。mongoシェルでクエリを実行.explain()し、ミリ秒のタイミングと、スキャンされたインデックス エントリとドキュメントの数を調べます。Explain() のタイミングは、プランを比較するコストが含まれているため、クエリの実行に実際にかかる時間ではありません。通常の実行ははるかに高速で、ログで遅いクエリを探すことができmongodます。

デフォルトでは、MongoDB は 100 ミリ秒より遅いすべてのクエリをログに記録するため、これは最適化するクエリを探す良い出発点となります。--slowmsconfig オプションまたはコマンドを使用して、slow ms 値を調整できDatabase Profilerます。

MongoDB のドキュメントをさらに読む:

于 2012-11-14T09:25:53.683 に答える