wrk 是一个高性能 HTTP 压测工具,特点是:
- 基于事件驱动(epoll/kqueue)
- 多线程 + 异步 I/O
- 支持 Lua 脚本扩展(可自定义请求逻辑)
- 适合高并发场景压测(10万+ QPS级别)
应用场景:
- API 服务性能评估
- 网关(Nginx / Traefik / Envoy)压测
- 微服务压测(K8s / Service Mesh)
- 数据库代理 / 缓存层性能验证
1.wrk安装
1.1 Linux / Mac
1 2 3 4 5 6 7 8 9 10
| apt install wrk
brew install wrk
git clone https://github.com/wg/wrk.git cd wrk make
|
1.2 验证安装
2.核心参数详解
2.1 基础命令结构
1
| wrk -t <线程数> -c <连接数> -d <持续时间> http://target-url
|
2.2 参数说明
| 参数 |
含义 |
建议 |
-t |
线程数 |
= CPU核数 |
-c |
总连接数 |
= 线程数 * (100~1000) |
-d |
压测时间 |
≥30s |
-H |
自定义Header |
模拟真实请求 |
-s |
Lua脚本 |
高级压测 |
--latency |
输出延迟分布 |
必开 |
-R |
固定QPS(wrk2) |
稳定压测 |
3.基础压测示例
3.1 简单压测GET
1
| wrk -t4 -c100 -d30s http://127.0.0.1:8080
|
输出示例:
Requests/sec: 15234.56
Transfer/sec: 12.34MB
Latency: 6.23ms
3.2 启用延迟统计
1
| wrk -t4 -c100 -d30s --latency http://127.0.0.1:8080
|
关键指标:
- Avg:平均延迟
- Stdev:抖动
- Max:最大延迟
- Percentile:P50 / P90 / P99
4.Lua脚本压测(高级用法)
4.1 自定义请求
1 2 3
| wrk.method = "POST" wrk.body = '{"name":"test"}' wrk.headers["Content-Type"] = "application/json"
|
运行:
1
| wrk -t4 -c100 -d30s -s post.lua http://127.0.0.1:8080/api
|
4.2 动态参数(模拟真实流量)
1 2 3 4
| request = function() local id = math.random(1, 1000) return wrk.format("GET", "/user/" .. id) end
|
4.3 Token/Auth模拟
1
| wrk.headers["Authorization"] = "Bearer xxx"
|
5.wrk架构原理
flowchart LR
A[主线程] --> B[Worker线程]
B --> C[连接池]
C --> D[事件循环 epoll/kqueue]
D --> E[HTTP请求发送]
E --> F[响应处理]
核心机制
- 每个线程维护独立连接池
- 非阻塞 socket
- 基于事件驱动(类似 Nginx)
- Lua 在 worker 内执行(无锁)
6.生产压测策略(关键)
6.1 分阶段压测
flowchart TD
A[预热阶段] --> B[低压]
B --> C[逐步加压]
C --> D[极限压测]
D --> E[稳定性测试]
6.2 推荐压测方法
| 阶段 |
配置 |
| 预热 |
10%流量 |
| 线性增长 |
每分钟+20% |
| 峰值 |
目标QPS |
| 长稳 |
≥1小时 |