我试图理解我看到的一些数字,以及为什么 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