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 |
布尔型,只有两个值true 和false |
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-val2table
不会固定长度大小,有新数据添加时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一起做压测的主要内容,如果未能解决你的问题,请参考以下文章