我正在开发一个有点不寻常的应用程序,其中 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 洪水警告。