У меня проблемы с моими серверами haproxy, которые отклоняют новые соединения (или отключают их по таймауту) после определенного порога. Прокси-серверы — это AWSc5.большойEC2 с 2 процессорами и 4 ГБ оперативной памяти. Для обоих типов соединения на нашем сайте используется одна и та же конфигурация, у нас есть одна для соединений веб-сокетов, которые обычно имеют между2К-4Кодновременных подключений и скорость запросов около10/с. Другой — для обычного веб-трафика с nginx в качестве бэкэнда с примерно400-500одновременных подключений и скорость запросов около100-150/с. Типичное использование процессора для обоих составляет около3-5%на процессе haproxy, с2-3%памяти, используемой для прокси-сервера веб-сокета (40-60 МБ) и1-3%памяти, используемой для веб-прокси (30-40 МБ).
Согласно прикрепленной конфигурации, процессоры отображаются на обоих процессорах, с одним процессом и двумя запущенными потоками. Оба типа трафика обычно составляют 95% (или выше) трафика SSL. Я просмотрел информацию о прокси, используяwatch -n 1 'echo "показать информацию" | socat unix:/run/haproxy/admin.sock -'чтобы проверить, не достигаю ли я каких-либо своих пределов, но, похоже, это не так.
В периоды высокого трафика, когда мы начинаем замечать проблемы, число одновременных подключений к веб-сокетам достигает примерно5Ки скорость веб-запросов достигает400 запросов/с. Я упоминаю оба сервера здесь, потому что знаю, что конфигурация может справиться с большим количеством одновременных подключений и частотой запросов, но я не вижу, чтобы был достигнут какой-то другой предел ресурсов. В нормальных условиях все работает просто отлично; однако, проблемы, которые мы видим, этоERR_CONNECTION_TIMED_OUT(из chrome) ошибок типа. Я никогда не вижу никаких ошибок 502. И я не вижу, чтобы какой-либо другой процесс использовал больше процессора или памяти на сервере. Я также прилагаю некоторые другие, возможно, релевантные конфигурации, такие как установка моих лимитов и настроек sysctl.
Есть идеи, что я мог упустить? Читаю ли явершинаиps aux | grep haproxyнеправильно и вижу неправильное использование процессора/памяти? Я упускаю какой-то лимит соединений 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 aux | grep haproxyвыход:
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
а операционная система — Ubuntu 16.04.
решение1
Оказывается, ответ все это время был у меня перед глазами. Я установилмаксконнрейтдо 1000. Однако,показать информациюпоказывал мне более низкую скорость соединения между 10-15, поэтому я не думал, что достигаю этого предела. Я мог поддерживать максимум 500 запросов/с (подтверждено моими серверами бэкэнда), причем каждый запрос требовал одного соединения с клиентом и второго с бэкэндом. Таким образом, я использовал 1000 соединений в секунду.
Я снял это ограничение и смог поддерживать более высокую скорость соединения.