wrk性能测试指南
wrk :开源 HTTP 性能测试工具,专注于高并发场景下的服务端压测。由 C 语言编写,基于 多线程 + 事件驱动模型(如 epoll、kqueue)实现,能够以极低的系统资源消耗生成高负载,精准测量 Web 服务、API 或数据库接口的性能指标(如吞吐量、延迟、错误率)。
核心特性
- 高性能
- 单机可轻松模拟数万级并发连接,适合测试高吞吐服务。
- 通过多线程绑定 CPU 核心,充分利用多核性能。
- 轻量级
- 无依赖、无复杂配置,仅需一个可执行文件即可运行。
- 内存占用低,避免压测工具本身成为性能瓶颈。
- Lua 脚本扩展
- 支持通过 Lua 脚本自定义请求逻辑(动态参数、鉴权、POST 数据等)。
- 可编程处理响应内容,实现复杂场景(如会话保持、数据验证)。
- 精准统计
- 提供详细的延迟分布(P50/P90/P99)、每秒请求数(RPS)、错误率等指标。
- 输出结果直观,便于快速分析性能瓶颈。
以下是使用 wrk 进行压力测试的详细步骤指南,包含安装、参数说明、基本命令和高级用法:
安装 wrk
1. Linux (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install wrk
2. Linux (CentOS/RHEL)
sudo yum groupinstall 'Development Tools'
sudo yum install openssl-devel git
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin
3. macOS
brew install wrk
4. 源码编译(通用)
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin # 将可执行文件复制到系统路径
参数说明
wrk <选项> <URL>
常用选项:
-c, --connections <N>
: 并发连接数(模拟的客户端数量,默认 10)-t, --threads <N>
: 使用的线程数(建议与 CPU 核心数一致)-d, --duration <T>
: 测试持续时间(例如10s
,5m
)--timeout <T>
: 请求超时时间(默认 1s)-s, --script <S>
: 指定 Lua 脚本(用于自定义请求或逻辑)-H, --header <H>
: 添加 HTTP 请求头(如"User-Agent: wrk"
)--latency
: 显示延迟分布统计
基本命令示例
1. 简单测试
wrk -t4 -c100 -d30s http://example.com
- 使用 4 个线程
- 模拟 100 个并发连接
- 持续 30 秒
2. 带请求头的测试
wrk -t2 -c50 -d10s -H "Authorization: Bearer token123" https://api.example.com
高级用法:使用 Lua 脚本
1. 创建 Lua 脚本(test.lua
)
-- 初始化
function init(args)
math.randomseed(os.time()) -- 初始化随机数种子
end
-- 请求生成
request = function()
local id = math.random(1, 1000) -- 生成随机参数
return wrk.format("GET", "/api/user?id=" .. id)
end
-- 响应处理
function response(status, headers, body)
if status ~= 200 then
print("Error: " .. status)
end
end
2. 运行带脚本的测试
wrk -t4 -c200 -d60s -s test.lua http://example.com
3. 其他脚本功能
- 动态请求体:生成 POST 请求
- Cookie 处理:在请求间传递会话
- 流量控制:自定义请求频率
五、结果解读
输出示例:
Running 30s test @ http://example.com
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.22ms 12.64ms 200.15ms 85.12%
Req/Sec 550.75 120.25 1.01k 76.50%
Latency Distribution
50% 42.65ms
75% 50.12ms
90% 60.01ms
99% 85.22ms
65879 requests in 30.10s, 102.33MB read
Requests/sec: 2189.31
Transfer/sec: 3.40MB
- Latency: 请求延迟统计(平均、标准差、分布)
- Req/Sec: 每秒请求数(越高代表吞吐量越好)
- Requests/sec:每秒处理请求数
- Transfer/sec:网络流量
注意事项
- 线程数:建议与 CPU 核心数相同(通过
lscpu
或sysctl hw.ncpu
查看)。 - 连接数:不要超过服务器或测试机的最大文件描述符限制(通过
ulimit -n
调整)。 - 测试时间:至少持续 30 秒以上,避免冷启动误差。
- 目标服务器:避免对生产环境未经授权的服务进行压测。
- 网络瓶颈:确保测试机和服务器之间的网络带宽足够。
完整示例
# 测试一个 API 的 QPS(Query Per Second)
wrk -t8 -c500 -d2m \
-H "Content-Type: application/json" \
-s post.lua \
http://api.example.com/v1/data
post.lua
内容:
wrk.method = "POST"
wrk.body = '{"user": "test", "data": "payload"}'
wrk.headers["Content-Type"] = "application/json"