我有一个 pubsub 应用程序(主要是聊天,但也有一些其他好东西正在发布和订阅)在 node 和 socket.io 上运行。
我正在通过启动一些其他真正的大型盒子并运行为此目的编写的节点应用程序来负载测试该应用程序,该应用程序会产生大量使用 socket.io-client 包连接的进程。
我发现我可以获得大约 1k 个到单个 1gig rackspace 云盒的并发连接。但我们需要支持 10k 到 100k 个并发连接(针对特定事件,而非所有时间),因此我在前面放置了一个负载均衡器,并计划在大型事件发生前启动更多机器。但我在前面放置了一个 haproxy 盒,发现在 2 台服务器和 2k 个用户的情况下,一切顺利,但使用 4 台服务器,即使 3k 个用户也很难!
我注意到,当我的负载测试开始导致大量断开连接时,节点服务器的 CPU 使用率非常高(90%),我觉得很奇怪,因为当有 2 台服务器和 2k 个用户时,我最终得到最大值 70%,而这个数字很快就会减少。
以下是我的 haproxy 配置中的一些相关行:
mode http
timeout client 86400000
timeout server 86400000
timeout connect 5000
maxconn 100000
我还在 haproxy 和节点框上的 /etc/sysctl.conf 中添加了一些内核网络调整:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65023
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 50000
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_rmem = 8192 87380 8388608
net.ipv4.tcp_wmem = 8192 87380 8388608
并且 haproxy 和节点框都有
ulimit -n 99999
其相关的初始化脚本(在启动 haproxy 或节点之前)
haproxy 盒子的 CPU 使用率始终保持在个位数(或更低)。
我下一步该怎么做?这里有什么突出的问题吗?
答案1
如果尚未启用 HAProxy HTTP 日志记录,请将其打开,然后查看是否可以在该日志记录或服务器的系统日志中找到断开连接的原因。HAProxyHTTP 日志格式包括termination_state
有助于为您指明正确方向的请求。