首页 技术 正文
技术 2022年11月23日
0 收藏 510 点赞 3,004 浏览 4604 个字
    1. wrk是什么?
      https://github.com/wg/wrk

      wrk 是一个非常小巧高效的开源性能测试工具,支持lua脚本来创建复杂的测试场景。wrk 的一个很好的特性就是能用很少的线程压出很大的并发量, 原因是它使用了一些操作系统特定的高性能 I/O 机制, 比如 select, epoll, kqueue 等。
      PS, lua 脚本的介绍 (Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能),换一句话说,如果大家玩过各类大型MMORPG,大型多人角色扮演在线游戏,有些游戏贩子会叫卖的适用于 DPS 职业的输出宏,一部分宏,就是用 lua 写的,对于玩过游戏的人来说并不陌生。

    2. 如何使用 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 延迟时间数据统计。

    3. lua 脚本编写。
      cd scripts ,可以看到很多 wrk 的脚本,使用 post.lua 作为例子。
      原版的 post.lua 内容:

      — example HTTP POST script which demonstrates setting the
      — HTTP method, body, and adding a header

      wrk.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 可执行文件平级的位置。

    4. 执行测试。

      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 进行监控,获取到的数据更多

    5. 踩过的坑:
      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 你想要的数字。

    6. 延伸阅读:
      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
    7. 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脚本的扩展,欢迎参考https://github.com/Spillage/wrk-scripts 补充:lua对于转义符 \ 预先做了一层转移,所以如果使用 \转义的话,需要改为\\\

微信扫一扫

支付宝扫一扫

本文网址:https://www.zhankr.net/141119.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:876 阅读:5,475
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:806 阅读:3,696
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:565 阅读:4,510
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:731 阅读:4,472
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:5,388
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:3,268
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

ceotheme@ceo.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站