Linux

HAProxy 拒絕資源使用率低的連接

  • February 8, 2020

我的 haproxy 伺服器在某個門檻值後拒絕新連接(或將它們超時)時遇到問題。代理伺服器是 AWS c5.large EC2,具有 2 個 CPU 和 4GB 記憶體。我們網站上的兩種連接類型都使用相同的配置,我們有一種用於 websocket 連接,通常具有2K-4K 的並發連接和大約****10/s的請求率。另一種是正常的網路流量,以 nginx 為後端,並發連接數約為400-500,請求率約為100-150/s。兩者的典型 cpu 使用率在 haproxy 程序上約為3-5% ,其中****2-3%的記憶體用於 websocket 代理 (40-60MB) 和用於 Web 代理的記憶體的1-3% (30-40MB)。

根據附加的配置,cpus 映射到兩個 cpus,一個程序和兩個執行緒在執行。這兩種類型的流量通常都是 95%(或更高)的 SSL 流量。我已經使用**watch -n 1 ’echo “show info” |觀看了代理資訊。socat unix:/run/haproxy/admin.sock -’**看看我是否達到了我的任何限制,但似乎並非如此。

在高流量期間,當我們開始看到問題時,我們的 websocket 並發連接數達到5K左右,網路請求率達到400 個請求/秒。我在這裡提到兩台伺服器是因為我知道配置可以處理高並發連接和請求率,但我錯過了其他一些資​​源限制。在正常情況下,一切正常;但是,我們看到的問題是ERR_CONNECTION_TIMED_OUT(來自 chrome)類型錯誤。我從來沒有看到任何 502 錯誤。我也沒有看到任何其他程序在伺服器上使用更多的 CPU 或記憶體。我還附加了一些其他可能相關的配置,例如設置我的限制和 sysctl 設置。

有什麼想法我可能會錯過嗎?我在讀topps aux 嗎?grep haproxy錯誤並看到錯誤的 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 <willy@haproxy.org>

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 輔助 | 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。

原來答案一直盯著我看。我已將maxconnrate設置為 1,000。但是,顯示資訊顯示我的連接率較低,介於 10-15 之間,所以我認為我沒有達到這個限制。我最多只能維持 500 個請求/秒(由我的後端伺服器確認),每個請求需要一個連接到客戶端,一個連接到後端。因此,我每秒使用 1,000 個連接。

我取消了這個限制,我能夠維持更高的連接速率。

引用自:https://serverfault.com/questions/1000891