马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
wrk 是一种高效的 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大量负载。它将多线程设计与 epoll 和 kqueue 等可伸缩事件通知系统相结合。因此,使用 wrk 使用较少的线程即可以压测出非常可观的请求数据。 并且我们可以通过一个可选的 LuaJIT(Lua) 脚本来提供更多的请求参数的定制,参数加密、鉴权请求等。 基础使用! q1 {7 x6 A C& v8 D8 u3 h
使用类 Unix 环境,在 CentOs 或 MacOs 上进行测试 wrk 开源 GitHub 地址: https://github.com/wg/wrk l5 i$ b3 P8 |- ~ ~' ]
通过 git clone 的形式下载 源码包,进入目录下,执行 make ,然后开始编译安装,等待一会即可完成。 wrk 使用参数说明
1 {: p+ C( ?& p) f9 `-c, --connections: 总的连接数(每个线程处理的连接数=总连接数/线程数)
) e! N0 N* j9 ~3 G. ?. r-d, --duration: 测试的持续时间,如2s(2second),2m(2minute),2h(hour)
) j/ L3 L9 X5 C% f+ @+ G-t, --threads: 需要执行的线程总数
' |: a/ `4 x1 ]0 m; |-s, --script: 执行Lua脚本,这里写lua脚本的路径和名称,后面会给出案例! D2 ?0 C6 {7 P7 F4 [
-H, --header: 需要添加的头信息,注意header的语法,举例,-H “token: abcdef”,说明一下,token,冒号,空格,abcdefg(不要忘记空格,否则会报错的)。% F' O7 N* s/ f1 K
--latency: 显示延迟统计信息. } g: p6 O3 v
--timeout: 超时的时间
3 F# w. I$ s/ T例子 y" L# H) T% t. H/ S
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html. [$ m7 T: d$ P9 r* u4 ]
该请求意思为: 使用 wrk 使用12个线程,400个连接,请求 url 30s 压测结束后的结果:& [+ f# ?, r. J+ ^9 Q5 T
Running 30s test @ http://127.0.0.1:8080/index.html+ C% t- z) n& L& u
12 threads and 400 connections
5 j5 _2 Z* X# j7 w Thread Stats Avg Stdev Max +/- Stdev' x: S, I9 _+ u$ W% N
Latency 635.91us 0.89ms 12.92ms 93.69%
2 e( G. {" V# q/ O5 J7 S1 [ Req/Sec 56.20k 8.07k 62.00k 86.54%
4 x: M8 w, z! m% x% j* W 22464657 requests in 30.00s, 17.76GB read0 G& V5 U( x1 S2 C9 m
Requests/sec: 748868.539 D6 }& V5 B, i7 ^
Transfer/sec: 606.33MB* e% J& g. ^$ Z2 `/ u0 P
返回结果说明: Latency:响应时间Req/Sec:每个线程每秒钟的执行的连接数" J1 L! m+ [' {9 V" e) a
Avg:平均
! J b k$ X& U0 U9 v8 R5 sMax:最大" b, t c8 q) l Y% {8 s8 I4 A. j
Stdev:标准差+/- Stdev: 正负一个标准差占比
# P% _6 _( C5 n3 c1 hRequests/sec:每秒请求数(也就是QPS),这是一项压力测试的性能指标,通过这个参数可以看出吞吐量
6 j* V% y! P2 a6 z8 ?Latency Distribution,如果命名中添加了0 a$ n* C; v$ H( ^
latency就会出现相关信息
; {! f9 z8 |9 {, ?) A, o实战' }, A: ^% V& Z- \! h0 k
使用 wrk 对鉴权的接口进行调用压测。由于是鉴权的接口,需要根据密钥和时间戳动态的生成 secret 然后对后端进行请求,才能通过验证。这里我们引入 lua 脚本
3 g8 D2 z( ~# j5 M: a由于 wrk 工具里面 自带 luaJit ,所以我们不用下载。但是需要 md5 的模块,所以需要使用 luarocks 来管理和下载 lua 模块和包。 安装Luarocks 包管理工具
* {4 n4 l$ m4 t& [. VLuaRocks 是 Lua 模块的包管理器。它允许您将 Lua 模块创建并安装为自包含包(称为 rocks )。您可以在 Unix 和 Windows 上下载和安装 LuaRocks。官网:https://luarocks.org/ 通过 curl 下载) q, J% G9 _& G4 ^. W
curl -o luarockt-3.0.3.tar.gz http://luarocks.github.io/luarocks/releases/luarocks-3.0.3.tar.gz
- d5 L: q8 W+ D/ a0 H- |8 c- C解压 luarockt-3.0.3.tar.gz后,进入目录下 指定到 wrk 里 LuaJit 的目录进行 configure //这里指定你自己的 `wrk` 路径6 k* V6 @8 i6 E( H
./configure --with-lua=../wrk/obj
2 Y% k2 v3 X: M' c# y编译安装
) j. t, P- `; ?2 S- H! hmake install
: W6 m$ k$ A* K" c8 n! G2 T6 q3 ~通过 Luarocks 安装 md5 模块
: K( V0 r: s8 z5 N# W" X$ X9 |luarocks install md5 开始请求
5 A5 v+ [) M5 S我们需要像 url http://127.0.0.1:9000 网关进行 POST 请求,该网关会对请求进行鉴权和验证,并判断请求的实效性。所以我们需要在请求时动态改变请求参数,因此需要结合 Lua 脚本。 Lua 脚本 helloDemo.lua& ?. N1 S- q# G) v, z
md5=require("md5")
6 I' t+ h; C% w# C; C9 w- q5 W-- md5加密,拼接请求对象4 j" K4 K" A( T
function buildJson(json)- v7 U+ T, e, C6 U. t2 n% U! d
local apiKey = "abcdefg1234567"! T5 g( q- }. {" X: q, X
local password = "qwerxxxx"- q/ x x% U7 C- z
local timestamp = os.time() .. "000", B0 \8 ~) u" ]7 M' J6 Y1 ^9 \
local secret = md5.sumhexa(apiKey .. timestamp .. password)0 m. C' ?7 ?- |- s
local body = json .. "×tamp=" .. timestamp .. "&secret=" .. secret0 n: s6 V$ c2 C, R6 m
; M- D! Z6 T9 }3 J) b
return body
# u! B* Y' Q/ h3 R! R3 Q# j5 Uend wrk.method = "POST"
0 Y# C4 r8 h" ]3 zwrk.body = buildJson("serviceName=com.github.dapeng.service.HelloService&version=1.0.0&methodName=sayHello¶meter={\"body\": {\"request\": {\"bizTag\": \"order\", \"step\": 100}}}")
& F) A6 {% Z( J3 p, kwrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
) m3 w* d, b$ w4 W- w8 F& i6 g请求脚本 #!/usr/bin/env bash( }1 R0 l0 \( L$ R* u8 e6 d7 T
time1=`date +%s`/ t0 l) e" A0 h7 D" ~
echo "开始时间 `date +%Y%m%d%H%S`"3 K; F- D( S" R# C- c
# wrk 安装目录 -s 后指定上面写好的lua脚本" F/ l; L1 u+ O# j d* k
~/ideaspace/dapeng/benchmark/wrk/wrk -t4 -c400 --timeout 5s -d 60s -s lua/$1.lua --latency 'http://127.0.0.1:9000/api/e1bfd762321e409cee4ac0b6e841963c'7 q. e/ V- t" P" V
time2=`date +%s`
0 _0 p1 y9 z3 Q9 N q* GuseTime=$[time2 - time1]
' g i2 O0 V4 H1 y/ ~- [7 lecho "结束时间 `date +%Y%m%d%H%S`"
) ~) S# L1 h5 I& i+ Q: [1 f/ Uecho "总共花费 $useTime s"5 @/ t- T" D) h
执行脚本 sh start-wrk.sh helloDemo
, j) u9 P: g. m$ j通过上面方式,我们就可以开始请求已鉴权的接口 总结, p( ~8 \3 z, o f( q$ T# |0 p: D, x
wrk 是一款高性能的 http 请求压测工具,它使用了 Epoll 模型,使所有请求都是异步非阻塞模式的,因此对系统资源能够应用到极致,可以压满 cpu。
+ l [' ~# R9 K0 }5 O/ Y4 Lwrk 可以落站使用 Lua 脚本。该特性可以使我们通过 脚本动态的改变请求参数,对请求压测提供的多样性的选择和定制。 后续. R6 s) y# A2 O, s
1. 去除 CO$ I- x J8 x% Y S6 V- ~, z
关于 wrk 测试延迟分布不准确的问题,涉及到 Coordinated Omission 的原因,可 Google
! z% h' B- C- o* |6 m在 src/wrk.c# E9 U" q$ x) t# L
将下面部分代码注释:; V7 G5 x* C4 b. G5 W5 J% l( S
// if(complete / cfg.connections > 0) {
5 `+ V5 o3 u# @9 X6 J O% d// int64_t interval = runtime_us / ( complete / cfg.connections);
# G i& J6 t" T, w6 l9 a% ], b// stats_correct(statistics,latency,interval);1 y% d3 H" P8 n/ I. j
关于 wrk 测试延迟分布不准确的问题,涉及到 Coordinated Omission 的原因,可 Google,也可以参考 wrk2
) u' o1 C" q( c1 o( o. ]: i: S! E7 Q+ {/ T0 |
[color=rgba(0, 0, 0, 0.75)]wrk入门总结
, d. J5 E" ^' _5 G1 U# x" E3 u
r' a7 s) j( [& A* `2 [+ N* d- 一、功能介绍:
- 二、安装过程:
- 0 v* E! M3 F, j: l
/ {* |' t7 r$ t6 ~2 @# T' ]+ {# _6 f9 B( X$ H% y8 I2 n# J
- 三、wrk 初步使用
- * X: y4 m/ @5 m* X
. m' U# b0 Q9 |- 基本用法:
- - T+ {: r1 ~: g
" G+ U* i2 P/ k5 \& {( s5 _; [ % }9 I& v- M% G: h- h$ L6 t
- 四 测试场景
8 B4 W( {0 Q4 t! g8 M0 | t! C5 ^& n
: M0 @7 i2 }( R, l w( D # c- Z+ m- t8 h" a2 g i
# k, ~, n* p3 i5 `9 W
" t" s" x/ b& ]' `% s一、功能介绍: wrk2是一个主要基于wrk的HTTP基准测试工具,wrk2经过修改后能够提供稳定的吞吐量负载以及更精确的延时统计,即通过设置参数,wrk2增加了–rate或-R参数设置吞吐量(每秒总请求数)及–u_latency参数显示延时统计。 二、安装过程:wrk安装过程非常简单,下载源码后在项目目录下执行make命令即可。
/ x/ b7 I: X# f4 e# ^5 m
0 W( J$ ?- x/ Z. d( ` 系统无法使用make,make install,一般出现== -bash: make: command not found ==的提示,是因为安装系统的时候使用的是最小化安装,缺少make、vim等常用命令。
; D: k& T5 u3 ~ d 直接安装make即可解决问题: [root@XXX wrk2-master]#yum -y install gcc automake autoconf libtool make
. F, Z: M* {9 W1 a J
5 v( \$ z. a( i0 _3 m' Q. B8 ^, x 安装g++: [root@XXX wrk2-master]#yum install gcc gcc-c++& g2 p5 [' B! D0 u" @
8 p4 g) b2 b0 I( Z
2. src/wrk.h:11:25: fatal error: openssl/ssl.h: No such file or directory
+ G% F7 O5 V: \8 O2 ]https://img-blog.csdnimg.cn/2020052220505566.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NjY2NzeTk5,size_16,color_FFFFFF,t_70! i7 I$ O0 @$ I/ E7 U9 a4 O5 H: T
问题在于:系统中缺少openssl库,安装即可 [root@XXX wrk2-master]# yum install openssl-devel 或者[root@XXX wrk2-master]# yum install libssl-dev. u* R7 S* R+ z: i N, O/ j" L
: F8 z4 m$ j6 m1 f三、wrk 初步使用 # HTTP连接数,如1k,1M,1G, -d, --duration <T> Duration of test 8 r( u h* r& C
# 测试持续时间,如 2s 2m 2h -t, --threads <N> Number of threads to use
6 C2 d: g; B3 o: m( G- s6 E; Y( S( ` # 开启的线程数 -s, --script <S> Load Lua script file 5 V3 }8 H1 Q; v' a
# 进阶功能,使用 lua 脚本 -H, --header <H> Add header to request ; S W1 B9 p7 Y1 a6 a* {
# 添加请求头 & f4 k! R. s8 b- I/ V$ x* H% M
# 打印详细延迟统计 -L --latency Print latency statistics -U --u_latency Print uncorrceted latency statistics ==, s+ y8 _$ b. c; ^
# 设置请求超时时间,大于该时间的请求将被记录== --timeout <T> Socket/request timeout -B, --batch_latency Measure latency of whole batches of pipelined ops (as opposed to each op) -v, --version Print version details -R, --rate <T> work rate (throughput)
. P4 n- R' T) u4 F4 ?#工作速率(吞吐量)即每个线程每秒钟完成的请求数 in requests/sec (total) [Required Parameter]# p( y7 j2 ]+ t5 G
; [/ r- L0 s' V" U; R/ s- 使用方法–readme; A n, D4 F% J) F/ s" Q1 E% a
[color=rgba(0, 0, 0, 0.75)][td]| 使用方法 | 说明 | 吞吐量/每秒总请求数 | | wrk -t2 -c100 -d30s -R2000 http://127.0.0.1:8080/index.html | 2个线程,100个连接,持续时间30s 每秒2000个请求 | Requests/sec: 2000.12 | | wrk -t2 -c100 -d30s -R2000 --latency url | 2个线程,100个连接,持续时间30s,每秒2000个请求 | 延迟标识,延迟百分比 |
4 _# F4 F# I2 a# `/ ^四 测试场景- 测试HTTP协议网络的性能[root@XXX scripts]# wrk -t2 -c1000 -d15 -R1000 --latency https://www.baidu.com/
4 C+ t, p# k, F; ERunning 15s test @ https://www.baidu.com/ ------压测时间15s 2 threads and 1000 connections -------共2个测试线程,1000个连接 Thread calibration: mean lat.: 24.071ms, rate sampling interval: 41ms Thread calibration: mean lat.: 24.373ms, rate sampling interval: 40ms Thread Stats Avg Stdev Max +/- Stdev -----平均值 标准差 最大值 正负一个标准差所占的比例 Latency 13.10ms 5.09ms 124.16ms 95.55% -----延迟 Req/Sec 449.03 706.21 5.15k 94.26% -----处理中的请求数 Latency Distribution (HdrHistogram - Recorded Latency) -----延迟分布 50.000% 12.34ms 75.000% 13.68ms 90.000% 15.83ms -----90分位的延迟 99.000% 21.14ms ----99分位的延迟 99.900% 107.97ms 99.990% 124.22ms 99.999% 124.22ms 100.000% 124.22ms#[Mean = 13.101, StdDeviation = 5.093]#[Max = 124.160, Total count = 2201]#[Buckets = 27, SubBuckets = 2048]---------------------------------------------------------- 13795 requests in 15.00s, 206.31MB read ----15s内共处理完成了13795个请求,读取了206.31MB数据Requests/sec: 919.62 -----平均每秒处理完成919.62个请求Transfer/sec: 13.75MB -----平均每秒读取数据13.75MB
3 ]9 ]/ I/ {5 o9 b2 c& Z. Y 压测简单说明:以上使用了2个线程1000个http连接,对baidu进行了15s的压测,并要求在压测结果中输出响应延迟信息。 - 测试当前服务的最大QPS
进入安装目录,运行 6 x& f) R9 M7 ~( G! _& q( E
[color=rgba(0, 0, 0, 0.75)][td]| 通过-R参数获取吞吐量参数 | 每秒请求量的结果 | | ./wrk2 -t10 -c50 -d30 -R3000 -H “Host:xxx.com” http://localhost/a/a.mp4 -L | Requests/sec: 3000.12 | | ./wrk2 -t10 -c50 -d30 -R5000 -H “Host:xxx.com” http://localhost/a/a.mp4 -L | Requests/sec: 5000.12 | | ./wrk2 -t10 -c50 -d30 -R10000 -H “Host:xxx.com” http://localhost/a/a.mp4 -L | Requests/sec: 9800.12 | | ./wrk2 -t10 -c50 -d30 -R20000 -H “Host:xxx.com” http://localhost/a/a.mp4 -L | Requests/sec: 12500.12 | | ./wrk2 -t10 -c50 -d30 -R30000 -H “Host:xxx.com” http://localhost/a/a.mp4 -L | Requests/sec: 13000.12 |
* e7 T/ n; g3 f" P H从以上的测试过程中可以看出,服务最大的每秒请求量为13000,可见性能压测的QPS为1.3万左右,考虑本机测试性能损耗问题,即QPS>1.2万。 - 使用Lua脚本个性化wrk压测
! d2 g" \& N( A! T
以上是介绍wrk的安装及简单的使用,可以看出wrk的使用较简单方便,且测试结果清晰,一般情况下关注的指标主要是:90分位延迟、99分位延迟及Requests/sec。但是工作上往往需要较复杂的测试场景,这种简单的压测可能就不满足需求。比如,使用POST 方法跟服务器交互;每次请求使用不同的参数;为了更好的模拟服务场景,需要使用wrk的script lua脚本来定制压测过程,即满足定制化的需求。4 [- j! Q7 i' }% Z" a
有关wrk高级使用方法,可以查看我的另一篇博客:wrk2的高级使用方法 |