博客 | NGINX

NGINX Plus 大小指南: 我们如何测试

NGINX-F5-horiz-black-type-RGB 的一部分
Faisal Memon 缩略图
费萨尔·梅蒙
2016 年 11 月 29 日发布

今年早些时候,我们对 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 链路连接在一起完成。

使用标准的背靠背拓扑来测试 NGINX Plus 性能

为了从客户端机器生成流量,我们使用了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 代理的流量。 我们根据这些说明进行了安装。
  • NGINX Open Source 版本 1.9.7 在反向代理Web 服务器机器上运行。 我们根据这些说明nginx.org上的官方存储库安装了它。
  • 这三台机器上均运行Ubuntu Linux 14.04.1

测试方法

我们测试了具有不同数量 CPU 的 NGINX Plus 反向代理服务器的性能。 一个 NGINX Plus工作进程消耗一个 CPU,因此为了测量不同数量 CPU 的性能,我们改变了工作进程的数量,使用两个工作进程、四个、八个等重复测试。 有关 NGINX 架构的概述,请参阅我们的博客

笔记: 要手动设置工作进程的数量,请使用worker_processes指令。 默认值为auto ,它告诉 NGINX Plus 检测 CPU 数量并每个 CPU 运行一个工作进程。

绩效指标

我们测量了以下指标:

  • 每秒请求数 (RPS) – 衡量处理 HTTP 请求的能力。 在我们的测试中,每个客户端通过保持连接发送 1 KB 文件的请求。 反向代理处理每个请求并通过另一个保持活动连接将其转发到Web 服务器
  • 每秒 SSL/TLS 交易数 (TPS) – 衡量处理新 SSL/TLS 连接的能力。 在我们的测试中,每个客户端都会在一个新连接上发送一系列 HTTPS 请求。 反向代理解析请求并通过已建立的保持连接将其转发到Web 服务器Web 服务器针对每个请求发回一个 0 字节的响应。
  • 吞吐量——测量 NGINX Plus 通过 HTTP 提供 1 MB 文件时可以维持的吞吐量。

运行测试

为了生成所有客户端流量,我们使用了带有以下选项的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 交易次数

为了测量每秒 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 标头)。
  • 请求的文件大小为 0(零)字节,而不是 1 KB。

吞吐量

为了测量吞吐量,我们运行了以下脚本:

对于 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 反向代理配置

NGINX Plus反向代理上使用了以下配置。 请注意两组keepalive_timeoutkeepalive_requests指令:

  • 对于 SSL/TLS TPS 测试,我们设置了两个指令的值,以便连接仅在一个请求中保持打开,因为该测试的目标是查看 NGINX Plus 每秒可以处理多少个 SSL/TLS 连接。 SSL/TLS 会话缓存也被禁用。
  • 对于 RPS 测试,指令经过调整以尽可能长时间保持连接有效。

否则,该配置是一个相当标准的反向代理服务器配置,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 服务器配置

以下配置在 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 内容。”