我有一个包含数千个网址的列表。我想通过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以避免一些限制(文件,端口,内存......)。
答案 0 :(得分:2)
您可能受到http.globalAgent maxSockets
的限制。根据您是否使用http或https,请查看是否可以解决您的问题:
require('http').globalAgent.maxSockets = Infinity;
require('https').globalAgent.maxSockets = Infinity;
答案 1 :(得分:0)