我有一个包含数千个 URL 的列表。我想通过 http 请求进行健康检查 (healt.php)。
这是我的问题:
我在节点中编写了一个应用程序。它以集中的方式发出请求。我使用一个变量来控制打开的并发连接数。 300,即。
一个接一个,每个请求都那么快,不超过500ms。
但是当我运行该应用程序时,结果是:
$ 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 个线程来管理所有并发连接。我找到了一个环境变量来控制节点中的并发: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
下一步:查看node的源代码,我在deps/uv/src/unix/threadpool.c中找到了一个常量:
#define MAX_THREADPOOL_SIZE 128
好的。我已将该值更改为 2048,编译并安装节点并运行一次命令
$ UV_THREADPOOL_SIZE=300 node agent.js
一切看起来都还好。响应时间不会逐渐增加。但是当我尝试使用更大的并发数时,就会出现问题。但这一次它与线程数无关,因为通过 ps 命令我看到线程数足够了。
我尝试用golang编写相同的应用程序,但结果是相同的。时间在逐渐增加。
那么,我的问题是:并发限制在哪里?内存和CPU负载以及带宽都没有越界。我调整了 sysctl.conf 和 limit.conf 以避免一些限制(文件、端口、内存……)。