节点中有数千个并发的http请求

时间:2015-02-08 15:18:22

标签: linux node.js concurrency

我有一个包含数千个网址的列表。我想通过http请求进行健康检查(healt.php)。

这是我的问题:

我在节点中写了一个应用程序。它以汇集的方式提出请求。我使用一个变量来控制打开的并发连接数。 300,即。 每个请求都是如此之快,不超过500毫秒。

但是当我运行应用程序时,结果是:

$ node agent.js

200ms   url1.tld
250ms   url4.tld
400ms   url2.tld
530ms   url8.tld
800ms   url3.tld
...
2300ms  urlN.tld
...
30120ms urlM.tld

似乎并发性存在限制。当我执行

$ ps axo nlwp,cmd | grep node

结果是:

6 node agent.js

有6个线程来管理所有并发连接。我发现了一个evn变量来控制节点中的并发性:UV_THREADPOOL_SIZE

$ UV_THREADPOOL_SIZE=300 node agent.js

200ms   url1.tld
210ms   url4.tld
220ms   url2.tld
240ms   url8.tld
400ms   url3.tld
...
800ms  urlN.tld
...
1010ms urlM.tld

问题仍然存在,但结果要好得多。使用ps命令:

$ ps axo nlwp,cmd | grep node

132 node agent.js

下一步:查看节点的源代码,我在deps / uv / src / unix / threadpool.c中找到了一个常量:

#define MAX_THREADPOOL_SIZE 128

确定。我已将该值更改为2048,编译并安装了节点并运行命令

$ UV_THREADPOOL_SIZE=300 node agent.js

一切似乎都好。响应时间不会逐渐增加。但是当我尝试使用更大的并发数时,会出现问题。但是这次它与线程数没有关系,因为使用ps命令我看到它们已经足够了。

我试着在golang中编写相同的应用程序,但结果是一样的。时间在逐渐增加。

所以,我的问题是:并发限制在哪里?内存和CPU加载和带宽不受限制。我调整了sysctl.conf和limits.conf以避免一些限制(文件,端口,内存......)。

2 个答案:

答案 0 :(得分:2)

您可能受到http.globalAgent maxSockets的限制。根据您是否使用http或https,请查看是否可以解决您的问题:

require('http').globalAgent.maxSockets = Infinity;
require('https').globalAgent.maxSockets = Infinity;

答案 1 :(得分:0)

如果您正在使用ParserElementrequest,则可以设置池大小:

request-promise

此处有更多信息:https://github.com/request/request