Ubuntu

HAProxy 重新載入非常慢(大約 3 分鐘)

  • October 16, 2017

我們正在使用 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 秒。

引用自:https://serverfault.com/questions/878105