0

MongoDBで奇妙なパフォーマンスの問題が発生しています。最初に、動作したmongojsドライバーを介して約1000のドキュメントを取得しようとしましたが、クエリは約60秒以上で完了しました。ドキュメントは決して大きくないことに注意してください!

次に、同じクエリを実行しようとしましたが、mongoシェルに対してexplain()を実行して、クエリが非常に遅いだけであるかどうかを確認しました。調べてみると、クエリが完了するのに4ミリ秒しかかからなかったことがわかりました。何が原因なのかわかりません。何か案は?

詳細:

  • 小さな文書
  • MongoDBサーバーは、VPN経由で接続している別のサーバーにあります
  • インデックスは必要に応じて配置されます

編集:

私はwiresharkを実行し、次のことに気づきました。

  1. クエリはサーバーに送信されます

  2. サーバーは1ms未満で101のドキュメントで応答します(常に同じ数)

  3. クライアントは「GetMore」リクエストを実行します

  4. サーバーが残りのドキュメントで応答するまでに約1〜2分かかります

  5. 「GetMore」リクエストとドキュメントを含むサーバーの応答は、すべてが送信されるまで続きます。これには時間がかかるかもしれません...約1000のドキュメントの最小のセットでさえ永遠に!

ノードCLIで実行するコードは次のとおりです。

/* Get all the documents (about 1000) */
var db = require('mongojs').connect("myIpAddress", ["myCollection"]);
db.myCollection.find({}).forEach(function(err, doc) {
    console.log(doc);
});

編集2:

関連するかどうかはわかりませんが、wiresharkから「TCPOutofOrder」パケットを受け取ることがあります。

編集3:

バッチサイズを調整しようとしましたが、機能しませんでした。また、MongoSkinを試して、 mongojsが何か間違ったことをしていないことを確認しましたが、それでも何も解決しませんでした。

4

2 に答える 2

1

その他のアイデア:

  1. Mongoose は IMO でかなりうまく機能します。Mongojs を Mongoose に置き換えることはできますか?

  2. 検索クエリのパラメーターをいじって、高い値を持つ .batch_size() をチェーンします。

  3. Wireshark を実行して接続を監視し、どの対話が 60 秒待機しているかを確認します。いくつかの固有の Nodejs - VPN ネットワーク相互作用の問題である可能性があります。

コードを投稿できますか?

...編集-これを試してください(テストしていないため、構文の癖があるかもしれません-プログラムで確認してください)

/* Get all the documents (about 1000) */
var db = require('mongojs').connect("myIpAddress", ["myCollection"]);
db.myCollection.find({}).forEach(function(err, doc) {
    console.log(doc);
}).batch_size(2000);
于 2012-08-23T09:54:28.133 に答える
1

Node サーバーが実行されていたのと同じ場所に MongoDB サーバーをコピーすることで、この問題を修正しました。確かなことは言えませんが、接続していた VPN に関係していると思います。

于 2012-08-23T14:57:20.580 に答える