我目前正在 Centos 6 上推出 HAProxy,它将向一些 Apache HTTPD 服务器发送请求,但我遇到了性能问题。我花了几天时间在 Google 上搜索,但在基准测试时似乎仍然无法持续超过 10k/秒的连接速度(但有时我确实能达到 30k/秒)。
我已将内部和外部 NICS 的 TX/RX 队列的 IRQ 固定到单独的 CPU 核心,并确保 HAProxy 固定到它自己的核心。
我还对 sysctl.conf 做了以下调整:
# Max open file descriptors
fs.file-max = 331287
# TCP Tuning
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 = 40000
net.ipv4.tcp_rmem = 4096 8192 16384
net.ipv4.tcp_wmem = 4096 8192 16384
net.ipv4.tcp_mem = 65536 98304 131072
net.core.netdev_max_backlog = 40000
net.ipv4.tcp_tw_reuse = 1
如果我使用 AB 直接访问网络服务器,我可以轻松获得 30k/s 的连接数。如果我停止网络服务器并使用 AB 访问 HAProxy,那么我可以获得 30k/s 的连接数,但显然这是没用的。
我还暂时禁用了 iptables,因为我读到 nf_conntrack 会使一切变慢,没有任何变化。我还禁用了 irqbalance 服务。
我可以以 30k/s 的速度访问每个单独的设备,这一事实让我相信服务器的调整是没问题的,而且一定是某种 HAProxy 配置?
这是我通过阅读调优文章等构建的配置http://pastebin.com/zsCyAtgU
该服务器是双 Xeon CPU E5-2620(6 核),配备 32GB RAM。运行 Centos 6.2 x64。私有接口和公共接口位于不同的 NICS 上。
有人有什么想法吗?谢谢。
答案1
您是否尝试过使用比 AB 更可靠的测试工具?您可能会发现是 AB 本身而不是 HAProxy 遇到了瓶颈。考虑使用 Apache jMeter 或适当的全状态负载测试应用程序。
Apache 上的 Keepalive 可能会掩盖/扭曲 AB 结果,从而导致您看到的差异,
您应该在负载测试期间发布内容,netstat
以便我们可以建立正在使用的连接状态并在此基础上适当地调整设置。
尽管如此,您应该能够通过在默认部分添加以下选项来稍微提高性能:
option tcp-smart-accept
option tcp-smart-connect
这里有一个很好的讨论,反映了你们的一些担忧,http://www.mail-archive.com/[电子邮件保护]/msg07156.html
远程诊断有点太棘手了。但是如果 Apache 能够达到这些级别的请求数/秒,则不太可能是内核级别或 TCP/IP 堆栈设置。因此,您最好将注意力集中在查看 HAProxy 配置上。