wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrk.
wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.
git clone https://github.com/wg/wrk.git
cd wrk
make
wrk -t12 -c100 -d30s http://www.baidu.com
返回:
Running 30s test @ http://www.baidu.com
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 300.59ms 210.80ms 1.99s 87.17%
Req/Sec 28.25 15.33 121.00 68.12%
10036 requests in 30.10s, 149.22MB read
Socket errors: connect 0, read 29, write 0, timeout 24
Requests/sec: 333.47
Transfer/sec: 4.96MB
参数解释:
参数解释:
12 threads and 100 connections
:
总共是12个线程,100个连接(不是一个线程对应一个连接)
latency
和Req/Sec
:
代表单个线程的统计数据,latency
代表延迟时间,Req/Sec
代表单个线程每秒完成的请求数,他们都具有平均值, 标准偏差, 最大值, 正负一个标准差占比。一般我们来说我们主要关注平均值和最大值. 标准差如果太大说明样本本身离散程度比较高. 有可能系统性能波动很大.
10036 requests in 30.10s, 149.22MB read
在30秒之内总共有10036
个请求,总共读取149.22MB
的数据
Socket errors: connect 0, read 29, write 0, timeout 24
总共有29个读错误,24个超时.
Requests/sec和Transfer/sec
所有线程平均每秒钟完成了333.47个请求,每秒钟读取4.96MB数据量
如果想看看响应时间的分布,可以增加--latency
:
wrk -t12 -c100 -d30s --latency http://www.baidu.com
Running 30s test @ http://www.baidu.com
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 401.52ms 270.05ms 1.98s 91.39%
Req/Sec 21.04 10.87 60.00 56.44%
Latency Distribution
50% 307.72ms
75% 317.86ms
90% 616.33ms
99% 1.66s
7487 requests in 30.10s, 111.42MB read
Socket errors: connect 0, read 4, write 0, timeout 55
Requests/sec: 248.70
Transfer/sec: 3.70MB