HAProxy 调整 - 无法支持超过 50 个并发用户

HAProxy 调整 - 无法支持超过 50 个并发用户

我正在研究用 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 服务器的网络连接和错误日志,看看它们是否达到最大连接数。如果是这种情况,我不会感到惊讶。

相关内容