WEB压力测试工具wrk的高阶应用

2023-01-20

一、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跟服务器建立并保持的TCP连接数量

-d, --duration压测时间

-t, --threads使用多少个线程进行压测

-s, --script指定Lua脚本路径

  -H, --header为每一个HTTP请求添加HTTP头

  --latency在压测结束后, 打印延迟统计信息

  --timeout超时时间

  u-v, --version打印wrk的详细版本信息

  代表数字参数, 支持国际单位 (1k, 1M, 1G)

  代表时间参数, 支持时间单位 (2s, 2m, 2h)

(四) 举例

  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运维教程.

上一篇:理工科大学人文素质教育方法与途径研究下一篇:农产品免税企业固定资产抵扣问题的探讨