HAProxy重装很慢(差不多3分钟)

我们正在使用HAProxy 1.6.3来负载均衡,并将HTTPstream量路由到数百个后端服务器。 我们经常重新加载configuration(一天几次),当服务器出现故障时自动重新加载configuration,并且由于pipe理原因而手动configuration。

问题是在我们的HAProxy服务器(Ubuntu 16.04)上运行reload命令最多需要3分钟。 服务器是否有stream量似乎并不重要。 在具有相同版本的OS和HAProxy的其他服务器上,无论负载如何,重新加载都需要1-5秒。 我们有一堆长时间运行的请求,但正如我所说,服务器是否有stream量似乎并不重要。

我们可以看到一个新的过程被产生了,但是在它开始接受stream量之前需要几分钟的时间(或者至less在新stream程的CPU使用率超过0%之前)。

问题是:什么会导致HAProxy花费这么长时间来重新加载? 这么久在做什么? 我怎样才能find(例如,我需要启用什么级别的日志logging,以及我在日志中查找什么?)

我们运行以下命令重新加载:

haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)

我们的configuration文件如下所示:

 global log 127.0.0.1 local0 notice maxconn 20000 user haproxy group haproxy tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull option http-keep-alive option forwardfor retries 3 option redispatch timeout connect 5s timeout check 5s timeout client 60000 timeout server 60000 stats enable stats uri /haproxy?stats stats auth [REDACTED] option httpchk GET / HTTP/1.0 balance roundrobin default-server inter 10s fall 2 rise 2 frontend http-in bind *:80 # Define hosts acl host_1 hdr(host) -i somehost.somedomain.com [hundreds of host header configurations] ## switches use_backend 1 if host_1 [hundreds of if-clauses] frontend https-in bind *:443 ssl crt [REDACTED] crt [REDACTED] crt [REDACTED] # Define hosts acl host_1 hdr(host) -i somehost.somedomain.com [hundreds of host header configurations] ## switches use_backend 1 if host_1 [hundreds of if-clauses] backend 1 server node1 [some IP] check server node2 [some IP] check [lots more backends] 

谢谢!

更新:我们发现的唯一区别是,慢速服务器使用Ubuntu 16.04,而快速服务器使用16.04.1。 不知道这是否相关。

更新2:我们有一些其他服务器也运行16.04,他们有快速重新加载。 所以可能不是这样。 下一步是重新安装haproxy,看看是否有帮助。

更新3:重新安装没有帮助。 我们目前正在用strace运行,试图找出它在做什么。 它似乎试图连接到我们所有的后端,但经常超时。 目前还不清楚为什么只有这个服务器会超时,为什么在所有轮询完成之前拒绝接pipe。

事实certificate,新HAProxy进程的缓慢启动是由于它试图parsing所有后端服务器的DNS。 而由于我们有很多的服务器和一个缓慢(或无响应)的DNS服务器造成了很多查询超时,导致进程缓慢的启动。

我们改变了一个更好的DNS服务器,现在需要2秒。