wrk和lua一起做压测

Posted 测试轩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wrk和lua一起做压测相关的知识,希望对你有一定的参考价值。


Lua

本机安装max:

  • curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz下载

  • cd lua-5.3.5

  • make macosx test编译安装

  • lua xxx.lua运行lua脚本

  • /Users/zhouyajun/tools/lua-5.3.5/src

Lua语法

数据类型

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回,

数据类型 描述
nil 表示一个无效值类似python中的None,在if语句中相当于false
boolean 布尔型,只有两个值truefalse
number 标识双精度类型的实浮点数
string 字符串由一对双引号或者单引号表示
function 函数
userdata 表述任意存储在变量中的C数据结构
table 一种类似python字典的数据类型,通过构造表达式来创建,{}创建一个空表
thread 表示独立执行的线路
  • table

        key1,key2为我们指定的索引,"val3"没有指定索引,默认会从1开始
       tab1 = { key1 = "val1", key2 = "val2", "val3" }    for k,v in pairs(tab1) do
            print(k .. "-" .. v)    end
       输出:    1-val3
       key1-val1
       key2-val2
    • table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

    • Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串

  • 字符串

    • 字符串连接: ..符号

    • 获取长度: #

变量
  • 全局变量

  • 局部变量: local b = 5

内置函数
  • type:返回一个变量的数据类型

循环
  • while循环

while( true )do
  print("循环将永远执行下去")end
  • for循环

  • 循环嵌套

  • Lua repeat...until

流程控制
if(0) then
   print("0 为真")end
迭代器
协同程序
文件IO
面向对象
数据库访问

wrk

特性

能用很少的线程压出很大的并发量

实现机制
  • 使用系统的高性能io机制-事件复用机制,select、epoll、kqueue

    • 准备就绪模式的select/poll,当事件可用,便轮询所有事件找出哪个可以进行IO操作

    • epoll:不能在单次系统调用中多次更新兴趣集。当你的兴趣集中有100个文件描述符需要更新状态时,你不得不调用100次epoll_ctl()函数,只能基于文件描述符工作,但在unix系统中并不是所有都是文件,时钟、信号量、进程等

    • kqueue:kqueue弥补了以上epoll的缺陷

基本使用以及参数解析
➜  src wrk --version
wrk  [kqueue] Copyright (C) 2012 Will Glozer [kqueue]版本使用的io机制,我用的是5.0以上,4.0是epoll
Usage: wrk <options> <url>
 Options:
   -c, --connections <N>  Connections to keep open 总的http并发数
   -d, --duration    <T>  Duration of test        持续时间
   -t, --threads     <N>  Number of threads to use  总线程数

   -s, --script      <S>  Load Lua script file   指定lua脚本
   -H, --header      <H>  Add header to request   添加http头部
       --latency          Print latency statistics   打印延迟统计情况
       --timeout     <T>  Socket/request timeout     http超时时间
   -v, --version          Print version details
➜  src wrk -t8 -c200 -d10 --latency https://wwww.baidu.com
Running 10s test @ https://wwww.baidu.com  压测时间10秒
 8 threads and 200 connections  共八个线程,200个链接
 Thread Stats   Avg     Stdev     Max   +/- Stdev
              平均值    标准差    最大值   正负一个标准差所占比例
   Latency    20.88ms   24.35ms 473.81ms   96.52%
   延迟
  Req/Sec     1.35k   373.29     2.00k    72.50%
 处理中的请求数每秒
 Latency Distribution延时分布
    50%   15.91ms
    75%   19.47ms
    90%   26.60ms
    99%  174.22ms
 107641 requests in 10.03s, 36.64MB read,10.03s共处理107641请求,读取了36.64MB数据
Requests/sec:  10730.89   平均每秒处理完成10730.89各请求
Transfer/sec:  3.65MB     平均每秒读取数据3.65MB
wrk使用Lua脚本进行测试
  • 脚本中hook函数

    • setup(thread):每个线程调用一次
      调用此方法时会传入thead对象,可在setup方法中操作该对象,获取信息、存储信息等

    • init(args):每个线程执行一次,可以接受 wrk 命令行的额外参数

    • delay:这个函数返回一个数值,在这次请求执行完以后延迟多长时间执行下一个请求,可以对应 thinking time 的场景,每次请求调用

    • request:通过这个函数可以每次请求之前修改本次请求体和Header,我们可以在这里写一些要压力测试的逻辑,每次请求调用

    • response:每次请求返回以后被调用,可以根据响应内容做特殊处理,比如遇到特殊响应停止执行测试,或输出到控制台等等,每次请求调用

    • done:整个压测过程只执行一次,可用来定制测试报告

    未完待续。。。。。。

以上是关于wrk和lua一起做压测的主要内容,如果未能解决你的问题,请参考以下文章

wrk 现代HTTP压测工具,动态构建请求

如何做压测?

小实验使用 wrk 的 docker 容器来压测另一个容器

Http压测工具wrk使用指南

Http压测工具wrk使用指南

压测工具siege和wrk