性能测试工具 wrk 使用教程( 二 )


wrk -v

性能测试工具 wrk 使用教程

文章插图
 
输出如上信息,说明安装成功了!
四、如何使用安装成功了,要如何使用呢?
4.1 简单使用wrk -t12 -c400 -d30s http://www.baidu.com这条命令表示,利用 wrk 对 www.baidu.com 发起压力测试,线程数为 12,模拟 400 个并发请求,持续 30 秒 。
4.2 wrk 子命令参数说明除了上面简单示例中使用到的子命令参数,wrk 还有其他更丰富的功能,命令行中输入 wrk --help, 可以看到支持以下子命令:
[root@VM_0_5_centos ~]# wrk --helpUsage: wrk <options> <url>Options:-c, --connections <N>Connections to keep open-d, --duration<T>Duration of test-t, --threads<N>Number of threads to use-s, --script<S>Load Lua script file-H, --header<H>Add header to request--latencyPrint latency statistics--timeout<T>Socket/request timeout-v, --versionPrint version detailsNumeric arguments may include a SI unit (1k, 1M, 1G)Time arguments may include a time unit (2s, 2m, 2h)翻译一下:
使用方法: wrk <选项> <被测HTTP服务的URL>Options:-c, --connections <N>跟服务器建立并保持的TCP连接数量-d, --duration<T>压测时间-t, --threads<N>使用多少个线程进行压测-s, --script<S>指定Lua脚本路径-H, --header<H>为每一个HTTP请求添加HTTP头--latency在压测结束后,打印延迟统计信息--timeout<T>超时时间-v, --version打印正在使用的wrk的详细版本信息<N>代表数字参数,支持国际单位 (1k, 1M, 1G)<T>代表时间参数,支持时间单位 (2s, 2m, 2h)
PS: 关于线程数,并不是设置的越大,压测效果越好,线程设置过大,反而会导致线程切换过于频繁,效果降低,一般来说,推荐设置成压测机器 CPU 核心数的 2 倍到 4 倍就行了 。
4.3 测试报告执行压测命令:
wrk -t12 -c400 -d30s --latency http://www.baidu.com执行上面的压测命令,30 秒压测过后,生成如下压测报告:
Running 30s test @ http://www.baidu.com12 threads and 400 connectionsThread StatsAvgStdevMax+/- StdevLatency386.32ms380.75ms2.00s86.66%Req/Sec17.0613.91252.0087.89%Latency Distribution50%218.31ms75%520.60ms90%955.08ms99%1.93s4922 requests in 30.06s, 73.86MB readSocket errors: connect 0, read 0, write 0, timeout 311Requests/sec:163.76Transfer/sec:2.46MB我们来具体说一说,报告中各项指标都代表什么意思:
Running 30s test @ http://www.baidu.com (压测时间30s)12 threads and 400 connections (共12个测试线程,400个连接)(平均值) (标准差)(最大值)(正负一个标准差所占比例)Thread StatsAvgStdevMax+/- Stdev(延迟)Latency386.32ms380.75ms2.00s86.66%(每秒请求数)Req/Sec17.0613.91252.0087.89%Latency Distribution (延迟分布)50%218.31ms75%520.60ms90%955.08ms99%1.93s4922 requests in 30.06s, 73.86MB read (30.06s内处理了4922个请求,耗费流量73.86MB)Socket errors: connect 0, read 0, write 0, timeout 311 (发生错误数)Requests/sec:163.76 (QPS 163.76,即平均每秒处理请求数为163.76)Transfer/sec:2.46MB (平均每秒流量2.46MB)可以看到,压测报告还是非常直观的!
标准差啥意思?标准差如果太大说明样本本身离散程度比较高,有可能系统性能波动较大 。
4.4 使用 Lua 脚本进行复杂测试您可能有疑问了,你这种进行 GET 请求还凑合,我想进行 POST 请求咋办?而且我想每次的请求参数都不一样,用来模拟用户使用的实际场景,又要怎么弄呢?
对于这种需求,我们可以通过编写 Lua 脚本的方式,在运行压测命令时,通过参数 --script 来指定 Lua 脚本,来满足个性化需求 。
4.4.1 wrk 对 Lua 脚本的支持wrk 支持在三个阶段对压测进行个性化,分别是启动阶段、运行阶段和结束阶段 。每个测试线程,都拥有独立的Lua 运行环境 。
启动阶段:
function setup(thread)在脚本文件中实现 setup 方法,wrk 就会在测试线程已经初始化,但还没有启动的时候调用该方法 。wrk会为每一个测试线程调用一次 setup 方法,并传入代表测试线程的对象 thread 作为参数 。setup 方法中可操作该 thread 对象,获取信息、存储信息、甚至关闭该线程 。
thread.addr- get or set the thread's server addressthread:get(name)- get the value of a global in the thread's envthread:set(name, value) - set the value of a global in the thread's envthread:stop()- stop the thread运行阶段:
function init(args)function delay()function request()function response(status, headers, body)


推荐阅读