为什么 Haproxy 会达到(可变的)连接限制?

为什么 Haproxy 会达到(可变的)连接限制?

我试图理解我看到的一些数字,以及为什么 Haproxy 似乎正在达到多变的请求的限制。

测试设置非常简单:

  • 20 个在 Ubuntu VM 上运行的后端服务器提供空的 HTTP 200 响应
  • 1 个在 Ubuntu VM 上运行的 Haproxy 节点

我对每个后端服务器进行了性能测试,它们使用以下方式处理大约 8k 个请求/秒:工作量工具

将 Haproxy 放在它们前面似乎会达到~22k req/s 的上限。

Haproxy 盒上的 CPU 利用率极低(5-7%)。

我最初怀疑这可能是出站连接限制,所以我在 Haproxy 盒子上针对所有 20 个后端服务器分别并行运行 wrk 工具。它呈线性扩展 - 每个进程都能够达到 ~8k req/s。

接下来,我将后端服务器切换为提供 HTTP 204 服务的 nginx 实例

  • 直接使用 wrk 访问 nginx 端点,每秒可获得约 350k 个请求
  • 在它前面添加 Haproxy 是否可以将其减少到 ~35k req/s??

然后,我将 Haproxy 配置为为同一端点添加多个条目, IE

server nginx1 nginxbox:80 
server nginx2 nginxbox:80

这进一步降低了吞吐量,降至约 25k 请求/秒的范围

我曾进行过类似的实验,使用 Nginx 访问后端(最高速度约为 19k/s)并在 Centos 上运行 Haproxy,Haproxy 版本 1.6 和新 1.7,但结果似乎非常一致。这让我觉得 Haproxy 中缺少某种配置,但我还没能弄清楚。

注意:我特意删除了全局 maxconn,因为出于某种原因,添加它似乎会增加错误响应的数量

这是 Haproxy 配置:

global
    daemon
    log 127.0.0.1 local0
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    option  abortonclose
    retries 3
    timeout connect  5000
    timeout client  10000
    timeout server  10000


frontend www-http
    log     global
    bind *:80
    default_backend myapp_api-nossl


backend myapp_api-nossl
    http-response add-header X-App-Server %b/%s
    server myapp_vm-0 myapp_apivm-0:80 check maxconn 200
    server myapp_vm-1 myapp_apivm-1:80 check maxconn 200
    server myapp_vm-2 myapp_apivm-2:80 check maxconn 200
    server myapp_vm-3 myapp_apivm-3:80 check maxconn 200
    server myapp_vm-4 myapp_apivm-4:80 check maxconn 200
    server myapp_vm-5 myapp_apivm-5:80 check maxconn 200
    server myapp_vm-6 myapp_apivm-6:80 check maxconn 200
    server myapp_vm-7 myapp_apivm-7:80 check maxconn 200
    server myapp_vm-8 myapp_apivm-8:80 check maxconn 200
    server myapp_vm-9 myapp_apivm-9:80 check maxconn 200
    server myapp_vm-10 myapp_apivm-10:80 check maxconn 200
    server myapp_vm-11 myapp_apivm-11:80 check maxconn 200
    server myapp_vm-12 myapp_apivm-12:80 check maxconn 200
    server myapp_vm-13 myapp_apivm-13:80 check maxconn 200
    server myapp_vm-14 myapp_apivm-14:80 check maxconn 200
    server myapp_vm-15 myapp_apivm-15:80 check maxconn 200
    server myapp_vm-16 myapp_apivm-16:80 check maxconn 200
    server myapp_vm-17 myapp_apivm-17:80 check maxconn 200
    server myapp_vm-18 myapp_apivm-18:80 check maxconn 200
    server myapp_vm-19 myapp_apivm-19:80 check maxconn 200

答案1

您可能正在达到默认值(计算或编译)最大连接数限制。

你没有说你使用的是哪个版本,所以我假设是 1.6(当前稳定版本)

您可以在前端或后端进行设置。此外,您可能需要调整文件句柄 sysctl 设置。

相关内容