0

我在使用 MongoDB 时遇到了一些奇怪的性能问题。首先,我尝试通过确实有效的mongojs驱动程序获取大约 1000 个文档,但在大约 60 多秒内完成了查询。请注意,文件无论如何都不大!

然后我尝试做同样的查询,但是对 mongo shell 运行了一个 explain() 来检查它是否真的只是查询太慢了。经检查,查询只用了 4ms 即可完成!我不知道是什么原因造成的。有任何想法吗?

更多细节:

  • 小文件
  • MongoDB 服务器位于我通过 VPN 连接的另一台服务器上
  • 索引放置在必要的地方

编辑:

我运行了wireshark并注意到以下内容:

  1. 查询被发送到服务器

  2. 服务器在 1ms 内响应 101 个文档(总是相同的数量)

  3. 客户端执行“获取更多”请求

  4. 服务器响应其余文档大约需要一两分钟

  5. 带有文档的“获取更多”请求和服务器响应将继续,直到它发送完所有内容。即使是最小的大约 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收到一个“TCP Out of Order”数据包。

编辑 3:

我试图调整批量大小,这不起作用。我还尝试了 MongoSkin以确保它不是mongojs做错了什么,但这也没有解决任何问题。

4

2 回答 2

1

其他一些想法:

  1. Mongoose 工作得很好,IMO,你能用 Mongoose 替换 Mongojs 吗?

  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

我通过将 MongoDB 服务器复制到运行 Node 服务器的相同位置来修复它。我认为这与我连接的 VPN 有关,尽管我不能肯定地说。

于 2012-08-23T14:57:20.580 回答