【问题标题】:Node.js & MongoDB performance issuesNode.js 和 MongoDB 性能问题
【发布时间】:2012-08-18 18:06:43
【问题描述】:

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

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

更多细节:

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

编辑:

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

  1. 查询被发送到服务器

  2. 服务器在 1 毫秒内响应 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乱序”数据包。

编辑 3:

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

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    其他一些想法:

    1. Mongoose 运行良好 IMO,你能用 Mongoose 替换 Mongojs 吗?

    2. 使用 find 查询的参数并链接具有高值的 .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);
    

    【讨论】:

    • 我试过了,但没有一点帮助。我也用 MongoSkin(一个不同的库)尝试过,但没关系,同样的问题发生了。
    • 如果您尝试 Sachin 答案中的代码,但将 batch_size 调用放在 forEach 之前会发生什么?
    • 我也试过这个,但没关系。有关更多信息,请参阅我自己的答案,并感谢您的帮助! :)
    【解决方案2】:

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

    【讨论】:

    • 很高兴您找到了解决办法。仍然对远程数据库的问题感到好奇。
    • 我不得不通过一些 Cisco 软件连接到 VPN,我猜这是问题所在。一旦我设法手动(通过 Windows 界面)设置 VPN 连接,它就开始工作了!
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2021-09-08
    • 2021-02-22
    • 2011-06-30
    • 2019-10-16
    • 2013-09-09
    • 2011-04-01
    • 2021-07-06
    相关资源
    最近更新 更多