linux - Node 中数千个并发 http 请求

标签 linux node.js concurrency

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

这是我的问题:

我已经在 Node 中编写了一个应用程序。它以合并的方式发出请求。我使用一个变量来控制我打开的并发连接数。 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 个线程来管理所有并发连接。我找到了一个evn变量来控制 Node 中的并发性: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,编译并安装 Node 并运行一次命令

$ UV_THREADPOOL_SIZE=300 node agent.js

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

我试着用golang写了同样的应用,但是结果是一样的。时间逐渐增加。

所以,我的问题是:并发限制在哪里?内存和 cpu 负载和带宽都没有超出范围。我调整了 sysctl.conf 和 limits.conf 以避免一些限制(文件、端口、内存...)。

最佳答案

您可能会被 http.globalAgent 的 maxSockets 限制。根据您使用的是 http 还是 https,看看这是否能解决您的问题:

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

关于linux - Node 中数千个并发 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395616/

相关文章:

go - 为什么即使有锁,GO 也会出现 'concurrent map writes' panic ?

java - 以ArrayList为元素的并发队列数据结构

linux - 如何使用参数netcat url?

javascript - Vue项目导入js文件报错

linux - 以字节为单位获取远程文件的大小? (没有内容大小)

node.js - 错误 : cookieParser ("secret") required for signed cookies

node.js - 无法在 post 请求中发送对象

python-2.7 - python 3 中的 concurrency.futures 包是否有 python 2 反向移植

linux - 比较文件内容并删除较短的文件

linux - Shell 脚本自动回答 Yes No 对话框