HAProxy 重新載入非常慢(大約 3 分鐘)
我們正在使用 HAProxy 1.6.3 進行負載平衡並將 HTTP 流量路由到數百個後端伺服器。我們經常(一天幾次)重新載入配置,包括在伺服器出現故障時自動載入以及出於管理原因手動載入。
問題是在我們的一台 HAProxy 伺服器(Ubuntu 16.04)上執行 reload 命令最多需要 3 分鐘。伺服器是否有流量似乎並不重要。在我們其他具有相同版本作業系統和 HAProxy 的伺服器上,無論負載如何,重新載入都需要 1-5 秒。我們有一堆長時間執行的請求,但正如我所說,伺服器是否有流量似乎並不重要。
我們可以看到產生了一個新程序,但是它需要幾分鐘才能開始接受流量(或者至少直到新程序的 CPU 使用率攀升至 0% 以上)。
問題是:什麼會導致 HAProxy 需要這麼長時間才能重新載入?這麼長時間在幹什麼?我怎樣才能找到(例如,我需要啟用什麼級別的日誌記錄以及我將在日誌中查找什麼?)
我們執行以下命令來重新載入:
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)
我們的配置文件如下所示:
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 以嘗試找出它在做什麼。似乎它正在嘗試連接到我們所有的後端,但經常超時。尚不清楚為什麼只有此伺服器會超時,以及為什麼在所有輪詢完成之前它拒絕接管。
事實證明,新 HAProxy 程序啟動緩慢是因為它試圖解析所有後端伺服器的 DNS。而且由於我們有很多伺服器,並且 DNS 伺服器緩慢(或無響應)導致大量查詢超時,從而導致程序啟動緩慢。
我們改用更好的 DNS 伺服器,現在只需要 2 秒。