HAProxy rejeitando conexões com baixo uso de recursos

HAProxy rejeitando conexões com baixo uso de recursos

Estou tendo problemas com meus servidores haproxy rejeitando novas conexões (ou expirando) após um determinado limite. Os servidores proxy são AWSc5.grandeEC2 com 2 CPUs e 4GB de RAM. A mesma configuração é usada para ambos os tipos de conexão em nosso site, temos uma para conexões websocket que normalmente têm entre2K-4Kconexões simultâneas e uma taxa de solicitação de cerca de10/s. O outro é para tráfego normal da web com nginx como back-end com cerca de400-500conexões simultâneas e uma taxa de solicitação de cerca de100-150/s. O uso típico da CPU para ambos é sobre3-5%no processo haproxy, com2-3%da memória usada para o proxy websocket (40-60 MB) e1-3%da memória usada para o proxy da web (30-40 MB).

De acordo com a configuração anexada, os cpus são mapeados em ambos os cpus, com um processo e dois threads em execução. Ambos os tipos de tráfego são normalmente 95% (ou superior) de tráfego SSL. Eu observei as informações do proxy usandowatch -n 1 'echo "mostrar informações" | socat unix:/run/haproxy/admin.sock -'para ver se estou atingindo algum dos meus limites, o que não parece ser o caso.

Durante o tempo de alto tráfego, e quando começamos a ver problemas, é quando nossas conexões simultâneas de websocket atingem cerca de5Ke a taxa de solicitações da web chega a400 solicitações/s. Menciono os dois servidores aqui porque sei que a configuração pode lidar com altas conexões simultâneas e taxas de solicitação, mas estou perdendo algum outro limite de recursos sendo atingido. Em condições normais, tudo funciona bem; no entanto, os problemas que vemos sãoERR_CONNECTION_TIMED_OUT(do Chrome) erros de tipo. Nunca vejo nenhum erro 502. Nem vejo nenhum outro processo usando mais CPU ou memória no servidor. Também estou anexando algumas outras configurações possivelmente relevantes, como definir meus limites e configurações de sysctl.

Alguma idéia do que posso estar perdendo? Estou lendoprincipaleps aux | grep haproxyerrado e vendo o uso errado de CPU/mem? Estou faltando algum limite de conexão TCP? Os servidores backend (nginx/websocket) estão sendo trabalhados, mas nunca parecem ser tributados. Nós os testamos com muito mais conexões e tráfego e somos limitados pelo proxy muito antes de limitarmos os servidores back-end.

Muito obrigado.

haproxy.cfg:

global
    ulimit-n 300057
    quiet
    maxconn 150000
    maxconnrate 1000
    nbproc 1
    nbthread 2
    cpu-map auto:1/1-2 0-1

    daemon
    stats socket /run/haproxy/admin.sock mode 600 level admin
    stats timeout 2m
    log 127.0.0.1:514 local0
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private
    ssl-default-bind-options no-sslv3 no-tlsv10
    ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL:!RC4

defaults
    maxconn 150000
    mode http
    log global
    option forwardfor
    timeout client 30s
    timeout server 120s
    timeout connect 10s
    timeout queue 60s
    timeout http-request 20s

frontend default_proxy
    option httplog
    bind :80
    bind :443 ssl crt /etc/haproxy/ssl.pem
    ... acl stuff which may route to a different backend
    ... acl for websocket traffic
    use_backend websocket if websocket_acl
    default_backend default_web

backend default_web
    log global
    option httpclose
    option http-server-close
    option checkcache
    balance roundrobin
    option httpchk HEAD /index.php HTTP/1.1\r\nHost:website.com
    server web1 192.168.1.2:80 check inter 6000 weight 1
    server web2 192.168.1.3:80 check inter 6000 weight 1

backend websocket
    #   no option checkcache
    option httpclose
    option http-server-close
    balance roundrobin
    server websocket-1 192.168.1.4:80 check inter 6000 weight 1
    server websocket-2 192.168.1.5:80 check inter 6000 weight 1

Saída dehaproxy -vv:

HA-Proxy version 1.8.23-1ppa1~xenial 2019/11/26
Copyright 2000-2019 Willy Tarreau <[email protected]>

Build options :
  TARGET  = linux2628
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -O2 -fPIE -fstack-protector-strong -Wformat -    Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv -Wno-unused-label
OPTIONS = USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_LUA=1 USE_SYSTEMD=1 USE_PCRE2=1 USE_PCRE2_JIT=1 USE_NS=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 1024, maxpollevents = 200

Built with OpenSSL version : OpenSSL 1.0.2g  1 Mar 2016
Running on OpenSSL version : OpenSSL 1.0.2g  1 Mar 2016
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports : TLSv1.0 TLSv1.1 TLSv1.2
Built with Lua version : Lua 5.3.1
Built with transparent proxy support using: IP_TRANSPARENT         IPV6_TRANSPARENT IP_FREEBIND
Encrypted password support via crypt(3): yes
Built with multi-threading support.
Built with PCRE2 version : 10.21 2016-01-12
PCRE2 library supports JIT : yes
Built with zlib version : 1.2.8
Running on zlib version : 1.2.8
Compression algorithms supported : identity("identity"), deflate("deflate"), raw-deflate("deflate"), gzip("gzip")
Built with network namespace support.

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.

Available filters :
    [SPOE] spoe
    [COMP] compression
    [TRACE] trace

limites.conf:

* soft nofile 120000
* soft nproc 120000

sysctl.conf:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies=1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_local_port_range = 1024 65023
net.ipv4.tcp_max_syn_backlog = 50000
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 50000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.netdev_max_backlog = 50000
fs.epoll.max_user_instances = 10000

Típico com carga com 330 conexões simultâneas e 80 req/sps aux | grep haproxysaída:

root      8122  4.5  1.2 159052 46200 ?        Ssl  Jan28  40:56 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 29790
root     12893  0.0  0.3  49720 12832 ?        Ss   Jan21   0:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 29790

e o sistema operacional é Ubuntu 16.04.

Responder1

Acontece que a resposta estava olhando para mim o tempo todo. eu tinha definido omaxconnratepara 1.000. No entanto,mostrar informaçõesestava me mostrando uma taxa de conexão mais baixa, entre 10 e 15, então não achei que estava atingindo esse limite. Só consegui sustentar um máximo de 500 solicitações/s (confirmadas pelos meus servidores backend), com cada solicitação exigindo uma conexão com o cliente e uma segunda com o backend. Portanto, eu estava usando 1.000 conexões por segundo.

Removi esse limite e consegui manter uma taxa de conexão mais alta.

informação relacionada