NGINX 压测方案

本文最后更新于:2025年2月22日 下午

NGINX Sizing 指南:如何进行测试

一 拓扑和硬件

1.1 拓扑

所有测试均使用三个独立的机器完成,这几台机器通过双 40 GbE 链路连接在一个简单,平坦的 2 层网络中. (下图软件版本有更新)

用于NGINX性能测试的标准端到端拓扑结构

为了从客户端机器生成流量,我们使用了 wrk —— 类似于 ab(ApacheBench)的性能测试工具。所有流量都被定向到 NGINX 反向代理服务器,后者将连接转发到 Web 服务器后端。

1.2 硬件

机器 CPU 网络 内存
客户端 16 real cores (非超线程) 略 16GB
反向代理服务器 16 real cores (非超线程) 略 16GB
应用服务器 16 real cores (非超线程) 略 16GB

二 使用的软件

  • wrk 在客户端计算机上运行 4.0.0 版生成了 NGINX 代理的流量。我们按照这些说明安装了它。

三 测试方法

测试了 NGINX 作为具有不同 CPU 数量的反向代理服务器的性能。一个 NGINX worker 进程消耗一个 CPU,因此为了测量不同数量的 CPU 的性能,我们改变了 NGINX worker 进程的数量,用两个,四个,八个等等 worker 进程重复测试。

ℹ️注意:

要手动设置 NGINX worker 进程数,请使用 worker_processes 指令。默认值为 auto。

四 性能指标

测量以下性能指标:

  • 每秒请求数(RPS) - 衡量处理 HTTP 请求的能力。在测试中,每个客户端通过 keepalive 连接发送 1 KB 大小文件的请求。反向代理服务器处理每个请求,并通过另一个 keepalive 连接将其转发到 Web 服务器。
  • 每秒 SSL/TLS 事务数(TPS) - 衡量处理新 SSL / TLS 连接的能力。在测试中,每个客户端都会发送一系列 HTTPS 请求,每个请求都在一个新连接上。反向代理服务器解析请求并通过已建立的 keepalive 连接将它们转发到 Web 服务器。Web 服务器为每个请求发回 0 字节的响应。
  • 吞吐量 - 测量 NGINX 在通过 HTTP 提供 1 MB 文件时可以承受的吞吐量。

📑引用:

NGINX 关键性能指标

五 运行测试

要生成所有客户端流量,我们使用 wrk 工具的以下选项:

  • -c 选项指定要创建的 TCP 连接数。对于我们的测试,我们将其设置为 50 个连接。
  • -d 选项指定生成流量的时间。我们每次运行测试 3 分钟。
  • -t 选项指定要创建的线程数。我们指定了一个线程。

通过 taskset 指令,充分使用每个 CPU ,可以将单个 wrk 进程固定到 CPU。与增加 wrk 线程数相比,此方法产生更一致的结果。

5.1 每秒请求数 (Requests Per Second)

为了测量每秒请求数(RPS),运行以下脚本:

1
2
3
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 的一个副本。每个副本创建 50 个 TCP 连接,并在其上连续请求 1 KB 文件 3 分钟(180 秒)。

5.2 每秒 SSL/TLS 事务数

为了测量每秒 SSL/TLS 事务(TLS),我们运行了以下脚本:

1
2
3
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 的大小。

5.3 吞吐量

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

1
2
3
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

与第一个测试的唯一区别是文件更大,大小为 1 MB。我们发现使用 10 MB 的较大文件大小并未提高整体吞吐量。

在 Linux 上安装 wrk

wrk 需要 openssl dev 包和 gcc/dev 堆栈。

以下是关于如何在 Linux 上安装 wrk 的简要说明。

CentOS/RedHat/Fedora

1
2
3
4
5
6
7
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
#将可执行文件移动到 PATH 中的某个位置
sudo cp wrk /somewhere/in/your/PATH

安装构建工具,openssl dev libs(包括头文件)和 git。然后使用 git 下载 wrk 并构建。


NGINX 压测方案
https://ewhisper.cn/posts/1151/
作者
东风微鸣
发布于
2021年9月26日
许可协议