wrk/wrk2:高性能 HTTP 压测工具与精准负载控制

当需要对 Web 服务进行性能基准测试时,wrk 和 wrk2 是许多开发者和运维工程师的首选工具。它们都是轻量级的 HTTP 性能测试工具,能够在单台多核 CPU 机器上产生巨大的负载。

wrk:高性能的基准测试标杆

wrk 是一个用 C 语言编写的现代 HTTP 基准测试工具。它的核心优势在于极致的性能:结合了多线程设计与可扩展的事件通知系统(如 Linux 的 epoll 和 BSD/macOS 的 kqueue),使得它在单机上就能轻松模拟数万并发连接和数万 QPS(每秒请求数)。

核心特性

  • 高性能:能充分利用系统资源,产生高并发负载。
  • LuaJIT 脚本支持:这是它最大的亮点之一。你可以通过 Lua 脚本自定义复杂的请求逻辑,例如发送 POST 请求、动态生成请求参数、添加自定义 Header 以及处理响应。
  • 详细的报告:提供包括延迟分布(平均、标准差、最大、百分位)、每线程统计以及总 QPS 和传输速率在内的丰富信息。

安装与基本用法

安装

  • Ubuntu/Debian: sudo apt install wrk
  • CentOS/RHEL: sudo yum install wrk
  • macOS: brew install wrk

基本命令格式wrk -t<线程数> -c<并发连接数> -d<持续时间> <目标URL>

这是一个入门示例,使用 8 个线程、200 个并发连接,对目标 URL 进行 30 秒的测试:

1
wrk -t8 -c200 -d30s http://example.com/api/test

常用参数说明

参数 说明 示例
-t, --threads <N> 使用的线程数 -t8
-c, --connections <N> 保持打开的 HTTP 连接数(并发数) -c200
-d, --duration <T> 测试持续时间 -d30s
-s, --script <S> 加载 Lua 脚本文件 -s post.lua
-H, --header <H> 添加请求头 -H "Authorization: Bearer token"
--latency 打印详细的延迟统计信息 --latency

高级示例:发送 POST 请求

wrk 本身默认只支持 GET 请求。要发送 POST 请求,需要借助 Lua 脚本。创建一个 post.lua 文件,内容如下:

1
2
3
wrk.method = "POST"
wrk.body = "{\"key\":\"value\"}" -- 注意需要对 JSON 内容进行转义
wrk.headers["Content-Type"] = "application/json"

然后执行命令:

1
wrk -t4 -c200 -d30s --script=post.lua --latency http://example.com/api/post

结果解读

一次压测后,wrk 会输出类似下面的报告。重点关注 Latency(延迟)和 Requests/sec(每秒请求数,即 QPS)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Running 30s test @ http://example.com/
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.59s 5.02s 29.57s 79.01%
Req/Sec 5.14 4.82 36.00 83.11%
Latency Distribution
50% 4.91s
75% 8.24s
90% 13.38s
99% 25.42s
4677 requests in 30.00s, 51.98MB read
Socket errors: connect 0, read 0, write 0, timeout 27
Requests/sec: 155.90
Transfer/sec: 1.73MB
  • Thread Stats: 显示响应时间(Latency)和每个线程每秒的请求数(Req/Sec)的平均值、标准差、最大值等。
  • Latency Distribution: 展示延迟的百分位数分布,例如 99% 的请求延迟低于 25.42s。此数据比平均值更能反映服务的“尾部延迟”表现。

wrk2:wrk 的精准负载控制进化版

wrk2 是基于 wrk 的一个修改版,它解决了一个在性能测试中非常关键的问题:恒定吞吐量与精确延迟记录

与 wrk 的核心差异

  1. 恒定吞吐量(Constant Throughput):wrk 是“尽最大努力”发送请求,流量会波动。wrk2 则通过 -R--rate 参数,让你精确控制每秒的总请求数(RPS, Requests Per Second),模拟稳定的负载场景。
  2. 正确的延迟记录:wrk2 解决了性能测试中一个经典问题——协调遗漏错误(Coordinated Omission)。简单来说,普通工具在系统繁忙时会忽略那些因为超时而未被记录的高延迟样本,导致报告的平均延迟远低于真实值。wrk2 通过其算法修正了这一点,能提供更准确的高百分位延迟数据(如 P99.9),这对识别真实性能瓶颈至关重要。

安装与基本用法

安装(通过 Snap):

1
sudo snap install wrk2

基本命令:使用 -R 参数指定恒定吞吐量,例如以每秒 2000 个请求的速率测试 30 秒:

1
wrk2 -t2 -c100 -d30s -R2000 http://127.0.0.1:8080/

结果与对比

wrk2 的输出与 wrk 类似,但增加了校准信息。需要注意,为了准确计量,wrk2 的初始校准时间更长(约 10 秒),因此短时间(如 <20 秒)的测试结果可能不具参考价值。

wrk 与 wrk2:关键差异速览

特性 wrk wrk2
核心目标 产生最大负载,评估极限吞吐量 模拟恒定负载,评估精确延迟
负载模式 尽力而为,流量有波动 恒定吞吐量(通过 -R 参数控制)
延迟准确性 可能存在协调遗漏错误 修正了协调遗漏错误,高百分位延迟更准
适用场景 探索服务的极限 QPS,对比不同配置的性能差异 验证服务在特定负载下的延迟承诺(如 SLA),识别真实延迟瓶颈
关键参数 -c, -t, -d -c, -t, -d, -R

总结

wrk 和 wrk2 是 HTTP 性能测试的绝佳组合。使用 wrk 进行基准测试,可以快速了解服务的极限吞吐量和性能瓶颈。当需要验证服务在特定负载下的延迟表现时,则应采用 wrk2,它的恒定吞吐模式和修正的延迟记录能提供更接近真实场景的数据。两者配合使用,能让你全面、准确地掌握 Web 服务的性能画像。