今年早些时候,我们对 NGINX Plus 的性能进行了基准测试,并创建了一个 尺寸指南 将其部署在裸机服务器上。 NGINX Open Source 和 NGINX Plus 广泛用于第 7 层负载均衡,也称为应用负载均衡。
[编辑– 我们定期更新尺寸指南,以反映 NGINX Plus 功能和硬件成本及性能的变化。 上面的链接始终指向最新指南。
有关 NGINX 和 NGINX Plus 作为 Web 服务器的性能的信息,请参阅测试 NGINX 和 NGINX Plus Web 服务器的性能。
该尺寸指南概述了 NGINX Plus 在不同服务器尺寸上运行所能实现的性能,以及硬件的预计成本。 您可以使用规模指南来适当地指定 NGINX Plus 部署,并尽可能避免过度配置(这会立即花费您的金钱)或配置不足(这可能会导致性能问题,并从长远来看花费您的金钱)。
我们对尺寸指南非常感兴趣,并且客户和其他有兴趣重现我们结果的人对我们使用的方法提出了疑问。 这篇博客文章概述了我们为实现尺寸指南中提出的结果而进行的测试。 它涵盖了我们使用的拓扑、我们运行的测试以及我们如何找到尺寸指南中列出的价格。
笔记: 虽然我们专门为 NGINX Plus 开发了尺寸指南,但我们使用 NGINX 开源进行测试,以便任何人都可以在没有 NGINX Plus 订阅的情况下重现我们的测试。 测试不使用 NGINX Plus 的任何增强功能,因此 NGINX Open Source 和 NGINX Plus 的结果相同。 NGINX 开源版本 1.9.7大致对应于 NGINX Plus Release 7。
但是,为了在测试拓扑中更好地区分反向代理和后端 Web 服务器,我们将前者称为 NGINX Plus,将后者称为 NGINX(开源)。
所有测试均使用三台独立的机器在简单、扁平的第 2 层网络中通过双 40 GbE 链路连接在一起完成。
为了从客户端机器生成流量,我们使用了wrk
,一种类似于ab
(ApacheBench)的性能测试工具。 如图所示,所有流量都被定向到 NGINX Plus反向代理,后者将连接转发到 NGINX 开源Web 服务器后端。
我们使用以下硬件进行测试。
机器 | 中央处理器 | 网络 | 记忆 |
---|---|---|---|
客户 | 2 个 Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36 个真实(或 72 个 HT)核心 | 2 个英特尔 XL710 40GbE QSFP+(修订版 01) | 16 GB |
反向代理 | 2 个 Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36 个真实(或 72 个 HT)核心 | 4 个英特尔 XL710 40GbE QSFP+(修订版 01) | 16 GB |
Web 服务器 | 2 个 Intel(R) Xeon(R) CPU E5‑2699 v3 @ 2.30GHz,36 个真实(或 72 个 HT)核心 | 2 个英特尔 XL710 40GbE QSFP+(修订版 01) | 16 GB |
我们使用以下软件进行测试:
wrk
4.0.0 版本产生了 NGINX 代理的流量。 我们根据这些说明进行了安装。我们测试了具有不同数量 CPU 的 NGINX Plus 反向代理服务器的性能。 一个 NGINX Plus工作
进程消耗一个 CPU,因此为了测量不同数量 CPU 的性能,我们改变了工作
进程的数量,使用两个工作
进程、四个、八个等重复测试。 有关 NGINX 架构的概述,请参阅我们的博客。
笔记: 要手动设置工作
进程的数量,请使用worker_processes
指令。 默认值为auto
,它告诉 NGINX Plus 检测 CPU 数量并每个 CPU 运行一个工作
进程。
我们测量了以下指标:
为了生成所有客户端流量,我们使用了带有以下选项的wrk
:
-c
选项指定要创建的 TCP 连接数。 为了测试,我们将其设置为 50 个连接。-d
选项指定生成流量的时间。 我们每次测试都进行了 3 分钟。-t
选项指定要创建的线程数。 我们指定了单个线程。为了充分锻炼每个 CPU,我们使用了taskset
,它可以将单个wrk
进程固定到一个 CPU。 与增加工作
线程数量相比,此方法可产生更一致的结果。
为了测量每秒请求数(RPS),我们运行了以下脚本:
对于 i 在 `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; 中执行任务集 -c $i wrk -t 1 -c 50 -d 180s http://反向代理服务器 IP 地址/1kb.bin & done
这项测试为每个 CPU 生成了一个wrk
副本,我们的客户端机器总共有 36 个副本。 每个副本创建了 50 个 TCP 连接,并通过这些连接连续请求 1 KB 文件 3 分钟(180 秒)。
为了测量每秒 SSL/TLS 交易数 (TPS),我们运行了以下脚本:
对于 `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))` 中的 i;执行任务集 -c $i wrk -t 1 -c 50 -d 180s -H'连接:关闭' https://反向代理服务器 IP 地址/0kb.bin & 完成
此测试使用与上一个测试相同的-c
、 -d
和-t
值,但由于重点是处理 SSL/TLS 连接,因此在两个显著方面有所不同:
-H
选项设置Connection:
close
HTTP 标头)。为了测量吞吐量,我们运行了以下脚本:
对于 i 在 `seq 0 $(($(getconf _NPROCESSORS_ONLN) - 1))`; 中执行任务集 -c $i wrk -t 1 -c 50 -d 180s http://反向代理服务器 IP 地址/1mb.bin & done
与第一次测试唯一的区别是文件大小更大,为 1 MB。 我们发现,使用更大的文件大小(10 MB)并没有增加整体吞吐量。
在我们的测试中,我们使用了多张网卡。 以下稍作修改的脚本可确保流量在两张卡之间均匀分配:
对于 i 在 `seq 0 $((($(getconf _NPROCESSORS_ONLN) - 1)/2))`; do n=`echo $(($i+ number-of-CPUs/2 ))`; taskset -c $i ./wrk -t 1 -c 50 -d 180s http://反向代理服务器 IP 地址-1 /1kb.bin & taskset -c $n ./wrk -t 1 -c 50 -d 180s http://反向代理服务器 IP 地址-2 /1kb.bin & done
最后一步,一旦我们获得了不同核心数的性能数字,就是确定具有相应规格的服务器的成本。 我们使用的戴尔 PowerEdge 服务器的价格与我们在测试中使用的英特尔硬件的规格相似。 下面的附录包含每个服务器的完整物料清单,以及反向代理和Web 服务器的完整 NGINX 配置。
尺寸指南中的价格适用于以下戴尔硬件配置。
笔记: 我们进行测试时,具有所示规格和价格的服务器型号是可用的,但将来可能会发生变化。
服务器模型 | 规格 | 价格 |
---|---|---|
戴尔 PowerEdge R230 | 中央处理器: 2 核英特尔酷睿 I3 6100 3.7GHz,2C/4T 内存: 4GB 硬盘: 500 GB 网卡: 英特尔 X710 2×10 Gbe |
1,200 美元 |
中央处理器: 英特尔® 至强® E3‑1220 v5 3.0 GHz,4C/8T 内存: 4GB 硬盘: 500 GB 网卡: 英特尔XL710 2×40 Gbe |
1,400美元 | |
戴尔 PowerEdge R430 | 中央处理器: 英特尔® 至强® E5‑2630 v3 2.4GHz,8C/16T 内存: 4GB 硬盘: 500 GB 网卡: 英特尔XL710 2×40 Gbe |
2,200 美元 |
中央处理器: 2 个英特尔® 至强® E5‑2630 v3 2.4 GHz,8C/16T 内存: 8 GB 硬盘: 500 GB 网卡: 英特尔XL710 2×40 Gbe |
3,000 美元 | |
戴尔 PowerEdge R630 | 中央处理器: 2 个英特尔® 至强® E5-2697A v4 2.6GHz,16C/32T 内存: 8 GB 硬盘: 500 GB 网卡: 英特尔XL710 2×40 Gbe |
8,000美元 |
中央处理器: 2 个英特尔® 至强® E5‑2699 v3 2.3GHz,18C/36T 内存: 8 GB 硬盘: 500 GB 网卡: 英特尔XL710 2×40 Gbe |
11,000美元 |
NGINX Plus反向代理上使用了以下配置。 请注意两组keepalive_timeout
和keepalive_requests
指令:
否则,该配置是一个相当标准的反向代理服务器配置,NGINX Plus 使用proxy_pass
指令代理到 Web 服务器。
用户 nginx;worker_processes 自动;worker_rlimit_nofile 10240;pid /var/run/nginx.pid;事件 {worker_connections 10240;accept_mutex 关闭;multi_accept 关闭;} http {access_log 关闭;包括/etc/nginx/mime.types;default_type应用/octet-stream;log_format main'$remote_addr - $remote_user [$time_local]“$request”''$status $body_bytes_sent“$http_referer”''“$http_user_agent”“$http_x_forwarded_for”“$ssl_cipher”''“$ssl_protocol”';sendfile 打开;# RPS 测试 keepalive_timeout 300s;keepalive_requests 1000000; # SSL/TLS TPS 测试 #keepalive_timeout 0; #keepalive_requests 1; 上游 Web 服务器 { 服务器Web 服务器 IP 地址; } 服务器 { 监听 80; 监听 443 ssl backlog=102400 重用端口; ssl_certificate /etc/nginx/ssl/rsa-cert.crt; ssl_certificate_key /etc/nginx/ssl/rsa-key.key; ssl_session_tickets off; ssl_session_cache off; root /var/www/html; location / { proxy_pass http://webserver; } } } }
以下配置在 NGINX Web 服务器上使用。 它按照root
指令的配置,从/var/www/html/提供静态文件。 静态文件是使用dd
生成的;此示例创建一个 1 KB 的零文件:
dd if=/dev/zero of=1kb.bin bs=1KB count=1
配置:
用户 nginx;
worker_processes 自动;
worker_rlimit_nofile 10240;
pid /var/run/nginx.pid;
事件 {
工人连接10240;
accept_mutex 关闭;
多接受关闭;
}
http {
访问登录关闭;
包括/etc/nginx/mime.types;
默认类型应用/八位字节流;
log_format 主要'$remote_addr-$remote_user[$time_local]“$request”'
'$status $body_bytes_sent "$http_referer" '
'“$http_user_agent”“$http_x_forwarded_for”“$ssl_cipher”'
'“$ssl_protocol”';
发送文件;
保持活动超时 300 秒;
keepalive_请求数 1000000;
服务器 {
听80;
根目录/var/www/html;
}
}
要亲自尝试 NGINX Plus,请立即开始30 天免费试用,或联系我们讨论您的用例。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”