HAProxy rechaza conexiones con bajo uso de recursos

HAProxy rechaza conexiones con bajo uso de recursos

Tengo problemas con mis servidores haproxy que rechazan nuevas conexiones (o las agotan) después de un cierto umbral. Los servidores proxy son AWSc5.grandeEC2 con 2 cpus y 4GB de ram. Se utiliza la misma configuración para ambos tipos de conexión en nuestro sitio, tenemos una para conexiones websocket que normalmente tienen entre2K-4Kconexiones simultáneas y una tasa de solicitudes de aproximadamente10/s. El otro es para tráfico web normal con nginx como backend con aproximadamente400-500conexiones simultáneas y una tasa de solicitudes de aproximadamente100-150/s. El uso típico de CPU para ambos es aproximadamente3-5%en el proceso haproxy, con2-3%de la memoria utilizada para el proxy websocket (40-60 MB) y1-3%de la memoria utilizada para el proxy web (30-40 MB).

Según la configuración adjunta, los CPU se asignan en ambos CPU, con un proceso y dos subprocesos en ejecución. Ambos tipos de tráfico suelen ser tráfico SSL del 95% (o más). He visto la información del proxy usandowatch -n 1 'echo "mostrar información" | socat unix:/run/haproxy/admin.sock -'para ver si estoy alcanzando alguno de mis límites, lo cual no parece ser el caso.

Durante las horas de mucho tráfico, y cuando empezamos a ver problemas, es cuando nuestras conexiones simultáneas de websocket alcanzan aproximadamente5Ky la tasa de solicitudes web aumenta a400 solicitudes/s. Menciono ambos servidores aquí porque sé que la configuración puede manejar altas conexiones simultáneas y tasas de solicitudes, pero me falta algún otro límite de recursos que se alcance. En condiciones normales todo funciona bien; sin embargo, los problemas que vemos sonERR_CONNECTION_TIMED_OUT(de Chrome) errores de tipo. Nunca veo ningún error 502. Tampoco veo que ningún otro proceso utilice más CPU o memoria en el servidor. También adjunto algunas otras configuraciones posiblemente relevantes, como establecer mis límites y la configuración de sysctl.

¿Alguna idea de lo que podría estar perdiendo? Estoy leyendoarribayps auxiliar | grep haproxy¿Está mal y ve el uso incorrecto de CPU/memoria? ¿Me falta algún límite de conexión TCP? Los servidores backend (nginx/websocket) están en funcionamiento, pero parece que nunca están sujetos a impuestos. Los hemos probado con muchas más conexiones y tráfico y estamos limitados por el proxy mucho antes de que limitemos los servidores backend.

Muchas gracias.

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

Salida 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

límites.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 con carga con 330 conexiones simultáneas y 80 req/sps auxiliar | grep haproxyproducción:

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

y el sistema operativo es Ubuntu 16.04.

Respuesta1

Resulta que la respuesta estuvo mirándome a la cara todo el tiempo. había puesto elmaxconnratea 1.000. Sin embargo,mostrar informaciónme mostraba una tasa de conexión más baja de entre 10 y 15, así que no pensé que estaba alcanzando ese límite. Solo pude mantener un máximo de 500 solicitudes/s (confirmadas por mis servidores backend), y cada solicitud requirió una conexión al cliente y una segunda al backend. Por lo tanto, estaba usando 1000 conexiones por segundo.

Eliminé este límite y pude mantener una tasa de conexión más alta.

información relacionada