基准测试工具 Wrk 的使用

背景

wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU.

Wrk 是一个轻便、高性能的、基于 C 编写的 HTTP 基准测试工具。使用它能轻松对 Web 端口进行一系列压力测试。

安装

Wrk 只能在类 Unix 系统下安装,Windows 用户建议使用 WSL。以下以 Ubuntu 为例。

编译工具/环境安装

确保安装以下包:

1
2
3
4
5
sudo apt install git
sudo apt update gcc # 可选
sudo apt install libssl-dev
sudo apt install make
sudo apt install build-essential

安装 Wrk

在希望安装 wrk 的目录中,执行:

1
2
3
git clone https://github.com/wg/wrk.git
cd wrk
make

make 操作耗时相对较长,需要耐心等待。完全安装完成后,在 wrk 目录下就能看见一个叫做 wrk 的可执行文件。此时即安装完成

基本使用

命令一览

查看 wrk 帮助信息,了解能够使用的指令及其含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost wrk]# ./wrk
Usage: wrk <options> <url>
Options:
-c, --connections <N> Connections to keep open
-d, --duration <T> Duration of test
-t, --threads <N> Number of threads to use

-s, --script <S> Load Lua script file
-H, --header <H> Add header to request
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details

Numeric arguments may include a SI unit (1k, 1M, 1G)
Time arguments may include a time unit (2s, 2m, 2h)
[root@localhost wrk]#

一个例子

在一个开源项目中,我用 wrk 来测试 kafka 的两种 Python 客户端的性能。我使用命令 ./wrk -t36 -c4000 -d30s --latency http://<server host>/cat 在相同环境下对两个采用不同 kafka 客户端的 Python FastAPI 端口进行压力测试。

  • -t: 由于是网络 IO 密集型测试,我采用服务器 CPU 核心数量(12 个)三倍的线程数量
  • -c: 一般来说,HTTP 连接数为线程数量的 100 倍,此处我简单设置为 4000 个 HTTP 连接。
  • -d: 我将测试持续时间设置为 30 秒
  • --latency: 输出响应时间/延迟的分部情况

我分别得到了以下两个输出:

kafka-python: 一个纯 Python 编写的 kafka 客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost wrk]# ./wrk -t36 -c4000 -d30s --latency http://10.3.242.223:8087/cat
Running 30s test @ http://10.3.242.223:8087/cat
36 threads and 4000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.41s 336.86ms 1.87s 72.58%
Req/Sec 44.25 68.59 570.00 89.08%
Latency Distribution
50% 1.58s
75% 1.62s
90% 1.86s
99% 1.86s
16667 requests in 30.05s, 2.65MB read
Socket errors: connect 0, read 5861, write 0, timeout 15241
Requests/sec: 554.71
Transfer/sec: 90.47KB
[root@localhost wrk]#

confluent-kafka-python: 一个基于 C kafka 库的 Python kafka 客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost wrk]# ./wrk -t36 -c4000 -d30s --latency http://10.3.242.223:8086/cat
Running 30s test @ http://10.3.242.223:8086/cat
36 threads and 4000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.20s 426.34ms 1.98s 60.69%
Req/Sec 98.17 145.79 0.89k 87.40%
Latency Distribution
50% 1.16s
75% 1.56s
90% 1.79s
99% 1.92s
39687 requests in 30.05s, 6.32MB read
Socket errors: connect 0, read 3444, write 0, timeout 19562
Requests/sec: 1320.81
Transfer/sec: 215.41KB
[root@localhost wrk]#

可以看到,尽管二者在响应延迟上相差无几。但在网络吞吐量上, confluent-kafka-python 的性能是 kafka-python 的二倍以上。