今年早些时候,我们对 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 链路。
![Two instances of NGINX were deployed for the tests in our sizing guide: one as a reverse proxy server (load balancer type configuration) and another as web server](https://www.nginx-cn.net/wp-content/uploads/2019/05/nginx-plus-sizing-guide_topology.png)
为了从客户端计算机生成流量,我们使用了 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 代理的流量。 我们根据这些说明进行了安装。 - 在 反向代理和 Web 服务器上运行NGINX 1.9.7开源版本。我们根据这些说明,从位于nginx.org 的官方存储库中进行了安装。
- 三台服务器运行的系统版本是Ubuntu Linux 14.04.1。
测试方法
我们使用不同数量的 CPU 测试了 NGINX Plus 反向代理服务器的性能。一个 NGINX Plus worker
进程消耗一颗CPU,因此为了测量不同数量 CPU 的性能,我们改变了 worker
进程的数量,使用两个、四个、八个 worker
进程重复进行了测试。有关 NGINX 架构的概述,请参阅我们的博客。
注意:如欲手动设置 worker
进程数,请使用 worker_processes
指令。 默认值为 auto
,这表示 NGINX Plus 会检测 CPU 数量并为每颗 CPU 运行一个 worker
进程。
性能指标
我们对以下指标进行了测量:
- 每秒请求数 (RPS) – 测量处理每秒 HTTP 请求的能力。在我们的测试中,每个客户端都通过 keepalive 连接发送对 1 KB 文件的请求。反向代理会处理每个请求,并通过另一个 keepalive 连接将其转发到 Web 服务器。
- 每秒 SSL/TLS 事务 (TPS) – 测量处理每秒新建 SSL/TLS 连接的能力。在我们的测试中,每个客户端都会通过新连接发送一系列 HTTPS 请求。反向代理解析请求,然后通过建立的 keepalive 连接将这些请求转发到 Web 服务器。Web 服务器会就每个请求返回 0 字节响应。
- 吞吐量 – 测量 NGINX Plus 通过 HTTP 为 1 MB 文件提供服务时可维持的吞吐量。
运行测试
为了生成所有客户端流量,我们在使用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 事务
为了测量每秒 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 标头)。 - 所请求的文件大小为 0(零)字节,而不是 1 KB。
吞吐量
为了测量吞吐量,我们运行了以下脚本:
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服务器规格及价格信息仅供参考,最终采购价格以服务器厂商实际报价为准。
服务器型号 | 规格 | 价格 |
---|---|---|
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 反向代理配置
在 NGINX Plus 反向代理上使用了以下配置。请注意 keepalive_timeout
和 keepalive_requests
这两个指令集:
- 对于 SSL/TLS TPS 测试,我们设置了两个指令的数值,以确保连接仅面向一个请求保持打开,因为该测试的目标是查看 NGINX Plus 每秒可以处理的 SSL/TLS 连接数量。SSL/TLS 会话缓存也被禁用。
- 在 RPS 测试中,对指令进行了微调,以确保连接维持尽可能长的时间。
否则,该配置会是相当标准的反向代理服务器配置,其中 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;
}
}
}
}
NGINX Web 服务器配置
在 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 天免费试用版,或与我们联系以讨论您的应用场景。