2015-12-28 8 views
7

私はノードAsyncを介していくつかのmongodbクエリを実行しようとしています。しかし、彼らはまだ実行する時間がかかります.. データベースは、インデックスが作成され、完全に最適化されています。 mongodb admin ...を使用してクエリのスピード時間を増やす方法がありますか、それに多くのメモリを割り当ててパフォーマンスを向上させる方法がありますか?nodejsを介したMongodbの並列クエリ

コンソールで表示されるクエリは、1つずつ実行されています。そしていくつかは、時間がかかりすぎている...無応答に..

2015-12-29T10:31:48.958-0800 I COMMAND [conn63] command consumers.$cmd command: count { count: "consumer1s", query: { ZIP: 37089, $or: [ { ADULTS_F_18_24: "Y" }, { ADULTS_F_24_35: "Y" } ] } } planSummary: IXSCAN { ZIP: 1.0, GENDER: 1.0 } keyUpdates:0 writeConflicts:0 numYields:1 reslen:44 locks:{ Global: { acquireCount: { r: 4 } }, MMAPV1Journal: { acquireCount: { r: 4 } }, Database: { acquireCount: { r: 2 } }, Collection: { acquireCount: { R: 2 }, acquireWaitCount: { R: 2 }, timeAcquiringMicros: { R: 54270 } } } 146ms 

2015-12-29T10:31:54.925-0800 I COMMAND [conn62] command consumers.$cmd command: count { count: "consumer1s", query: { ZIP: 37024, $or: [ { ADULTS_F_18_24: "Y" }, { ADULTS_F_24_35: "Y" } ] } } planSummary: IXSCAN { ZIP: 1.0, GENDER: 1.0 } keyUpdates:0 writeConflicts:0 numYields:88 reslen:44 locks:{ Global: { acquireCount: { r: 178 } }, MMAPV1Journal: { acquireCount: { r: 172 } }, Database: { acquireCount: { r: 89 } }, Collection: { acquireCount: { R: 89 }, acquireWaitCount: { R: 83 }, timeAcquiringMicros: { R: 1654781 } } } 6114ms 

こんにちは、私の質問を理解するために、ログを参照してください。結果として得られる...同じプラン以下の2つのクエリが...大きな実行時間差を持っています...理由とその修正方法を教えてください

以下の情報は便利です。 私はこのアプリケーションをMacintoshシステムで動作させています。 OSX Yosemite 10.10.2プロセッサー3.2Ghz Intel Core i5。メモリは8GB 1600MHz DDR3です。どのように私はmongodbに多くの仮想メモリを割り当てることができますどのような提案を

+2

ログを調べ、クエリ中にリソースの使用状況を監視する必要があります。クエリのパフォーマンスを向上させるために銀色の浮き彫りがありません – Martin

+1

インデックスはそこにあります... –

+0

実際の環境によって異なります。それは高い並行性または大きなデータですか?たとえば、並行性が高い場合は、 'redis'や' memcached'などのソリューションを使用する方がよいでしょう。一方、私は自分自身を最適化するmongodbも探しています... – hirra

答えて

0

@マーティンは言ったように、プロファイルする必要があります。クエリーがインデックスを使用していることを確認し、弱点を見つけるためにcursor.explainのようなものを使用してください。あなたのシステムが持っているリソースモニター(Linuxのtop/htopなど)を使って、メモリ不足かCPUバウンドかを確認してください。

「クエリは1つずつ実行されています」 - async.seriesなどを使用していないとみなします。これは順次です。

+0

async.parallelを使用しています... –

+0

クエリは決してCPUに束縛されません。集約と巨大な挿入物は、通常CPU集中型の唯一のものです。私はクエリのパフォーマンスプロファイリングをたくさん行ってきましたが、膨大な数のクエリがない限り、クエリはCPUの次に何もしません。基本的には、地理空間やテキスト検索を除き、非常に複雑な通常のクエリの演算子はありません。実際には、集約は多くのCPUを消費することになりますが、それでも通常は下位レベルに集約されます。 – tsturzl

+0

シリーズまたはパラレルで実行しても目立つ違いはありません。クエリの200ミリ秒を超えるものは基本クエリに関するものです。並行して実行することで節約される時間は、人間が識別するのはかなり困難です。おそらく、50個のクエリを並行して実行していないと仮定すると、その場合はDoSのポイントになる可能性があります。私は通常、私はサイズが特定の量を超えていないことを知っていれば、それ以外の場合は、未知のサイズの配列を処理しているときにシリーズで実行されます。彼らはどちらも目的を果たします。 – tsturzl

関連する問題