我正在研究用 HAProxy 替换专有的软件负载均衡器。作为此研究的一部分,我尝试在负载下测试 HAProxy。虽然我的 HAProxy 配置在以单个用户身份进行测试时运行良好,但只要我对其施加任何负载,网站的速度就会开始急剧下降,不久(约 100 个模拟用户)我们的负载测试工具就会开始报告故障。
这是一个相当简单的配置,唯一值得注意的一点是我们使用了 HAProxy 1.5.4,其中编译并使用了 OpenSSL 和 PCRE 支持。我们还有一些 ACL 来匹配 URL,尽管这个前端没有在这个负载测试中使用。
这是在 CentOS 6.5 机器上运行的。
我们在负载测试中对前端/后端组合的(净化)配置,以及全局和默认值:
global
daemon
tune.ssl.default-dh-param 2048
maxconn 100000
maxsessrate 100000
log /dev/log local6
defaults
mode http
option forwardfor
option http-server-close
timeout client 61s
timeout server 61s
timeout connect 13s
log global
option httplog
frontend stats
bind xxx.xxx.xxx.xxx:80
default_backend stats-backend
backend stats-backend
stats enable
server stats 127.0.0.1:80
frontend portal-frontend
bind xxx.xxx.xxx.xxx:80
default_backend portal-backend
frontend portal-frontend-https
bind xxx.xxx.xxx.xxx:443 ssl crt /path/to/pem
default_backend portal-backend
backend portal-backend
redirect scheme https if !{ ssl_fc }
appsession session len 140 timeout 4h request-learn
server web1.example.com web1.example.com:80 check
server web2.example.com web2.example.com:80 check
[...snip...]
在负载测试期间,我们从日志中获取了一些信息,但数量不多。相关片段:
Sep 4 11:06:12 xxxx haproxy[15609]: xxx.xxx.xxx.xxx:30983 [04/Sep/2014:11:05:42.984] portal-frontend-https~ portal-frontend-https/<NOSRV> -1/-1/-1/-1/28782 408 212 - - cR-- 1840/1840/0/0/0 0/0 "<BADREQ>"
...
Sep 4 11:06:03 xxxx haproxy[15609]: xxx.xxx.xxx.xxx:61502 [04/Sep/2014:11:05:47.810] portal-frontend-https~ portal-frontend-https/<NOSRV> -1/-1/-1/-1/14345 400 187 - - CR-- 1715/1693/0/0/0 0/0 "<BADREQ>"
...
Sep 4 11:06:03 xxxx haproxy[15609]: xxx.xxx.xxx.xxx:43939 [04/Sep/2014:11:05:59.553] portal-frontend portal-backend/<NOSRV> 314/-1/-1/-1/2602 302 181 - - LR-- 1719/22/223/0/3 0/0 "GET /mon/login.php?C=1&LID=15576783&TID=8145&PID=8802 HTTP/1.1"
根据这些日志条目,我们尝试了诸如调整超时 http 请求之类的操作,但没有任何改善(在我们的工具报告故障之前,负载测试将运行更长时间,但速度减慢的方式类似)。
我相信 HAProxy 能够做得更好,但我真的不知道现在该从哪里开始诊断问题(或限制)是什么。
答案1
请运行 dmesg 并确保你的 iptables 的 conntrack 表未满...你可能会收到许多类似这样的消息:“ip_conntrack:表已满,丢弃数据包”
如果是,请调整 sysctl:net.ipv4.netfilter.ip_conntrack_max 默认值非常低。您可以将其设置为 50000,甚至更多,具体取决于您的工作量。
巴蒂斯特
答案2
Felix 是对的。您需要将后端服务器上的 maxconn 设置为较低,而全局 maxconn 太高了。将其设置为 4000 左右。
理解全局和服务器 maxconn 之间的区别至关重要。
Willy Tarreau (HAProxy 的作者) 在这里描述得很清楚:https://stackoverflow.com/questions/8750518/difference-between-global-maxconn-and-server-maxconn-haproxy
我已经使用 HAProxy 多年了,我的后端服务器的默认值是 64 maxcon。
HAProxy 性能非常高,如果配置错误,肯定会导致 Web 服务器过载。查看 Web 服务器的网络连接和错误日志,看看它们是否达到最大连接数。如果是这种情况,我不会感到惊讶。