最初のクエリで観察されたパフォーマンスの問題は、次の問題のいずれかである可能性があります(大まかな順序で):
1)アプリケーション/ Webサービスには、最初のリクエストで初期化するオーバーヘッドがあります(つまり、メモリの割り当て、接続プールの設定、DNSの解決など)。
2)リクエストしたインデックスまたはデータはまだメモリにないため、ロードする必要があります。
3)クエリオプティマイザー クエリパターンのプランの実行を比較しているため、最初のリクエストで実行するのに少し時間がかかる場合があります。
mongo
を介してクエリをテストすると非常に役立ちます シェルを作成し、オーバーヘッドがMongoDBとWebサービスのどちらに関連しているかを分離します(これまでのように両方のタイミングを調整するのではありません)。
以下は、MongoDBに関連するいくつかの注意事項です。
キャッシング
MongoDBには、メモリ内のドキュメントの「キャッシュ」時間がありません。ディスクI/Oにメモリマップトファイルを使用し、メモリ内のドキュメントは、アクティブなクエリ(最近ロードしたドキュメント/インデックス)と使用可能なメモリに基づいています。オペレーティングシステムの仮想メモリマネージャーは、キャッシュ を担当します。 、通常は、Least-Recently Used(LRU)アルゴリズムに従って、メモリからスワップアウトするページを決定します。
メモリ使用量
予想される動作は、時間の経過とともにMongoDBが成長し、すべての空きメモリを使用してアクティブな作業データセットを保存することです。
提供されたdb.stats()
を見る 数字(そしてそれがあなたののみであると仮定して データベース)、データベースのサイズは現在約1Gbのようです。したがって、次の場合を除いて、すべてを10Gbの合計RAM内に保持できるはずです。
- メモリをめぐって競合する他のプロセスがあります
-
mongod
を再起動しました サーバーとそれらのドキュメント/インデックスはまだリクエストされていません
MongoDB 2.2には、新しい touch
があります。
サーバーの再起動後にインデックスまたはドキュメントをメモリにロードするために使用できるコマンド。これは、サーバーを「ウォームアップ」するために最初の起動時にのみ使用する必要があります。そうしないと、実際の「アクティブな」データをメモリから強制的に強制的に削除する可能性があります。
たとえば、Linuxシステムでは、top
を使用できます。 コマンドを実行すると、次のように表示されます。
- 仮想バイト/VSIZEはデータベース全体のサイズになる傾向があります
- サーバーで他のプロセスが実行されていない場合、常駐バイト/ RSIZEはマシンの合計メモリになります(これにはファイルシステムのキャッシュコンテンツが含まれます)
-
mongod
スワップを使用しないでください(ファイルはメモリマップされているため)
mongostat
を使用できます
mongod
をすばやく確認するためのツール アクティビティ..またはもっと便利なことに、MMS
などのサービスを使用します。 時間の経過とともに指標を監視します。
クエリオプティマイザ
MongoDB クエリオプティマイザー
クエリパターンのプラン実行を約1,000回の書き込み操作ごとに比較し、次にオプティマイザが実行されるまで「勝った」クエリプランをキャッシュします。または、明示的に explain()
そのクエリについて。
これはテストするのが簡単なはずです:mongo
でクエリを実行します .explain()
を使用したシェル msのタイミングと、スキャンされたインデックスエントリとドキュメントの数を確認します。 Explain()のタイミングは、プランの比較コストが含まれているため、クエリの実行にかかる実際の時間ではありません。通常の実行ははるかに高速になります..そしてmongod
で遅いクエリを探すことができます ログ。
デフォルトでは、MongoDBは100ミリ秒より遅いすべてのクエリをログに記録するため、これは最適化するクエリを探すための良い出発点を提供します。遅いms値は、--slowms
構成オプション、またはDatabase Profiler
を使用する
コマンド。