wrk 使用记录及踩过的坑
- wrk是什么?
https://github.com/wg/wrkwrk 是一个非常小巧高效的开源性能测试工具,支持lua脚本来创建复杂的测试场景。wrk 的一个很好的特性就是能用很少的线程压出很大的并发量, 原因是它使用了一些操作系统特定的高性能 I/O 机制, 比如 select, epoll, kqueue 等。
PS, lua 脚本的介绍 (Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能),换一句话说,如果大家玩过各类大型MMORPG,大型多人角色扮演在线游戏,有些游戏贩子会叫卖的适用于 DPS 职业的输出宏,一部分宏,就是用 lua 写的,对于玩过游戏的人来说并不陌生。 - 如何使用 wrk ?
a. 首先,从 github 下载源码。
git clone https://github.com/wg/wrk.git
需要补充说明的是,wrk 只能运行在 Unix 类系统上,所以大家可以用 MAC 或者 测试环境中的虚拟机来操作。
下载完成后,可以看到一个目录,wrk,进入该目录。
b. wrk 是用 C 写的一个小巧的工具,因此可以通过 make 进行编译,编译成功以后得到一个可执行文件 wrk
编译 wrk 的关机是系统已经安装 openssl 库,如果系统没有默认安装 openssl, 可以自行安装,参考 sudo yum install openssl-devel 大部分操作系统应该是已经按照好了的c. 执行可执行文件,在 terminal 中执行 ./wrk --help 可以查看 wrk 的用法
xieludeMacBook-Pro:wrk xielu$ ./wrk --help
Usage: 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
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details
Numeric arguments may include a SI unit (1k, 1M, 1G)
Time arguments may include a time unit (2s, 2m, 2h)
简单做一下说明, -c 表示为保持连接状态的连接数, -d 表示本次压力测试的执行时间,单位可以为60s, 1m, 1h, -t 表示执行操作的线程数,-s 表示带lua脚本执行,复杂测试场景,都是依赖 s 后的脚本编写完成后执行的。
--latency 延迟时间数据统计。 - lua 脚本编写。
cd scripts ,可以看到很多 wrk 的脚本,使用 post.lua 作为例子。
原版的 post.lua 内容:-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a headerwrk.method = "POST"
wrk.body = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"做过 http 接口测试的同学应该很熟悉,这里描述了一个非常简单的 POST 的请求。
比如,我要对一个接口进行压力测试 http://10.0.5.52:17070/tbs/ip/search?ip=218.17.158.4&async=1 ,其中 ip= 后的值是可变参数,那么我可以把 post.lua 脚本改写成这样,wrk.method = "GET"
wrk.body = ""
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"request = function()
ip = tostring(math.random(1, 255)).."."..tostring(math.random(1, 255)).."."..tostring(math.random(1, 255)).."."..tostring(math.random(1, 255))
path = "/tbs/ip/search?async=1&ip=" .. ip
return wrk.format(nil, path)
end
这一段描述了非常简单的一个 function, 把 ip 这个变量,用4个 1到255之间的随机数拼成字符串后,作为接口 path 的一部分,发送 GET 请求
tostring 是把 int 转换为 string,.. 可以理解为在 java 中对字符串使用 “+” 的操作来连接。
另存为 test.lua ,并且把这个脚本放在与 wrk 可执行文件平级的位置。 - 执行测试。
xieludeMacBook-Pro:wrk xielu$ ./wrk -t200 -c2000 -d60s -s post.lua --latency http://10.0.5.52:17070
Running 1m test @ http://10.0.5.52:17070
200 threads and 2000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 807.86ms 134.63ms 1.97s 75.92%
Req/Sec 6.95 6.22 70.00 87.60%
Latency Distribution
50% 794.69ms
75% 885.46ms
90% 955.05ms
99% 1.15s
18208 requests in 1.00m, 6.26MB read
Socket errors: connect 0, read 0, write 0, timeout 1129
Requests/sec: 302.94
Transfer/sec: 106.74KB可以看到,在 60s 内 发送了18208 个请求,接口的响应已经非常慢了,达到1s。
如果需要同时监控被测服务的负载,可以打开 zabbix 进行监控,获取到的数据更多
- 踩过的坑:
test.lua 文件必须与 wrk 的可执行文件在同一层目录下,否则会报错找不到脚本,然后执行请求只会得到很多 404 的响应……
wrk 受操作系统的限制,open file 默认为 1024(linux),256(MACOS),所以大家在操作的时候把这个值设大一些。xieludeMacBook-Pro:wrk xielu$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 4096
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
可以看到,我本机上的已经修改为 4096。
如何修改? 使用 root 用户,执行 ulimit -n 你想要的数字。 - 延伸阅读:
wrk 的工作原理,以及如何执行脚本? http://www.tuicool.com/articles/IFjIJjU
lua 怎么写?http://www.runoob.com/lua/lua-tutorial.html
复杂测试场景参考 http://www.cnblogs.com/rainy-shurun/p/5867946.html - wrk中的pipe line怎么做
首先,wrk 支持 luaJIT,所以使用wrk 压测过程中要实现pipe line的话,是在scrip脚本中定义的。
先来了解下 wrk 各个阶段的方法,可以通过自定义同名方法来实现自己想要的功能:初始化:
function setup(thread)
在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
这个方法使用的频率较少。运行时:
function init(args)
注意!!pipe line 在这里定义了!!!!!
先说明,pipe line 中的每个action, 举个栗子,顺序发送请求的话,需要定义一个table, 在table中根据index的顺序定义request.
这个方法的意思是
定义两个全局变量 request,respones并初始化为0
使用wrk 初始化每个请求并作为table的一个元素
最后把这些请求连接起来,即可--request 初始化function init(args)requests = 0responses = 0local p = {}headers = {["Content-Type"] = "application/json",["accessToken"] = "1"}p[1] = wrk.format("POST", "/1",headers,"test=1")p[2] = wrk.format("POST", "/2",headers,"test=2")p[3] = wrk.format("POST", "/3",headers,"{\"test\":\"3\",\"pageNo\":1,\"pageSize\":2")p[4] = wrk.format("POST", "/4",headers,"{\"test\":\"4\",\"pageNo\":1,\"pageSize\":20")req = table.concat(p)end--接收到请求后如何处理function response(status, headers, body)responses = responses + 1if status ~= 200 thenwrk.thread:stop()endend--开始请求function request()requests = requests + 1return reqend--delay,这个暂时没用到,放在这里占位子function delay()end通过对luaJIT的支持,wrk可以实现强大多变的测试场景,而且对于延迟数据的统计也较为准确(参照物是jmeter)关于lua脚本的扩展,欢迎参考补充:lua对于转义符 \ 预先做了一层转移,所以如果使用 \转义的话,需要改为\\\
wrk 使用记录及踩过的坑的更多相关文章
- 记录Appium-desktop踩过的坑could not find devices
最近了解到一个自动化入门的新工具appium-desktop,看网上各种文章,感觉这个工具是很简单的一个入门级工具,下载试用了一下. 官网下载,输入网址appium.io,点击下载. 一路傻瓜式安装, ...
- nrf52832蓝牙开发踩过的坑
接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...
- 开发基于vue前端框架下的系统的UI自动化,记录总结踩的坑
在使用了pytest完成了一个系统的UI自动化后,因为系统的前端框架,是 基于VUE写的,这就让我编写脚本的时候踩了些坑. 无法用JS 修改标签属性,从而进行的操作 比如上传图片,我们的上传是这样子的 ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- CentOS7.2上用KVM安装虚拟机window10踩过的坑
最近两个星期一直在琢磨kvm安装window10操作系统,并且通过桥接模式与外界通信,经历了九九八十一难,终于搞定.下面就记录以下我们在探索的过程中踩过的坑. 安装KVM 1. 系统要求:需要一台可以 ...
- [问题解决]RedHat7更换CentOS7的yum源时踩过的坑
更换yum源的流程 查看当前yum程序 $ rpm -qa|grep yum 这里推荐将其结果截屏或拷贝出来,以免后面报错修复. 删除原有yum源 $ rpm -aq | grep yum|xargs ...
- 记新人从 excel 文件中读取字典数据踩的一个坑
原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...
- 小程序——微信小程序初学踩过的坑
微信小程序初学踩过的坑 一.前言 最近因为某些需要和个人兴趣打算开发一下微信小程序,经过在官方网站上的基本了解,我大体知道了微信小程序开发的大致过程,其实最本质的就是MVVM,借用了很多模式上 ...
- idea 关于高亮显示与选中字符串相同的内容踩过的坑
由 Eclipse 切换到 idea 遇到了很多不熟的地方和踩过的坑,下面记录 idea 关于高亮显示与选中字符串相同的内容踩过的坑. IDEA 2017.2.1 版本修改 Identifier un ...
随机推荐
- FPGA总结——杂谈
数字设计 一.关于组合逻辑 竞争冒险:一个逻辑门的多个输入信号同时跳变(路径时延不同,使得状态改变的时刻有先有后).这种现象叫做竞争,引起的结果称为冒险. 消除毛刺(冒险):(1)增加冗余项:(2 ...
- REST风格的5条关键原则
REST风格的5条关键原则包括: (1)网络上的所有事物都被抽象为资源. (2)每个资源对应一个唯一的资源标识. (3)通过通用的连接件接口对资源进行操作. (4)对资源的各种操作不会改变资源标识. ...
- selenium 淘宝登入反爬虫解决方案(亲测有效)
前言 目前在对淘宝进行数据爬取的时候都会碰到,登入时的滑块问题,无论是手动还是脚本都不成功.这里的很重要一个原因是很多的网站都对selenium做了反爬虫机制.接下来是笔者参考网上的网友们的方法亲自测 ...
- 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序
npm install webpack-dev-server --save
- Docker:Dockerfile命令详解
1.FROM 功能为指定基础镜像,并且必须是第一条指令. 如果不以任何镜像为基础,那么写法为:FROM scratch. 同时意味着接下来所写的指令将作为镜像的第一层开始 语法: FROM <i ...
- Python记录9:函数4:名称空间作用域+闭包函数+装饰器
''' 一: 名称空间namespaces 名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种 内置名称空间: 1. 特点: 存放是python解释器自 ...
- 【2017-05-18】WebForm的Repeater控件及简单控件
<%@ %> - 这里面写一些声明和引用的 <% %> - 编写C#代码的 <%= %> - 往界面上输出一个变量的值 <%# Eval("属性名 ...
- flask 定义数据关系(多对一)
多对一 一对多关系反过来就是多对一关系,这两种关系模式分别从不同的视角出发.一个作者拥有多篇文章,反过来就是多篇文章属于同一个作者.为了便于区分,我们使用居民和城市来演示多对一关系:多个居民住在同一个 ...
- java.lang.RuntimeException: wrong class format Caused by: org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException: null
Spring Boot 启动的时候报的错 使用Drools 5.6版本,Spring Boot1.5.8版本,JAVA8版本,Eclipse4.4.2版本. Google后在Stack上发现一个,中文 ...
- https连接器
非对称性加密:A生成一份公私钥,将公钥交给需要进行数据传输的B,B发送数据时先用公钥对数据进行加密,然后发送给A,再由A使用私钥进行解密. 但存在漏洞即B如何确认公钥是由A提供的.因此需要一个第三方机 ...