我正在开发一个有点不寻常的应用程序,在这个应用程序中,10k客户端被精确地计时,所有客户端都尝试一次提交数据,每3分钟左右。这个“ab”命令相当准确地模拟了现实世界中的一次炮火:
ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo"我在一个rackspacecloud ec头VPS实例上使用了Ubuntu12.4上的Node.js来收集这些提交,但是,我从Node看到了一些非常奇怪的行为,即使我删除了所有业务逻辑并将http请求转换成一个Node。
当测试完成大约90%时,它会挂很长一段时间。奇怪的是,这种情况一直保持在90% -- c=n=10k为9000%;c=n=5k为4500%;c=n=2k为1800 %。实际上,测试最终完成了,通常没有错误。但是ab和节点日志都显示出连续的处理,直到测试运行的80%-90%,然后在完成之前暂停很长时间。
当节点正常处理请求时,CPU使用率通常在50-70%左右。在挂起期间,CPU上升到100%。有时它会保持在0附近。在不稳定的CPU响应与实际连接数(仅完成%)无关的事实之间,我不怀疑垃圾回收器。
我已经尝试过在本地主机和远程服务器上运行这个'ab‘--同样的效果。
我怀疑与TCP堆栈有关的东西,可能涉及关闭连接,但我的配置更改没有起到任何作用。我的改变:
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我还注意到,我倾向于在内核日志中获得这个msg:
TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters.我对这个msg感到困惑,因为TCP待办事项队列应该足够深,不会溢出。如果我禁用syn cookie,“发送cookie”将转到“丢弃连接”。
我推测这是某种类型的linux堆栈优化问题,我已经阅读了网络上所能找到的所有内容。我尝试过的一切似乎都不重要。有什么建议吗?
更新:尝试了tcp_max_syn_backlog、somaxconn、netdev_max_backlog,以及set () backlog param设置为50k,但行为没有改变。还会产生SYN洪水警报。
发布于 2012-08-18 22:59:04
您是否在同一台运行节点的机器上运行ab?如果没有,你有1G或10G的NIC吗?如果是的话,你不是真的在尝试处理20,000个开放的连接吗?
另外,如果要将net.core.somaxconn更改为10,000,那么该机器上绝对没有打开其他套接字?如果你这么做了,那一万是不够高的。
您是否尝试过使用nodejs群集将每个进程的打开连接数目分散?
发布于 2012-08-19 10:49:31
我想你可能会觉得这篇博文和前面的文章很有用。
http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/
https://stackoverflow.com/questions/12022815
复制相似问题