以下是我的 haproxy 配置
global
log /dev/log local0 notice
log /dev/log local0 debug
log 127.0.0.1 local0
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 5000
defaults
log global
mode tcp
option tcplog
option tcpka
timeout connect 60s
timeout client 1000s
timeout server 1000s
frontend aviator-app
option tcplog
log /dev/log local0 debug
bind *:4433 ssl crt /etc/haproxy/certs/{domain_name}.pem
mode tcp
option clitcpka
option http-server-close
maxconn 5000
default_backend aviator-app-pool
# Table definition
stick-table type ip size 2000k expire 30s store conn_cur
# Allow clean known IPs to bypass the filter
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
# Shut the new connection as long as the client has already 100 opened
# tcp-request connection reject if { src_conn_cur ge 500 }
tcp-request connection track-sc1 src
backend aviator-app-pool
option tcplog
log /dev/log local0 debug
balance roundrobin
mode tcp
option srvtcpka
option http-server-close
maxconn 50
# list each server
server appserver1 10.0.1.205 maxconn 12
server appserver2 10.0.1.183 maxconn 12
server appserver3 10.0.1.75 maxconn 12
server appserver4 10.0.1.22 maxconn 12
# end of list
listen stats
bind *:8000
mode http
log global
maxconn 10
clitimeout 100s
srvtimeout 100s
contimeout 100s
timeout queue 100s
stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth username:password
stats uri /haproxy?stats
当我以每秒约 12-13 个 http 请求的速度运行负载测试时,在测试的第一个小时内我没有看到任何错误。但在测试进行约 90 分钟后,大量请求开始失败。jmeter 的错误消息通常为“连接超时:连接”或““domain_name:4433”无法响应”。以下是来自 haproxy.log 的一些日志消息。我还看到大量“conn 错误”(如上图所示)和一些“resp 错误”。
May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:55894
[07/May/2018:19:14:00.488] aviator-app~ aviator-app-pool/<NOSRV>
60123/-1/60122 0 sQ 719/718/717/0/0 0/672
May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:49905
[07/May/2018:19:12:53.483] aviator-app~ aviator-app-pool/appserver2
60022/1/127171 2283568 -- 719/718/716/11/0 0/666
我在后端服务器上没有看到任何错误或堆栈跟踪。测试期间负载均衡器的 CPU 使用率较低(负载均衡器的 CPU 使用率低于 10%),每个后端服务器的 CPU 使用率约为 30%。如能帮助调试此问题,我们将不胜感激。
答案1
您的后端有,maxconn 50
所以 HAProxy 正在将溢出队列放入队列,等待现有的 50 个连接中的一个完成。当每个连接断开时,另一个连接将被允许通过后端...但您的后端速度不够快。请求在代理处备份,最终,代理会在它们进入代理队列后将它们拆除timeout connect 60s
。
sQ
日志条目中的内容解释了这一点。
s
:等待服务器发送或接收数据时服务器端超时已到。
Q
:代理正在 QUEUE 中等待连接槽。只有当服务器设置了“maxconn”参数时才会发生这种情况。
看断开连接时的会话状态在 HAProxy 配置指南中。