马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
wrk 是一种高效的 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大量负载。它将多线程设计与 epoll 和 kqueue 等可伸缩事件通知系统相结合。因此,使用 wrk 使用较少的线程即可以压测出非常可观的请求数据。 并且我们可以通过一个可选的 LuaJIT(Lua) 脚本来提供更多的请求参数的定制,参数加密、鉴权请求等。 基础使用
6 t. o/ s g$ K; l使用类 Unix 环境,在 CentOs 或 MacOs 上进行测试 wrk 开源 GitHub 地址: https://github.com/wg/wrk
! ^/ C3 U/ _' F% m" s; f0 {通过 git clone 的形式下载 源码包,进入目录下,执行 make ,然后开始编译安装,等待一会即可完成。 wrk 使用参数说明
4 c- w3 T2 c$ b+ b-c, --connections: 总的连接数(每个线程处理的连接数=总连接数/线程数)& r% Y4 ]7 {' N7 g* ]( _' V
-d, --duration: 测试的持续时间,如2s(2second),2m(2minute),2h(hour)
- i Q" ]( }9 v$ o8 ^5 Y; z. _-t, --threads: 需要执行的线程总数
! q0 f* z) E# r( p$ Q0 p-s, --script: 执行Lua脚本,这里写lua脚本的路径和名称,后面会给出案例
( n' q6 ~8 E% t, G3 f-H, --header: 需要添加的头信息,注意header的语法,举例,-H “token: abcdef”,说明一下,token,冒号,空格,abcdefg(不要忘记空格,否则会报错的)。
2 |; I. @- _3 n+ x Y' K--latency: 显示延迟统计信息2 J' D# W& k* @, y6 R1 S' \+ E
--timeout: 超时的时间1 o0 S& s+ g/ i
例子
" T6 H5 C/ B; i' c! Dwrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html7 z7 M# P' _) c5 i
该请求意思为: 使用 wrk 使用12个线程,400个连接,请求 url 30s 压测结束后的结果:
" p% `+ ]7 Z( B- X- I& FRunning 30s test @ http://127.0.0.1:8080/index.html
* O- V0 }" e8 k/ q, c4 y8 D 12 threads and 400 connections
6 }! c1 d5 s7 v( V0 X Thread Stats Avg Stdev Max +/- Stdev/ k- M& b8 N7 w& {" @
Latency 635.91us 0.89ms 12.92ms 93.69%9 |3 `: n4 }0 n+ p4 l: ^1 ]. F; N, Q
Req/Sec 56.20k 8.07k 62.00k 86.54%
8 R/ g3 {2 ?. q: j( P' r 22464657 requests in 30.00s, 17.76GB read5 s. V" K6 y& c3 v
Requests/sec: 748868.53
) \, x/ B$ q3 Y3 K; t5 P( W" dTransfer/sec: 606.33MB
: h' O7 y. c0 s返回结果说明: Latency:响应时间Req/Sec:每个线程每秒钟的执行的连接数6 q7 L b7 P% q% g" Y
Avg:平均/ W+ d& d/ F% @
Max:最大
2 k$ v U* |2 l' w5 _+ O% kStdev:标准差+/- Stdev: 正负一个标准差占比; e4 u, M7 ]# M( M: }4 P) d) s4 K
Requests/sec:每秒请求数(也就是QPS),这是一项压力测试的性能指标,通过这个参数可以看出吞吐量
# s& G5 g5 M# s3 ^4 u2 JLatency Distribution,如果命名中添加了
# \+ r9 Y8 }: {& ^! I$ wlatency就会出现相关信息; ^6 q+ Z2 y j; d+ |0 }
实战. n; Z2 V/ [3 [0 g) S
使用 wrk 对鉴权的接口进行调用压测。由于是鉴权的接口,需要根据密钥和时间戳动态的生成 secret 然后对后端进行请求,才能通过验证。这里我们引入 lua 脚本9 W( [4 N c0 C6 Z; i* o( N. e
由于 wrk 工具里面 自带 luaJit ,所以我们不用下载。但是需要 md5 的模块,所以需要使用 luarocks 来管理和下载 lua 模块和包。 安装Luarocks 包管理工具" T. H3 [( r$ x7 @# D
LuaRocks 是 Lua 模块的包管理器。它允许您将 Lua 模块创建并安装为自包含包(称为 rocks )。您可以在 Unix 和 Windows 上下载和安装 LuaRocks。官网:https://luarocks.org/ 通过 curl 下载; T# g8 x: Q) h9 R
curl -o luarockt-3.0.3.tar.gz http://luarocks.github.io/luarocks/releases/luarocks-3.0.3.tar.gz" ] S: E4 H0 v" S
解压 luarockt-3.0.3.tar.gz后,进入目录下 指定到 wrk 里 LuaJit 的目录进行 configure //这里指定你自己的 `wrk` 路径
' y! D+ }+ T2 z9 z$ A" G/ s./configure --with-lua=../wrk/obj! d" j! T5 g! t: ]% r
编译安装) R) C$ K4 @9 }1 K+ J0 k0 A" l8 _
make install
( M/ H8 y$ f( v通过 Luarocks 安装 md5 模块8 C- ?. |* ?: v8 Q
luarocks install md5 开始请求
* E7 @* r8 M/ i- t# F: j我们需要像 url http://127.0.0.1:9000 网关进行 POST 请求,该网关会对请求进行鉴权和验证,并判断请求的实效性。所以我们需要在请求时动态改变请求参数,因此需要结合 Lua 脚本。 Lua 脚本 helloDemo.lua. F4 {& a& `2 u, c# \
md5=require("md5")
( |7 e/ `: e) d1 e2 Q# T9 N-- md5加密,拼接请求对象
6 `& K8 c( y: X9 w# |1 gfunction buildJson(json)& c6 I. m$ a% i
local apiKey = "abcdefg1234567"$ O' Z" S& @9 v9 v6 t7 U w
local password = "qwerxxxx"
: Y1 s) J4 v% j$ b: w* | D) ~ local timestamp = os.time() .. "000"
, t7 t! T6 ~, j& D8 l* `' ~* M local secret = md5.sumhexa(apiKey .. timestamp .. password)
6 b1 g/ H) K k4 ? E. b! Y local body = json .. "×tamp=" .. timestamp .. "&secret=" .. secret# J9 X4 M, j7 Z4 z3 ~, u2 _/ R' ^
1 m- ]9 {0 M* D: U- ~9 p: P return body
5 I6 Z6 T$ G" i, aend wrk.method = "POST". E- M0 B: C: V' P
wrk.body = buildJson("serviceName=com.github.dapeng.service.HelloService&version=1.0.0&methodName=sayHello¶meter={\"body\": {\"request\": {\"bizTag\": \"order\", \"step\": 100}}}")9 u1 e. a5 S% n V# Z ^
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
1 W' K! M$ P2 P ]! b- X+ M" c( z" J请求脚本 #!/usr/bin/env bash3 F8 T6 j2 b5 c5 h# X0 r% k2 `5 F0 S
time1=`date +%s`9 Z$ P4 H- J1 b( |) ~) S
echo "开始时间 `date +%Y%m%d%H%S`"
5 l2 t8 F; ^% S* D# l# wrk 安装目录 -s 后指定上面写好的lua脚本
6 }, [/ [3 v$ X. z~/ideaspace/dapeng/benchmark/wrk/wrk -t4 -c400 --timeout 5s -d 60s -s lua/$1.lua --latency 'http://127.0.0.1:9000/api/e1bfd762321e409cee4ac0b6e841963c'
( q& L. T* w3 t+ [# J4 ]time2=`date +%s`" r: ]5 O9 d7 R. D7 |, W
useTime=$[time2 - time1]
3 W" a E4 e0 {- k" a* Necho "结束时间 `date +%Y%m%d%H%S`"
: i O! p$ p% `! b" ~echo "总共花费 $useTime s"3 L+ l0 O# @6 h) ]. }# O& r# Z
执行脚本 sh start-wrk.sh helloDemo" j6 v0 P. U2 C& r. {$ R& R4 U2 x
通过上面方式,我们就可以开始请求已鉴权的接口 总结
$ {* C) W5 a& D f1 Gwrk 是一款高性能的 http 请求压测工具,它使用了 Epoll 模型,使所有请求都是异步非阻塞模式的,因此对系统资源能够应用到极致,可以压满 cpu。
- o' `' n S4 t5 o% u: kwrk 可以落站使用 Lua 脚本。该特性可以使我们通过 脚本动态的改变请求参数,对请求压测提供的多样性的选择和定制。 后续
6 _& ~8 r+ S5 D9 r/ ~1. 去除 CO1 D9 V' C: ^: U( P$ D
关于 wrk 测试延迟分布不准确的问题,涉及到 Coordinated Omission 的原因,可 Google
4 f6 c9 E# V! w2 t4 Z& i" u在 src/wrk.c
9 | P. Z, u Y' x7 j4 c8 X5 F将下面部分代码注释:
4 {' o# c/ Y" k0 V% Z2 f3 z" C// if(complete / cfg.connections > 0) {
' g# ? f0 G; N5 z// int64_t interval = runtime_us / ( complete / cfg.connections);
2 Z& w7 w) q. |$ k# a; ^$ l# U+ [8 t// stats_correct(statistics,latency,interval);
" X9 c3 T. G' V# P( m3 t关于 wrk 测试延迟分布不准确的问题,涉及到 Coordinated Omission 的原因,可 Google,也可以参考 wrk2
# b+ _, ?" m" \) v
5 q( G- ?* T. Z# a% {& r[color=rgba(0, 0, 0, 0.75)]wrk入门总结
7 C5 H1 `8 f4 q/ N9 V
3 }! f! B6 L7 t4 l2 o- 一、功能介绍:
- 二、安装过程:
- $ s, X" s: \( ]( p; f. Z) {6 M
; R2 D7 t1 `* o$ Y( N5 i
& F$ p* P, ~, x4 t- F3 O
- 三、wrk 初步使用
- ! g4 o1 Z. u* I/ D
" L: S0 w% e" Z4 `+ c! z- 基本用法:
- 6 s* o$ h8 [( O+ b# T: u
( ^0 s" p& |9 J$ E' M ! m+ K# y/ @3 N" c& @" x8 P
- 四 测试场景
- . X, J& Y7 m c, c A5 O, K. `6 h
# D! b4 ^$ _; p. ?% h# n# q6 |
& E$ d/ i+ |- p
. \# j$ f9 G3 Y, L+ l8 B 4 E: g% Q" U* E! |% z
. ^' | t3 \: b% r, f7 k9 q4 S0 m ~一、功能介绍: wrk2是一个主要基于wrk的HTTP基准测试工具,wrk2经过修改后能够提供稳定的吞吐量负载以及更精确的延时统计,即通过设置参数,wrk2增加了–rate或-R参数设置吞吐量(每秒总请求数)及–u_latency参数显示延时统计。 二、安装过程:wrk安装过程非常简单,下载源码后在项目目录下执行make命令即可。 9 Q& ~. h- A2 \& O0 {3 q
' t1 n( a2 I* N: m
系统无法使用make,make install,一般出现== -bash: make: command not found ==的提示,是因为安装系统的时候使用的是最小化安装,缺少make、vim等常用命令。
. A/ z: i7 i8 i2 F 直接安装make即可解决问题: [root@XXX wrk2-master]#yum -y install gcc automake autoconf libtool make
+ c: I0 f/ _" m! }+ q$ y; F0 B) ] k* o
安装g++: [root@XXX wrk2-master]#yum install gcc gcc-c++
# h% V* h' t, c7 ~
1 x$ u+ ]- V& _* J0 G0 _2. src/wrk.h:11:25: fatal error: openssl/ssl.h: No such file or directory
( t. ~$ C8 N' Dhttps://img-blog.csdnimg.cn/2020052220505566.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NjY2NzeTk5,size_16,color_FFFFFF,t_70# H8 _3 w# X9 e% @
问题在于:系统中缺少openssl库,安装即可 [root@XXX wrk2-master]# yum install openssl-devel 或者[root@XXX wrk2-master]# yum install libssl-dev* [ _# d+ _" N. k; j! w
9 e5 c) B; g) O7 M: @三、wrk 初步使用 # HTTP连接数,如1k,1M,1G, -d, --duration <T> Duration of test
9 I6 J$ B! }- A* [ y" q # 测试持续时间,如 2s 2m 2h -t, --threads <N> Number of threads to use
, v" o) k% T$ a6 L8 v( { # 开启的线程数 -s, --script <S> Load Lua script file
$ G) Y2 K$ o: e( F7 P4 X # 进阶功能,使用 lua 脚本 -H, --header <H> Add header to request
" A. P Q9 Q; n- ?0 {7 { # 添加请求头
3 B4 Z- u7 [2 p$ Y, o- j # 打印详细延迟统计 -L --latency Print latency statistics -U --u_latency Print uncorrceted latency statistics ==' ]# ^) @2 J! ^7 t8 I6 g
# 设置请求超时时间,大于该时间的请求将被记录== --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)
9 N3 q9 y& Q; v8 f7 e& V#工作速率(吞吐量)即每个线程每秒钟完成的请求数 in requests/sec (total) [Required Parameter]' B% z: n2 |; Y. e! E1 M: O
" l2 A/ @* l0 b- 使用方法–readme
2 C! C3 S. l) K; N [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个请求 | 延迟标识,延迟百分比 |
! v1 m4 O& T1 X# h$ c! g! m四 测试场景- 测试HTTP协议网络的性能[root@XXX scripts]# wrk -t2 -c1000 -d15 -R1000 --latency https://www.baidu.com/3 n5 x" Y' p, p8 `
- 19 K7 A4 |8 ]9 z& g/ R/ I
Running 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
) x1 [. R. O2 k 压测简单说明:以上使用了2个线程1000个http连接,对baidu进行了15s的压测,并要求在压测结果中输出响应延迟信息。 - 测试当前服务的最大QPS
进入安装目录,运行 - v* i9 k( o; U8 l
[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 | 6 M* u1 q) C7 [3 Z% T# G6 a1 p6 U
从以上的测试过程中可以看出,服务最大的每秒请求量为13000,可见性能压测的QPS为1.3万左右,考虑本机测试性能损耗问题,即QPS>1.2万。 - 使用Lua脚本个性化wrk压测
9 ]; A' S* ~6 N1 [+ t k+ _
以上是介绍wrk的安装及简单的使用,可以看出wrk的使用较简单方便,且测试结果清晰,一般情况下关注的指标主要是:90分位延迟、99分位延迟及Requests/sec。但是工作上往往需要较复杂的测试场景,这种简单的压测可能就不满足需求。比如,使用POST 方法跟服务器交互;每次请求使用不同的参数;为了更好的模拟服务场景,需要使用wrk的script lua脚本来定制压测过程,即满足定制化的需求。
9 `& Z- o9 u1 x4 w0 R! B 有关wrk高级使用方法,可以查看我的另一篇博客:wrk2的高级使用方法 |