今年早些时候,我们对 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 开源版还是对 NGINX Plus 进行测试,结果都是相同的NGINX开源版本1.9.7 大致对应 NGINX Plus 版本 7。
不过,为了在测试拓扑结构中更好地将反向代理与后端 Web 服务器区分开来,我们将 NGINX Plus 称为前者,将NGINX开源版称为后者。
所有测试都是使用三台独立的计算机完成的,这些计算机通过简单的2 层扁平网络连接到双 40 GbE 链路。
为了从客户端计算机生成流量,我们使用了 wrk
,一款类似于ab
(ApacheBench) 的性能测试工具。如图所示,所有流量都定向到 NGINX Plus 反向代理,该代理将连接转发到开源版 NGINX Web 服务器后端。
我们使用以下硬件进行了测试。
计算机 | CPU | 网络 | 内存 |
---|---|---|---|
客户端 | 2 颗英特尔 (R) 至强 (R) CPU E5 2699 v3 @ 2.30GHz,36 个真正(或 72 HT)内核 | 2 个英特尔 XL710 40GbE QSFP+(版本 01) | 16 GB |
反向代理 | 2 颗英特尔 (R) 至强 (R) CPU E5 2699 v3 @ 2.30GHz,36 个真正(或 72 HT)内核 | 4 个英特尔 XL710 40GbE QSFP+(版本 01) | 16 GB |
Web 服务器 | 2 颗英特尔 (R) 至强 (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 worker
进程消耗一颗CPU,因此为了测量不同数量 CPU 的性能,我们改变了 worker
进程的数量,使用两个、四个、八个 worker
进程重复进行了测试。有关 NGINX 架构的概述,请参阅我们的博客。
注意:如欲手动设置 worker
进程数,请使用 worker_processes
指令。 默认值为 auto
,这表示 NGINX Plus 会检测 CPU 数量并为每颗 CPU 运行一个 worker
进程。
我们对以下指标进行了测量:
为了生成所有客户端流量,我们在使用wrk
时用到了以下选项:
-c
选项指定了要创建的 TCP 连接数量,在我们的测试中,我们将其设置为 50 个连接。-d
选项指定了生成流量的周期。我们的每项测试均持续了 3 分钟。-t
选项指定了要创建的线程数量。我们指定了一个线程。为了充分利用每颗 CPU,我们使用了任务集
,该任务集可以将单个wrk
进程绑定到 CPU 上。与增加wrk
数量的做法相比,该方法能够产生更加一致的结果。
为了测量每秒请求数 (RPS),我们运行了以下脚本:
for i in `seq 1 number-of-CPUs`; do taskset -c $i wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address/1kb.bin &
done
该测试为每个 CPU 生成一个 wrk
副本,总共为我们的客户端计算机生成了 36 个副本。每个副本创建了 50 个 TCP 连接,并通过这些连接对 1 KB 文件发起了长达 3 分钟(180 秒)的连续请求。
为了测量每秒 SSL/TLS 事务 (TPS),我们运行了以下脚本:
for i in `seq 1 number-of-CPUs`; do taskset -c $i wrk -t 1 -c 50 -d 180s -H 'Connection: close' https://Reverse-Proxy-Server-IP-address/0kb.bin &
done
该测试使用了与上一个测试相同的 -c
、-d
和 -t
参数,但其重点是处理 SSL/TLS 连接,因此与上一个测试存在两方面的显著差异:
-H
选项设置 Connection:
close
HTTP 标头)。为了测量吞吐量,我们运行了以下脚本:
for i in `seq 1 number-of-CPUs`; do taskset -c $i wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address/1mb.bin &
done
当文件大小为1MB时测试结果与第一次测试不同,我们发现使用更大的文件(10 MB)不会增加整体吞吐量。
在我们的测试中,我们使用了多个网卡。以下经过稍微修改的脚本,可确保流量在两张网卡之间平均分配:
for i in `seq 1 number-of-CPUs/2`; do n=`echo $(($i+number-of-CPUs/2))`;
taskset -c $i ./wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address-1/1kb.bin &
taskset -c $n ./wrk -t 1 -c 50 -d 180s http://Reverse-Proxy-Server-IP-address-2/1kb.bin &
done
最后一步,就是确定相应规格的服务器的成本。针对本次测试环境,我们以Dell PowerEdge 服务器的价格作为参考。下面的附录包含每个服务器的完整物料清单,以及反向代理和 Web 服务器 的完整 NGINX 配置。
选型指南中的价格适用于以下 Dell 硬件配置。
注意:以下Dell服务器规格及价格信息仅供参考,最终采购价格以服务器厂商实际报价为准。
服务器型号 | 规格 | 价格 |
---|---|---|
Dell PowerEdge R230 | CPU:2 个内核 英特尔酷睿 I3 6100 3.7GHz,2C/4T RAM:4 GB HDD:500 GB 网卡:英特尔 X710 2×10 Gbe | $1,200 |
CPU:英特尔® 至强® E3 1220 v5 3.0GHz,4C/8T RAM: 4 GB HDD: 500 GB 网卡:英特尔 XL710 2×40 Gbe | $1,400 | |
Dell PowerEdge R430 | CPU:英特尔® 至强® E5 2630 v3 2.4GHz,8C/16T RAM: 4 GB HDD: 500 GB 网卡:英特尔 XL710 2×40 Gbe | $2,200 |
CPU:2 颗英特尔® 至强® E5 2630 v3 2.4GHz,8C/16T RAM: 8 GB HDD: 500 GB 网卡:英特尔 XL710 2×40 Gbe | $3,000 | |
Dell PowerEdge R630 | CPU:2 颗英特尔® 至强® E5 2697A v4 2.6GHz,16C/32T RAM: 8 GB HDD: 500 GB 网卡:英特尔 XL710 2×40 Gbe | $8,000 |
CPU:2 颗英特尔® 至强® E5 2699 v3 2.3GHz,18C/36T RAM: 8 GB HDD: 500 GB 网卡:英特尔 XL710 2×40 Gbe | $11,000 |
在 NGINX Plus 反向代理上使用了以下配置。请注意 keepalive_timeout
和 keepalive_requests
这两个指令集:
否则,该配置会是相当标准的反向代理服务器配置,其中 NGINX Plus 会使用 proxy_pass
指令代理到 Web 服务器。
user nginx;worker_processes auto;
worker_rlimit_nofile 10240;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
accept_mutex off;
multi_accept off;
}
http {
access_log off;
include /etc/nginx/mime.types;
default_type application/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 on;
# RPS tests
keepalive_timeout 300s;
keepalive_requests 1000000;
# SSL/TLS TPS tests
#keepalive_timeout 0;
#keepalive_requests 1;
upstream webserver {
server Web-Server-IP-address;
}
server {
listen 80;
listen 443 ssl backlog=102400 reuseport;
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;
}
}
}
}
在 NGINXWeb 服务器. It serves static files from /var/www/html/上使用了以下配置。正如root
指令所配置,它使用 /var/www/html/ 下的静态文件。该静态文件是使用dd
生成的;本示例创建一个 1 KB 的zero文件:
dd if=/dev/zero of=1kb.bin bs=1KB count=1
配置如下:
user nginx;
worker_processes auto;
worker_rlimit_nofile 10240;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
accept_mutex off;
multi_accept off;
}
http {
access_log off;
include /etc/nginx/mime.types;
default_type application/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 on;
keepalive_timeout 300s;
keepalive_requests 1000000;
server {
listen 80;
root /var/www/html;
}
}
如需使用NGINX Plus,请立即下载30 天免费试用版,或与我们联系以讨论您的应用场景。
"This blog post may reference products that are no longer available and/or no longer supported. For the most current information about available F5 NGINX products and solutions, explore our NGINX product family. NGINX is now part of F5. All previous NGINX.com links will redirect to similar NGINX content on F5.com."