Node.js在很多并发连接上苦苦挣扎

时间:2012-08-18 22:49:51

标签: node.js ubuntu tcp apachebench sysctl

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

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

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

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

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

我试过在localhost和远程服务器上运行'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积压队列应该足够深,永远不会溢出。如果我禁用syn cookie,“发送cookie”将转到“Dropping connections”。

我推测这是某种linux TCP堆栈调优问题,我已经阅读了我在网上找到的所有内容。我没有尝试过任何事情似乎很重要。有什么建议吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

我想你可能会发现这篇博文以及之前的博客文章

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