2015-11-16 2 views
15

を再起動した後に別のクエリの実行時間が、私はモンゴDBサーバを起動すると言う:のMongoDB - サーバー

mongo --dbpath=/some/path --port=12345 --storageEngine wiredTiger

彼らはすべてしているように、私は、その後、最初のものを無視して(10回同じクエリを実行します次のように)暖かいキャッシュ上:

mongo query1.js

私もMongoDBのロガー)timeを通じて検証として(あり得る回:

8137ms 8145ms 8193ms 8091ms 8152ms 8110ms 8182ms 8142ms 8133ms 8098ms

グレート - かなり一貫しています。すべてがお互いに〜100ミリ秒以内にありますが、それは理にかなっています。

Iその後、サーバをシャットダウン、 次のファッションのいずれかので:

db.getSiblingDB('admin').shutdownServer();

は、私は、まったく同じを使用して、それを再起動します。shutdown.jsが含まれてい

pkill mongod mongod --dbpath=/some/path --shutdown mongo shutdown.js

コマンドを実行して、次の時刻を取得します。

8531ms 8492ms 8613ms 8555ms 8538ms 8512ms 8551ms 8511ms 8608ms 8522ms

は再び、彼らは〜100ミリ秒以内に一貫しているが、それらは異なるベースラインですべてです。

これをもう一度行うと、実際には8.38.68.9、またはその間にある可能性があります。他のユーザープロセスは開かれていません(マシンにsshを実行するために必要なプロセスを除く)。

次のように私は実験を走った:私は223のデータ点を収集し、機械と相互作用しなかった一方で

while True: run the query 25 times and record the minimum such runtime shutdown the server and restart it, wait for it to listen

これは、週末2日間走り、最小ランタイムは7.9sからの範囲でした8.9s。その間にサーバーをシャットダウンしなかった場合、これは発生しません。でも、ベースラインが7.9sになるか、8.9sのいずれかが表示されることがあります。

1つのデータポイントの標準偏差(25クエリのランタイム)は常に低い値(約0.06)でしたが、すべてのクエリの間では非常に高かったです。

誰にもなぜこれが起こっているのか、どうやってそれを防ぐことができるのかについての直感はありますか? 1つのクエリが他のクエリより速いかどうかを判断しようとしていますが、テストするための適切なベースラインを得ることはできません。サーバーを再起動することは絶対に必要なわけではありませんが、サーバーが稼動しているとは限りませんので、私の人生は楽になります。

+0

これらのクエリはすべて、mongodログファイルに低速クエリのログとして記録される必要があります。同じ索引が各バッチで使用されているかどうか確認できますか? –

+0

この特定のクエリは、$グループのみを実行してソートする集約であるため、インデックスはまったく使用されません(COLLSCANを実行する必要があります)。これが何かに影響を与えるかどうかはわかりません。ちなみに、Valgrindを使って命令数とキャッシュミスを確認しました。命令の数(半分パーセント)で約0.005%のばらつきがあり、キャッシュの変更は無視されます。サーバーの1回の起動で約1%しか変化しないにもかかわらず、クエリ時間が6%も異なることがあります。それは非常に奇妙です。 – user1661781

+0

mongodを起動してnumactlを無効にしていますか? mongod、OS、ファイルシステムなどの正確なバージョンは何ですか? –

答えて

0

MongoDBは、いくつかのクエリを提供するためにキャッシュを使用します。サーバーを再起動すると、キャッシュがクリアされている必要があります。 MongoDBは最近使用されたすべてのデータをRAMに保存します。クエリのインデックスを作成し、作業データセットがRAMに収まる場合、MongoDBはメモリからのすべてのクエリを処理します。

クエリプランは、mongoの再起動時に消去されるキャッシュに保存されます。最初にクエリを実行すると時間がかかります。 explain( "executionStats")を参照してください。

WiredTigerで、MongoDBはファイルシステムキャッシュとWiredTigerキャッシュの両方を使用します。デフォルトでは、MongoDB 3.2以降、WiredTigerキャッシュはRAMの60%から1 GBを引いたものを使用するか、1 GBを使用します。 RAMが最大10 GBのシステムの場合、これは3.0以下の設定です。 RAMが10 GBを超えるシステムの場合、設定は3.0よりも大きくなります。

MongoDB 3.0では、既定でWiredTigerキャッシュはインストールされている物理RAMの半分またはどちらか大きい方を使用します。

また、MongoDBはファイルシステムキャッシュを介してマシン上のすべての空きメモリを自動的に使用します(ファイルシステムキャッシュ内のデータは圧縮されています)。あなたのクエリ要求は、同じリクエストに異なる時間がかかる場合がありますので、MongoDB Fundamentals

+0

キャッシュが問題だった場合、クエリを数回実行してキャッシュを温めた後、最終的にそのキャッシュを把握しないでください。また、データベース全体が両方の時間(約30%のRAM)に収まるため、キャッシュには十分なスペースがあります。 – user1661781

+0

あなたはこれに対する答えを持っていますか? –

1

のMongoDBは、RAM内の現在の処理データを保持するために

を参照してください。 This linkがお手伝いします。

関連する問題