NGINX 压测方案
本文最后更新于:2024年7月24日 晚上
一 拓扑和硬件
1.1 拓扑
所有测试均使用三个独立的机器完成,这几台机器通过双 40 GbE 链路连接在一个简单,平坦的 2 层网络中. (下图软件版本有更新)
为了从客户端机器生成流量,我们使用了 wrk
—— 类似于ab
(ApacheBench)的性能测试工具。所有流量都被定向到 NGINX 反向代理服务器,后者将连接转发到 Web 服务器后端。
1.2 硬件
机器 | CPU | 网络 | 内存 |
---|---|---|---|
客户端 | 16 real cores(非超线程) | 略 | 16GB |
反向代理服务器 | 16 real cores(非超线程) | 略 | 16GB |
应用服务器 | 16 real cores(非超线程) | 略 | 16GB |
二 使用的软件
三 测试方法
测试了 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 文件时可以承受的吞吐量。
📑引用:
五 运行测试
要生成所有客户端流量,我们使用 wrk
工具的以下选项:
-c
选项指定要创建的 TCP 连接数。对于我们的测试,我们将其设置为 50 个连接。-d
选项指定生成流量的时间。我们每次运行测试 3 分钟。-t
选项指定要创建的线程数。我们指定了一个线程。
通过 taskset
指令, 充分使用每个 CPU ,可以将单个 wrk
进程固定到 CPU。与增加 wrk
线程数相比,此方法产生更一致的结果。
5.1 每秒请求数 (Requests Per Second)
为了测量每秒请求数(RPS),运行以下脚本:
1 |
|
该测试每个 CPU 产生了 wrk
的一个副本。每个副本创建 50 个 TCP 连接,并在其上连续请求 1 KB 文件 3 分钟(180 秒)。
5.2 每秒 SSL/TLS 事务数
为了测量每秒 SSL/TLS 事务(TLS),我们运行了以下脚本:
1 |
|
该测试使用和先前的测试相同的 -c
,-d
和 -t
值,但有两个显着的不同,因为本次焦点在于 SSL/TLS 连接的处理:
- 客户端为每个请求打开和关闭连接(
-H
选项设置Connection:
close
HTTP 标头)。 - 请求的文件是 0 字节而不是 1 KB 的大小。
5.3 吞吐量
为了测量吞吐量,我们运行了以下脚本:
1 |
|
与第一个测试的唯一区别是文件更大, 大小为 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 并构建。