wrk
是一款现代化的 HTTP 基准测试(benchmarking)工具,它能够在单机多核 CPU 上产生显著的负载。它结合了多线程设计和异步事件驱动模型(如 epoll
, kqueue
),因此效率非常高。
主要特点:
bashbrew install wrk
(注意:某些发行版的仓库可能版本较旧,推荐从源码编译)bashsudo apt-get update sudo apt-get install wrk
bashgit clone https://github.com/wg/wrk.git
cd wrk
make
# 可选:将编译好的 wrk 可执行文件复制到 PATH 路径下,如 /usr/local/bin
# sudo cp wrk /usr/local/bin/
编译通常需要 openssl
开发库(如 libssl-dev
on Debian/Ubuntu)。bashwrk [options] <url>
<url>
: 你要测试的目标 URL。-t<N>
或 --threads=<N>
: 使用的线程数 (N)。通常设置为 CPU 核心数。-c<N>
或 --connections=<N>
: 保持的 TCP 连接总数 (N)。这些连接会在线程间共享。-d<T>
或 --duration=<T>
: 测试持续时间 (T)。例如 10s
(10秒), 2m
(2分钟), 1h
(1小时)。-s<S>
或 --script=<S>
: 加载指定的 Lua 脚本 (S),用于自定义请求等。-H<H>
或 --header=<H>
: 添加 HTTP Header。例如 -H "Content-Type: application/json"
。可以多次使用以添加多个 Header。--latency
: 打印详细的延迟百分位统计信息。--timeout <T>
: 请求超时时间。例如 2s
。POST
请求或带 Body 的请求:通常需要配合 Lua 脚本 (-s
) 来实现。bashwrk -t4 -c200 -d30s http://your-target-service.com/api/resource
bashwrk -t4 -c200 -d30s --latency http://your-target-service.com/api/resource
bashwrk -t4 -c200 -d30s -H "Authorization: Bearer your_token" http://your-target-service.com/api/resource
post.lua
):
一个简单的bashwrk -t4 -c200 -d30s -s ./post.lua http://your-target-service.com/api/submit
post.lua
示例:
luawrk.method = "POST"
wrk.body = '{"key": "value", "number": 123}'
wrk.headers["Content-Type"] = "application/json"
wrk
的输出通常包含:
Running <duration> test @ <url>
<threads> threads and <connections> connections
Thread Stats Avg Stdev Max +/- Stdev
(延迟统计)
Latency
Req/Sec
(每个线程的平均 QPS)Latency Distribution
(如果使用了 --latency
):不同百分位的延迟。<N> requests in <duration>, <size> read
(总请求数、总耗时、读取的总数据量)Requests/sec: <QPS>
(最重要的指标:平均每秒请求数)Transfer/sec: <throughput>
(平均每秒传输数据量)Socket errors: connect <N>, read <N>, write <N>, timeout <N>
(各种错误计数,需要关注)wrk
的机器)自身的性能(CPU、内存、网络带宽、文件描述符限制 ulimit -n
)会影响测试结果的上限。-c
不宜设置过高,否则可能耗尽本地端口或触发操作系统限制。如果需要极高的并发,考虑使用分布式压测方案。sh# Netty demo 压测 p99 3ms内
liangfeng@Golovins-MacBook-Pro ~ % wrk -c 40 -d 30s --latency http://127.0.0.1:8808/test
Running 30s test @ http://127.0.0.1:8808/test
2 threads and 40 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 302.42us 2.05ms 113.10ms 98.98%
Req/Sec 118.12k 12.98k 233.67k 89.18%
Latency Distribution
50% 109.00us
75% 162.00us
90% 353.00us
99% 2.42ms
7063194 requests in 30.10s, 734.22MB read
Requests/sec: 234632.93
Transfer/sec: 24.39MB
liangfeng@Golovins-MacBook-Pro ~ %