HAProxy recarrega muito lento (quase 3 minutos)

2

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.

    
por DukeOf1Cat 12.10.2017 / 12:09

1 resposta

1

Acontece que o início lento do novo processo HAProxy foi devido à tentativa de resolver os DNS de todos os servidores de back-end. E como tínhamos muitos servidores e um servidor DNS lento (ou não responsivo) causou muitos tempos limites de consulta que causaram um início lento do processo.

Alteramos para um servidor DNS melhor e agora demora 2 segundos.

    
por 16.10.2017 / 12:13