为什么我的node.js应用程序会被挂断"当我同时发送超过50000个查询时?

时间:2017-09-29 14:19:30

标签: node.js mongodb performance express

转到其他问题

这是关于此主题的final question。我从方程式中移除了Express并且通常清除了问题。

在你说出“傻瓜”这样的话之前,先将它们串联起来"或类似的东西,我想提一下,这段代码永远不会用于制作。我用谷歌搜索了几天并进行了测试,依此类推,现在我需要一些帮助。

如果您希望看到一些更高级别的问题 - 这里it就是。

测试台:

  • Windows 10
  • Mongo 3.2.11
  • 节点6.11.3
  • Express 4.15.4

问题:

我有100000个元素,我想用find / findOne / whatever检查一些集合。

我正在这样做:

Mongo很好 - 用日志,mongostat检查并简单地连接到它并查询某些东西。

节点部分正常 - 检查一些延迟的console.log工作正常,如果我尝试使用浏览器打开我的应用程序(这就是为什么我在标签部分中包含快速框架)它&#39 ; s加载,直到我遇到服务器超时。

页面设置最简单,没有任何数据库连接或类似的东西:

router.get('/',function(req, res) {
    res.send({result:"OK"});
});

它挂了。我甚至手动抓住server timeout来检查这个。

问题是为什么?一切都是异步的,所有"资源"很好,工作。有什么问题?

P.S。 Mongostats显示有趣的东西 - 首先它显示每行添加2000-3000个查询,然后0,0,0 ...再次几千个然后再次0。 这是paste

这是我的代码,如果你想要像我一样进行测试

    var t = setTimeout(function () {
        console.log("Timeout fired in 30 seconds");
    }, 30 * 1000);


    var testArtists = [];
    for (i = 0; i < 100000; i++) {
        testArtists[i] = Math.floor(Math.random() * 16777215).toString(16);
    }

    async.map(testArtists, function (artist, callback) {

        db.get().collection('someCollection').
            findOne(
            { "unimportant": testArtists[0] },
            function (err, discogsArtist) {
                if (err) return callback(err);
                return callback(null, "OK");
            }
            );
    }, function (err, results) {
        if (err) return console.log(err);
        return console.log("somehow finished");
    });

以下是我曾经遇到的一些错误,也许他们可以提供帮助,不知何故:

{ MongoError: connection 4 to localhost:27017 timed out
    at Function.MongoError.create (E:\blablabla\node_modules\mongodb-core\lib\error.js:29:11)
    at Socket.<anonymous> (E:\blablabla\node_modules\mongodb-core\lib\connection\connection.js:198:20)
    at Socket.g (events.js:292:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:338:8)
    at ontimeout (timers.js:386:11)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)
  name: 'MongoError',
  message: 'connection 4 to localhost:27017 timed out' }
Something went wrong when retrieving an access token read ECONNRESET
{ Error: read ECONNRESET
    at exports._errnoException (util.js:1020:11)
    at TLSWrap.onread (net.js:568:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
{ Error: read ECONNRESET
    at exports._errnoException (util.js:1020:11)
    at TLSWrap.onread (net.js:568:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }

提前致谢!

更新1

更新了我的代码以插入对象 - 现在我们可以看到插入了一些随机数量的对象(60000-80000),然后一切都变得沉默。

更新2

实时查看Express日志。根本没有电话,所以表达似乎是不可能的。现在。

更新3

pool到1000个连接之后,现在一切都能很快地完成,并及时完成。但这只是扩展解决方案,例如&#34;购买更多RAM&#34;。我想知道为什么异步使用数据库会阻止从浏览器提供页面。 MongoClient池大小和节点服务页面之间存在明显的连接。当mongo驱动程序获取所有已分配的池时,Node停止提供页面。为什么?怎么打呢?

0 个答案:

没有答案