7

我正在开发一个有点不寻常的应用程序,其中 10k 个客户端被精确计时,以每 3 分钟左右一次尝试一次提交数据。这个“ab”命令相当准确地模拟了现实世界中的一个弹幕:

ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo"

我在 rackspacecloud VPS 实例上的 Ubuntu 12.4 上使用 Node.js 来收集这些提交,但是,我看到 Node 的一些非常奇怪的行为,即使我删除了所有业务逻辑并将 http 请求变成了 no-同上。

当测试完成大约 90% 时,它会挂起很长一段时间。奇怪的是,这始终发生在 90% - 对于 c=n=10k,在 9000;对于 c=n=5k,在 4500;对于 c=n=2k,在 1800 处。测试实际上最终完成,通常没有错误。但是 ab 和 node 日志都显示持续处理直到大约 80-90% 的测试运行,然后在完成之前停顿很长时间。

当节点正常处理请求时,CPU 使用率通常在 50-70% 左右。在挂起期间,CPU 上升到 100%。有时它保持在 0 附近。在不稳定的 CPU 响应和它似乎与实际连接数(仅完成百分比)无关的事实之间,我不怀疑垃圾收集器。

我已经在本地主机和远程服务器上尝试过这个运行'ab' - 效果相同。

我怀疑与 TCP 堆栈有关的东西,可能涉及关闭连接,但我的配置更改都没有帮助。我的变化:

  • ulimit -n 999999
  • 当我听()时,我将积压工作设置为 10000

Sysctl 更改为:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_orphans = 20000
net.ipv4.tcp_max_syn_backlog = 10000
net.core.somaxconn = 10000
net.core.netdev_max_backlog = 10000

我还注意到我倾向于在内核日志中获取此消息:

TCP: Possible SYN flooding on port 80. Sending cookies.  Check SNMP counters.

我对这个消息感到困惑,因为 TCP 积压队列应该足够深,不会溢出。如果我禁用同步 cookie,“发送 cookie”会转到“断开连接”。

我推测这是某种 linux TCP 堆栈调整问题,我已经阅读了我在网上可以找到的所有内容。我尝试过的一切似乎都不重要。有什么建议吗?

更新:尝试使用 tcp_max_syn_backlog、somaxconn、netdev_max_backlog 并将 listen() backlog 参数设置为 50k,但行为没有变化。仍然会产生 SYN 洪水警告。

4

2 回答 2

3

您是否在运行节点的同一台机器上运行 ab?如果没有,您有 1G 或 10G 网卡吗?如果是,那么您不是真的在尝试处理 20,000 个打开的连接吗?

另外,如果您要更改net.core.somaxconn为 10,000,那台机器上绝对没有其他套接字打开?如果你这样做,那么 10,000 还不够高。

您是否尝试过使用nodejs集群来分散每个进程的打开连接数?

于 2012-08-18T22:59:04.650 回答
2

我想您可能会发现这篇博文以及之前的博文很有用

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

于 2012-08-19T10:49:31.583 回答