HAProxy는 리소스 사용량이 낮은 연결을 거부합니다.

HAProxy는 리소스 사용량이 낮은 연결을 거부합니다.

내 haproxy 서버가 특정 임계값 이후에 새 연결을 거부(또는 시간 초과)하는 데 문제가 있습니다. 프록시 서버는 AWS입니다.c5.대형2개의 CPU와 4GB의 RAM을 갖춘 EC2입니다. 우리 사이트의 두 연결 유형 모두에 동일한 구성이 사용됩니다. 일반적으로 웹소켓 연결에 대한 하나가 있습니다.2K-4K동시 연결 및 요청 속도는 약10/초. 다른 하나는 nginx를 백엔드로 사용하는 일반 웹 트래픽용입니다.400-500동시 연결 및 요청 속도는 약100-150/초. 두 가지 모두에 대한 일반적인 CPU 사용량은 약3~5%haproxy 프로세스에 대해2~3%웹소켓 프록시에 사용되는 메모리(40-60MB) 및1-3%웹 프록시에 사용되는 메모리(30-40MB).

연결된 구성에 따라 CPU는 하나의 프로세스와 두 개의 스레드가 실행되는 두 CPU에 매핑됩니다. 두 트래픽 유형 모두 일반적으로 95%(또는 그 이상) SSL 트래픽입니다. 나는 다음을 사용하여 프록시 정보를 보았습니다.watch -n 1 'echo "정보 표시" | socat 유닉스:/run/haproxy/admin.sock -'내 한계에 도달했는지 확인하기 위해 노력했지만 실제로는 그렇지 않은 것 같습니다.

트래픽이 많은 시간에 문제가 발생하기 시작하면 웹소켓 동시 연결이 약5K웹 요청 비율은 최대400개 요청/초. 구성이 높은 동시 연결 및 요청 속도를 처리할 수 있다는 것을 알고 있기 때문에 여기서 두 서버를 모두 언급했지만 도달한 다른 리소스 제한이 누락되었습니다. 정상적인 조건에서는 모든 것이 잘 작동합니다. 그러나 우리가 보는 문제는ERR_CONNECTION_TIMED_OUT(크롬에서) 유형 오류. 502 오류가 전혀 표시되지 않습니다. 또한 다른 프로세스가 서버에서 더 많은 CPU나 메모리를 사용하는 것을 볼 수 없습니다. 또한 제한 설정 및 sysctl 설정과 같은 관련 가능성이 있는 다른 구성도 첨부합니다.

내가 놓친 것이 무엇인지 아이디어가 있습니까? 나는 읽고 있는가?맨 위그리고PS 보조 | 그렙 하프록시잘못된 CPU/Mem 사용량이 표시됩니까? 일부 TCP 연결 제한이 누락되었나요? 백엔드 서버(nginx/websocket)가 작동 중이지만 결코 과세되지 않는 것 같습니다. 우리는 훨씬 더 많은 연결과 트래픽으로 이를 로드 테스트했으며 백엔드 서버를 제한하기 오래 전에 프록시에 의해 제한되었습니다.

정말 감사합니다.

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

출력haproxy -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

제한.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

330개의 동시 연결과 80개의 요청/초를 포함한 일반적인 로드PS 보조 | 그렙 하프록시산출:

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

OS는 Ubuntu 16.04입니다.

답변1

대답은 내내 내 얼굴을 쳐다보고 있다는 것이 밝혀졌습니다. 나는maxconnrate1,000까지. 하지만,정보 표시10~15 사이의 낮은 연결 속도를 보여주었기 때문에 그 한계에 도달했다고 생각하지 않았습니다. 초당 최대 500개의 요청(백엔드 서버에서 확인됨)만 유지할 수 있었으며, 각 요청에는 클라이언트에 대한 연결 한 번과 백엔드에 대한 두 번째 연결이 필요했습니다. 따라서 초당 1,000개의 연결을 사용하고 있었습니다.

이 제한을 제거하여 더 높은 연결 속도를 유지할 수 있었습니다.

관련 정보