一、wrk工具介绍
wrk是一个很简单的http性能测试工具, 也可以叫做http benchmark工具。只有一个命令行, 就能做很多基本的http性能测试[1]。wrk是开源项目, 代码在github上:https://github.com/wg/wrk
wrk只能运行在类Unix的系统上。
(一) 编译wrk
root#git clone https://github.com/wg/wrk.git
root#cd wrk
root#make
make成功以后在目录下有一个wrk文件。可以把这个文件复制到其他目录, 比如bin目录, 或者就这个目录下执行。
(二) 命令格式
命令格式:wrk<选项><被测HTTP服务的URL>
(三) 参数说明
-c, --connections
-d, --duration
-t, --threads
-s, --script指定Lua脚本路径
-H, --header
--latency在压测结束后, 打印延迟统计信息
--timeout
u-v, --version打印wrk的详细版本信息
(四) 举例
wrk-t8-c200-d30s--latency“http://www.baidu..com”
以上使用8个线程200个连接, 对baidu首页进行了30秒的压测, 并要求在压测结果中输出响应延迟信息。
二、wrk执行的三个阶段
默认情况下, wrk是使用GET方法访问服务器。如果需要使用POST方法, 或为每一次请求定制不同的参数, 或循环访问不同的服务资源路径 (PATH) , 以便模拟服务的实际使用场景, 则可以使用-s (–script) 命令参数指定Lua脚本, 来定制压测参数和数据, 满足个性化需求。wrk支持在三个阶段对压测进行切入修改, 分别是启动阶段、运行阶段和结束阶段。每个测试线程, 都拥有独立的Lua运行环境[2]。
(一) 启动阶段
——setup (thread) 方法
在lua脚本文件中覆盖setup方法, wrk就会在测试线程启动之前, 初始化时调用该方法。wrk会为每一个测试线程调用一次setup方法, 并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象, 获取信息、存储信息、甚至关闭该线程。
参数:thread
取值举例:
thread.addr-设置、获取线程访问服务的地址
thread:get (name) -获取线程上下文指定变量值
thread:set (name, value) -设置线程上下文指定变量值
thread:stop () -停止线程
(二) 运行阶段
——init (args) , delay () , request () , response (status, headers, body) 方法init由测试线程调用, 只会在进入运行阶段时, 调用一次。支持从启动wrk的命令中, 获取命令行参数;delay在每次发送request之前调用, 如果需要delay, 那么delay相应时间;request用来生成请求;每一次请求都会调用该方法, 所以注意不要在该方法中做耗时的操作;reponse在每次收到一个响应时调用;为提升性能, 如果没有定义该方法, 那么wrk不会解析headers和body。
(三) 结束阶段
——done (summary, latency, requests) 方法
该方法在整个测试过程中只会调用一次, 可从参数给定的对象中, 获取压测结果, 生成定制化的测试报告。
三、wrk的高级应用
注意:为body字段赋值的内容为json格式串, 需要用单引号括起来, 否则无法识别。
(一) 改变HTTP访问方法
覆盖wrk的request () 方法, 修改wrk的HTTP访问方法为POST, 在lua脚本中给出POST报文数据。如下所示, content变量为JSON格式的POST报文, 修改wrk的method为POST。覆盖wrk的request () 方法, 修改wrk的HTTP访问方法为POST, 在lua脚本中给出POST报文数据。如下所示, content变量为JSON格式的POST报文, 修改wrk的method为POST。如图1。
(二) 改变wrk压测URL
Wrk将压测的服务URL写死在命令行中, 无法动态访问不同的服务的资源, 可以在lua脚本中修改wrk访问的服务资源路径。实现对同一个ngnix服务器不同的API进行压力测试。或者是对API网关提供的诸多API进行压测, 测试出API网关的转发效率。要改变wrk的压测目标服务, 需要在lua脚本中覆盖request () 方法, 改写服务路径 (URL) 。如图2。
(三) 改变wrk的输出格式
Wrk的默认输出格式, 是一行包含多个指标结果, 不便于程序解析;可通过lua脚本改写wrk的输出格式和输出方式 (比如输出到文件) 。通过覆盖wrk的done () 方法, 重新定义输出格式。下面将wrk的输出格式改写成key-value的格式, 并输出到文件中, 便于程序自动解析, 用于自动化压力测试结果分析、图表展示。如图3。
(四) wrk使用lua脚本
在lua脚本中完成对wrk的方法重写后, 将lua脚本放到wrk文件所在目录, 在执行wrk命令时, 通过-s参数指定lua脚本。例如:wrk-t50-c500-d120s-T20s-s apipost.lua http://10.34.148.232:8000
四、一些问题
Wrk是高度并发的WEB服务压测工具, 在统计请求次数时, 当达到几十万次/秒时, 会有几十次的统计误差。
通过服务侧记录的日志条数 (服务每被访问一次时, 记录一条日志) 与wrk输出的请求次数比较, 日志条数会多几十上百条。
摘要:在做web服务开发时, 一般会做服务器后台接口压力测试。本文介绍一款较常见的web压力测试工具wrk, 从wrk的使用方法、内部实现和高阶应用 (二次开发) 三部分由浅入深展开描述。文中给出对wrk的二次开发lua代码片段, 分别对wrk的访问方法、URL和压力测试结果进行改写。满足使用者复杂的使用场景。
关键词:web压力测试,wrk,网络请求吞吐率
参考文献
[1] 《如何在Ubutu14.04与WRK基准HTTP延迟》2015年7月Howtoing运维教程.
【WEB压力测试工具wrk的高阶应用】相关文章:
一种B-S结构的Web应用辅助开发工具09-11
压力测试资料在排水采气中的初步应用11-29
web测试工程师的岗位职责05-14
web测试课笔记05-07
Web前端性能优化的研究与应用09-27
网站测试,Web性能测试与可用性测试04-10
Python语言的Web开发应用论文提纲11-15
基于SSM框架的Web系统研究与应用10-24
AJAX技术在WEB系统中的应用09-10