我们正在使用HA-Proxy version 1.5.11 2015/01/31
,从昨天开始我们注意到通过 https 对我们服务的所有请求都非常慢。从 Chrome 开发者控制台,我们可以看到以下时间:
Initial Connection 7.59s
SSL 6.42s
我们测试了套接字统计数据
# ss -s
Total: 2080 (kernel 2088)
TCP: 2674 (estab 2141, closed 433, orphaned 84, synrecv 0, timewait 433/0), ports 0
因此,可能远低于 65k 个端口。
以下是我们的 haproxy.cfg
# Global configuration
global
log 127.0.0.1 local0 notice
maxconn 50000
stats socket /tmp/proxystats level admin
tune.ssl.default-dh-param 2048
#user deploy
#group deploy
#daemon
tune.bufsize 32768
# Default configuration
defaults
log global
mode http
option httplog
option dontlognull
stats enable
stats uri /proxystats
stats auth username:pass
stats realm Haproxy\ Statistics
stats refresh 5s
timeout connect 120000
timeout client 120000
timeout server 120000
option redispatch
option forwardfor
option http-server-close
errorfile 500 /etc/haproxy/errors/503.http
errorfile 502 /etc/haproxy/errors/503.http
errorfile 503 /etc/haproxy/errors/503.http
# HTTP frontend configuration
frontend http
mode http
bind *:80
#redirect scheme https if !{ ssl_fc }
redirect prefix https://myservice.com code 301 if { hdr(host) -i myservice.com }
acl www hdr(host) -i www.myservice.com
acl api hdr(host) -i api.myservice.com
acl browser hdr(host) -i br-rx.myservice.com
use_backend api_server if www
use_backend api_server if api
use_backend browser_receiver if browser
# HTTPs frontend configuration
frontend https
mode http
bind *:443 ssl crt <our .com pem> crt <second domain pem> crt <third domain pem>
redirect prefix https://www.myservice.com code 301 if { hdr(host) -i myservice.com }
use_backend api_server if { ssl_fc_sni www.myservice.com }
use_backend api_server if { ssl_fc_sni api.myservice.com }
use_backend browser_receiver if { ssl_fc_sni br-rx.myservice.com }
系统内的CPU和Memory正常。CPU 9.3%, MEM: 335MB
我们还可以在哪里开始寻找?
答案1
鉴于 Chrome 报告极高的联系设置时间,这意味着 SYN 数据包被丢弃或至少没有得到答复。这可能发生在三种情况下:
- 数据包丢失:你可能想确保你的互联网链接仍然正常,并且这特定服务器具有正确的连接(其网卡可能已损坏)
- 积压已满,如果 haproxy 需要时间来接受连接,就会发生这种情况,并导致许多 SYN_RECV 连接,但由于您没有任何连接,因此情况并非如此;
- 未正确调整 conntrack 导致传入连接被丢弃。我倾向于投票支持这一点,因为人们在系统上部署负载平衡器时没有对其进行调整,而且这个问题相当常见。请至少使用“dmesg”检查系统日志并查找各种错误、任何 net_ratelimit 或任何“conntrack 表已满”消息。
编辑:我刚刚意识到您只更改了全局 maxconn 设置,而没有更改默认设置,因此您的前端仍然限制为 2000 个并发连接(使用 haproxy -vv 检查)。并且您的 netstat 似乎表明您距离此限制不太远,所以这可能是原因之一。请在您的默认部分中添加 maxconn 指令。