在 doc.traefik.io 上有一张图片
随着 web 应用变得越来越复杂和流量增加,选择一个高性能的反向代理服务器对于向用户提供快速且可靠的内容来说至关重要。Traefik v3 和 Nginx 是两个广泛使用的反向代理服务器,它们提供了强大的 HTTP 性能支持。然而,它们在处理 HTTP 请求和响应时存在显著差异,从而导致吞吐量、延迟和资源利用率的差异。
在本文中,我将比较 Traefik v3 和 Nginx 的 HTTP 性能表现,重点考察请求率、响应时间和资源吞吐量等性能指标。我还将考察影响它们性能的因素,例如配置选项和设置、负载均衡算法和缓存机制。读完本文后,您将能更好地理解 Traefik v3 和 Nginx 在 HTTP 性能上的优缺点,并能够确定哪种工具最适合您的特定应用场景。
目的简介本文的目的是比较 Traefik v3 和 Nginx 这两个在现代云原生环境中常用的反向代理服务器的 HTTP 性能。尽管 Traefik v3 仍处于测试版,但 Traefik 团队声称其 HTTP 性能优于前一代 Traefik v2。我打算验证这一说法,并提供 Traefik v3 与 Nginx 在 HTTP 性能上的客观比较。通过进行自己的性能测试并分享结果,我们希望帮助开发人员和 DevOps 工程师在为他们的应用程序选择反向代理服务器时做出明智的选择。
[Traefik Proxy 3.0:范围和 Beta 计划 | Traefik LabsTraefik Proxy 3.0 即将推出,所有用户请注意!在 Hackathon 之后,以及其他活动之后,以及大量的……traefik.io](https://traefik.io/blog/traefik-proxy-3-0-scope-beta-program-and-the-first-feature-drop/?source=post_page-----f28ffb7eed3e--------------------------------)
测试案例,注意:在中文中,为了模仿英文原文中的结构(即井号后跟一个空格),这里用逗号来表示一个短暂的停顿。
为了比较Traefik v3、Nginx、Traefik v2与纯whoami的HTTP性能,我使用了wrk基准测试工具进行了一系列测试。我使用了一个运行在单一虚拟机上的示例API应用程序(whoami/go),该虚拟机配备了16个vCPU、32GB的RAM,运行Fedora操作系统和Docker v23.0.2。API应用程序包含一个简单的REST API,该API返回JSON响应(1)。
首先,我测试了每个工具能处理的最大请求数,在保持稳定响应时间的同时。对于 Traefik v3,我使用了默认配置,使用了 RoundRobin 负载均衡算法,但没有启用缓存。对于 Nginx,我同样使用了默认配置,使用了负载均衡算法,但没有启用缓存。我记录了实际达到的请求数量和平均响应时间。
version: "3.9"
services:
traefik-v3.0:
image: "traefik:v3.0"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:8000"
- "--serverstransport.maxidleconnsperhost=100000"
ports:
- "8000:8000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# 这里定义了 Traefik v3.0 的服务配置
traefik-v2.9:
image: "traefik:v2.9"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:8002"
- "--serverstransport.maxidleconnsperhost=100000"
ports:
- "8002:8002"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# 这里定义了 Traefik v2.9 的服务配置
nginx:
image: nginx:alpine
ports:
- "8001:8001"
volumes:
- "./nginx.conf:/etc/nginx/nginx.conf:ro"
- "./whoami.conf:/etc/nginx/conf.d/whoami.conf:ro"
# 这里定义了 Nginx 的服务配置
whoami-1:
image: "containous/whoami"
ports:
- "8003:80"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(`benchmark.whoami`)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"
# 这里定义了 whoami-1 的服务配置
whoami-2:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(`benchmark.whoami`)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"
# 这里定义了 whoami-2 的服务配置
whoami-3:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(`benchmark.whoami`)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"
# 这里定义了 whoami-3 的服务配置
whoami-4:
image: "containous/whoami"
labels:
- "traefik.enable=true"
- "traefik.http.routers.go-benchmark.rule=Host(`benchmark.whoami`)"
- "traefik.http.services.go-benchmark.loadbalancer.server.port=80"
# 这里定义了 whoami-4 的服务配置
用户为 nginx;
工作进程设置为自动;
工作进程文件描述符限制为 200000;
进程ID文件位置 /var/run/nginx.pid;
事件 {
工作进程连接 10000;
使用 epoll;
允许多次接受 on;
}
http {
发送文件 on;
tcp_nopush on;
tcp_nodelay on;
保持连接的超时时间 300;
保持连接的最大请求数 10000;
类型哈希的最大大小 2048;
打开文件缓存 最大=200000 不活跃=300秒;
打开文件缓存有效 300秒;
打开文件缓存最小使用次数 2;
打开文件缓存中的错误信息 on;
关闭服务器令牌;
关闭Dav方法;
包含 /etc/nginx/mime.types;
默认类型 application/octet-stream;
访问日志 /var/log/nginx/access.log 组合格式;
错误日志 /var/log/nginx/error.log 警告;
压缩 off;
关闭压缩变化功能;
包含 /etc/nginx/conf.d/*.conf;
包含 /etc/nginx/sites-enabled/*.conf;
}
upstream whoami {
server whoami-1:80;
server whoami-2:80;
server whoami-3:80;
server whoami-4:80;
keepalive 300;
}
server {
listen 8001;
server_name benchmark.whoami;
access_log off;
error_log /dev/null crit;
location / {
proxy_pass http://whoami;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 80;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $server_addr;
proxy_set_header X-Real-IP $remote_addr;
}
}
sysctl -w fs.file-max="9999999" # 设置文件的最大数量为9999999
sysctl -w fs.nr_open="9999999" # 设置打开文件的最大数量为9999999
sysctl -w net.core.netdev_max_backlog="4096" # 设置网络设备的最大延迟队列大小为4096
sysctl -w net.core.rmem_max="16777216" # 设置接收缓冲区的最大大小为16777216字节
sysctl -w net.core.somaxconn="65535" # 设置连接请求队列的最大长度为65535
sysctl -w net.core.wmem_max="16777216" # 设置发送缓冲区的最大大小为16777216字节
sysctl -w net.ipv4.ip_local_port_range="1025 65535" # 设置本地端口范围为1025到65535
sysctl -w net.ipv4.tcp_fin_timeout="30" # 设置TCP FIN超时时间为30秒
sysctl -w net.ipv4.tcp_keepalive_time="30" # 设置TCP保持连接时间为30秒
sysctl -w net.ipv4.tcp_max_syn_backlog="20480" # 设置TCP SYN队列的最大长度为20480
sysctl -w net.ipv4.tcp_max_tw_buckets="400000" # 设置TIME-WAIT连接的最大数量为400000
sysctl -w net.ipv4.tcp_no_metrics_save="1" # 禁用TCP指标保存
sysctl -w net.ipv4.tcp_syn_retries="2" # 设置TCP SYN重试次数为2
sysctl -w net.ipv4.tcp_synack_retries="2" # 设置TCP SYN-ACK重试次数为2
sysctl -w net.ipv4.tcp_tw_reuse="1" # 启用TIME-WAIT端口重用
sysctl -w vm.min_free_kbytes="65536" # 设置最小空闲内存为65536字节
sysctl -w vm.overcommit_memory="1" # 启用内存过度提交
ulimit -n 9999999 # 设置最大文件描述符数量为9999999
GitHub - thecaliskan/traefik-nginx-benchmark 您无法执行此操作,因为您已在另一个标签页或窗口中登出。GitHub
结果:
次/秒
传输速度 / MB/秒
延迟 / 时延 (毫秒)
CPU 使用CPU 占用率 (Traefik v3.0.0-beta2)
CPU 占用率 (Nginx v1.23.4),
CPU 占用率 Traefik v2.9.9
CPU 使用 (Whoami)
粗略结果 Traefik v3.0.0-beta2 wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8000/bench
在 http://127.0.0.1:8000/bench 上进行1分钟的测试
20个线程和1000个连接
线程统计(平均/标准差/最大/标准差波动率)
延迟 13.68ms 7.08ms 93.26ms 72.09%
请求数/秒 3.72k 312.65 10.22k 78.63%
延迟分布(百分位数)
50% 12.56ms
75% 17.31ms
90% 22.93ms
99% 35.96ms
在1分钟内,共处理了4448396个请求,读取了432.72MB的数据
每秒请求数:74019.30
每秒传输量:7.20MB
Nginx 1.23.4
wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8001/bench
在 http://127.0.0.1:8001/bench 运行 1 分钟(60 秒)的负载测试
20 个线程和 1000 个连接
线程统计 平均 标准差 最大 +/- 平均偏差
延迟 10.10毫秒 5.46毫秒 64.40毫秒 73.77%
Req/秒 5.06k 383.06 13.97k 73.18%
延迟分布如下
50% 9.18毫秒
75% 12.73毫秒
90% 17.02毫秒
99% 28.29毫秒
6047306 请求在 1.00 分钟内,读取 813.17MB
每秒请求数:100622.14
传输/秒: 13.53MB
Traefik: v2.9.9
TRAEFIK是一个流行的反向代理和负载均衡器,用于管理和反向代理微服务。
wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8002/bench
在 http://127.0.0.1:8002/bench 上进行1分钟的测试
20个线程和1000个连接
线程统计数据 平均 标准差 最大 +/- 标准差
延迟 13.70ms 7.04ms 91.19ms 72.17%
每秒请求 3.71k 273.76 14.31k 75.23%
延迟分布
50% 12.59ms
75% 17.30ms
90% 22.89ms
99% 35.87ms
在1分钟内发送了4438613个请求,读取了431.77MB
每秒请求数: 73853.32
每秒传输量: 7.18MB
纯Whoami(无代理)
wrk -t20 -c1000 -d60s -H "Host: benchmark.whoami" --latency http://127.0.0.1:8003/bench
运行1分钟测试于 http://127.0.0.1:8003/bench
20个线程,1000个连接
线程统计数据 平均 标准偏差 最大 +/- 标准偏差
延迟 5.47毫秒 3.18毫秒 40.75毫秒 78.18% 的范围
每秒请求量 9.21千 746.51 29.25千 74.50% 的范围
延迟分布
50% 4.95毫秒
75% 6.61毫秒
90% 9.02毫秒
99% 17.43毫秒
11014279个请求,读取1.29GB
1分钟内
每秒请求数: 183259.27
每秒传输: 22.02MB
结论部分。
性能测试比较了Nginx和Traefik v3处理HTTP请求的效果,结果引人注目。Nginx的请求数量处理率高于Traefik v3,每秒处理了100622个请求(rps),而Traefik v3为每秒73960个请求。在延迟表现方面,Traefik v3表现出较高延迟,平均响应时间为13.39毫秒,而Nginx为10.10毫秒。在传输速率方面,Nginx每秒可以传输更多的数据,传输速率为13.53MB/秒,而Traefik v3为7.19MB/秒。
总之,对 Traefik v3 和 Nginx 处理 HTTP 请求的性能对比测试表明,Traefik v3 并未如 Traefik 团队所宣称的那样,相比其上一版本 Traefik v2 在 HTTP 性能上没有达到 20% 的提升。实际上,测试结果显示 Nginx 在请求吞吐量和延迟方面超过了 Traefik v3。尽管 Traefik v3 仍处于测试版并可能进一步改进,但测试结果表明,对于需要处理高流量和高性能要求的应用程序,Traefik v3 可能并不是最佳选择。
总体而言,选择 Nginx 和 Traefik v3 处理 HTTP 请求取决于您 web 应用程序的具体需求。如果原始请求的吞吐量和低延迟是主要关注点,Nginx 可能是更好的选择。Traefik v3 的动态配置和自动服务发现功能让它更加灵活,并且更容易整合到现代容器环境中。此外,在选择反向代理服务器时,您还应该考虑易用性、灵活性和社区支持情况等因素。最后,建议您自己进行性能测试并综合考虑所有相关因素后再做决定。