HAProxy 加载 1-2 分钟后超时

HAProxy 加载 1-2 分钟后超时

我正在将我们的 Web 负载均衡从 Nginx 切换到 HAProxy。目前我们的设置在 nginx 中运行良好,但我们希望通过服务检查实现更多的冗余。我们的后端是 Golang 应用程序。

为了简单起见,我们只使用一个配置相当简单的 HAProxy 服务器,但似乎在加载大约 1-2 分钟后,客户端就会报告向应用程序发送超时信息。我们的超时时间相当短(100 毫秒),但都是本地流量,应用程序通常在 2-3 毫秒内响应。

但是,我们平台上每秒发布的帖子数约为 2k,因此我对 Linux 进行了一些小调整,以降低 TCP 连接数。也许我在这里遗漏了什么。

以下是这些请求的简单流程。所有这些请求都位于我们的数据中心内。

请求者 -> 本地 nginx 服务器(路由器) -> haproxy -> 应用服务器

/etc/sysctl.conf
# Decrease TIME_WAIT seconds
net.ipv4.tcp_fin_timeout = 30

# Recycle and Reuse TIME_WAIT sockets faster
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

这是我们的 haproxy 配置。这里没什么奇怪的。

global
  ca-base  /etc/ssl/certs
  crt-base  /etc/ssl/private
  log  127.0.0.1   local0
  log  127.0.0.1   local1 notice
  ssl-default-bind-ciphers  ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
  ssl-default-bind-options  no-sslv3
  stats  socket /run/haproxy/admin.sock mode 660 level admin
  stats  timeout 30s

defaults
  errorfile  400 /etc/haproxy/errors/400.http
  errorfile  403 /etc/haproxy/errors/403.http
  errorfile  408 /etc/haproxy/errors/408.http
  errorfile  500 /etc/haproxy/errors/500.http
  errorfile  502 /etc/haproxy/errors/502.http
  errorfile  503 /etc/haproxy/errors/503.http
  errorfile  504 /etc/haproxy/errors/504.http
  mode  http
  option  httplog
  option  dontlognull
  timeout  connect 5000
  timeout  client 50000
  timeout  server  50000

frontend http-in
  bind *:80
  default_backend data_api

backend data_api
  option httpchk GET /status/version
  server gopp1 10.10.85.3:8000 check
  server gopp2 10.10.85.4:8000 check
  server gopp3 10.10.85.5:8000 check
  stats enable
  stats hide-version
  stats scope .
  stats uri /admin?stats
  stats realm   Haproxy\ Statistics
  stats auth    admin:secret
  stats admin   if TRUE

答案1

maxcon在 HAProxy 中的值是多少?另外,请maxsock在 HAProxy 统计界面中检查您的值(通常为ulimit -n),以确保您没有用尽文件描述符。

我们已经对 400,000 RPM 进行了负载测试(注意:不使用 SSL Offload)。这是我们的 haproxy 配置,前端/后端没有特别的性能相关。

 global
    log       127.0.0.1 local2
    chroot    /var/lib/haproxy
    pidfile   /var/run/haproxy.pid
    maxconn   25000
    user      haproxy
    group     haproxy
    daemon

    spread-checks 4
    tune.maxrewrite 1024

defaults
  mode                    http
  log                     global
  option                  httplog
  option                  dontlognull
  option http-server-close
  option                  redispatch
  retries                 3
  timeout http-request    10s
  timeout queue           1m
  timeout connect         10s
  timeout client          1m
  timeout server          1m
  timeout http-keep-alive 10s
  timeout check           10s
  maxconn                 25000

这是我们使用的内核参数。

net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_local_port_range = 1025 65534
net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 10000
fs.file-max = 65536
fs.nr_open = 65536

还设置 /etc/security/limits.conf 以允许 65536 个文件描述符。

haproxy           soft    nofile          63536
haproxy           hard    nofile          63536
root              soft    nofile          63536
root              hard    nofile          63536

相关内容