Estamos usando o HAProxy 1.6.3 para balancear a carga e direcionar o tráfego HTTP para centenas de servidores de back-end. Nós recarregamos a configuração frequentemente (várias vezes por dia), ambos automaticamente quando um servidor falha e manualmente por razões administrativas.
O problema é que a execução do comando reload leva até 3 minutos em um dos nossos servidores HAProxy (Ubuntu 16.04). Não parece importar se o servidor tem tráfego ou não. Em nossos outros servidores com a mesma versão do sistema operacional e HAProxy, o recarregamento leva de 1 a 5 segundos, independentemente da carga. Temos um monte de solicitações de longa duração, mas como eu disse, não parece importar se o servidor tem tráfego ou não.
Podemos ver que um novo processo é gerado, mas leva alguns minutos até que ele comece a aceitar tráfego (ou pelo menos até que o uso da CPU do novo processo suba acima de 0%).
A pergunta é: O que pode fazer com que o HAProxy demore tanto para recarregar? O que está fazendo há tanto tempo? Como posso descobrir (por exemplo, qual nível de registro eu preciso ativar e o que eu procuraria no log?)
Nós executamos o seguinte comando para recarregar:
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)
Nosso arquivo de configuração é assim:
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]
Obrigado!
ATUALIZAÇÃO: A única diferença que descobrimos é que o servidor lento usa o Ubuntu 16.04, enquanto o servidor rápido usa o 16.04.1. Não tenho certeza se isso é relevante.
ATUALIZAÇÃO 2: Alguns outros servidores que temos também estão rodando 16.04 e eles têm atualizações rápidas. Então provavelmente não é isso. O próximo passo é reinstalar o haproxy e ver se isso ajuda.
UPDATE 3: Reinstalar não ajudou. No momento, estamos trabalhando com strace para tentar descobrir o que está fazendo. Parece que está tentando se conectar a todos os nossos backends, mas com o tempo limite. Ainda não está claro por que apenas esse servidor recebe tempos limite e por que se recusa a assumir até que toda a pesquisa seja feita.