내 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개의 연결을 사용하고 있었습니다.
이 제한을 제거하여 더 높은 연결 속도를 유지할 수 있었습니다.