我正在处理一个有些不寻常的应用程序,在这个应用中,10,000个客户端被准确地定时,每3分钟左右尝试同时提交数据。这个 'ab' 命令可以相当准确地模拟真实世界中的一个弹幕:
ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo"
我正在使用Ubuntu 12.4上的Node.js,并在rackspacecloud VPS实例上收集提交内容,但是我发现Node.js存在一些非常奇怪的行为,即使我删除了所有业务逻辑并将http请求转换为no-op。测试进行到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
- 当我listen()时,我将backlog设置为10000
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 cookies,“发送cookie”会变成“丢弃连接”。
我猜测这是某种linux TCP堆栈调优问题,我已经阅读了网络上的所有内容,但似乎没有什么作用。有什么建议吗?
更新:尝试使用tcp_max_syn_backlog、somaxconn、netdev_max_backlog和listen()后备参数设置为50k,行为没有改变。依然会产生SYN洪泛警告。