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.