wrk 压测工具的使用方法
1. 安装 wrk
- Ubuntu/Debian:
sudo apt-get install wrk
- CentOS/RHEL:
可以从源码编译安装,首先克隆仓库:git clone https://github.com/wg/wrk.git cd wrk make sudo cp wrk /usr/local/bin
2. 基本命令格式
wrk [options] <url>
常见的选项有:
-t <threads>
:指定线程数,默认是 2 个线程。-c <connections>
:指定并发连接数。-d <duration>
:指定压测持续时间,例如10s
表示 10 秒,3m
表示 3 分钟。-s <script>
:指定 Lua 脚本,用于自定义请求。
3. 简单示例
以下是一个简单的压测示例,对 http://example.com
进行 30 秒的压测,使用 12 个线程,并发连接数为 400:
wrk -t12 -c400 -d30s http://example.com
4. 使用 Lua 脚本自定义请求
如果需要发送更复杂的请求,如 POST 请求、携带请求头或请求体,可以使用 Lua 脚本来实现。
示例 Lua 脚本(post.lua
):
request = function()
return wrk.format("POST", "/api", {["Content-Type"] = "application/json"}, '{"key": "value"}')
end
使用该脚本进行压测:
wrk -t12 -c400 -d30s -s post.lua http://example.com
分析 wrk 报告
执行完压测命令后,wrk 会输出一份详细的报告,下面是一个示例报告及各部分的详细解释:
Running 30s test @ http://example.com
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 63.77ms 51.22ms 518.62ms 91.00%
Req/Sec 594.41 132.54 1.00k 78.00%
213408 requests in 30.03s, 37.47MB read
Socket errors: connect 0, read 0, write 0, timeout 12
Requests/sec: 7106.47
Transfer/sec: 1.25MB
1. 基本信息
Running 30s test @ http://example.com
:表示压测持续时间为 30 秒,目标 URL 是http://example.com
。12 threads and 400 connections
:表示使用 12 个线程和 400 个并发连接进行压测。
2. 线程统计信息
- Latency(延迟):
Avg
:平均延迟,这里是 63.77ms,即每个请求的平均响应时间。Stdev
:标准差,反映了延迟的波动情况,这里是 51.22ms,说明延迟的波动较大。Max
:最大延迟,这里是 518.62ms。+/- Stdev
:表示在一个标准差范围内的请求占比,这里 91.00% 的请求延迟在平均延迟加减一个标准差的范围内。
- Req/Sec(每秒请求数):
Avg
:每个线程的平均每秒请求数,这里是 594.41。Stdev
:标准差,反映了每秒请求数的波动情况,这里是 132.54。Max
:最大每秒请求数,这里是 1.00k(即 1000)。+/- Stdev
:表示在一个标准差范围内的每秒请求数占比,这里 78.00% 的请求每秒请求数在平均每秒请求数加减一个标准差的范围内。
3. 总体统计信息
213408 requests in 30.03s
:表示在 30.03 秒内总共发送了 213408 个请求。37.47MB read
:表示在压测过程中总共读取了 37.47MB 的数据。Socket errors: connect 0, read 0, write 0, timeout 12
:表示在压测过程中出现的套接字错误情况,这里连接错误、读取错误、写入错误均为 0,超时错误有 12 个。Requests/sec: 7106.47
:表示整个压测过程中的平均每秒请求数。Transfer/sec: 1.25MB
:表示整个压测过程中的平均每秒数据传输量。
通过分析这些数据,可以了解目标服务的性能瓶颈,如延迟过高可能是服务器处理能力不足或网络问题,每秒请求数较低可能是服务器并发处理能力有限等。