wrk-lua-脚本使用

技术文档网 2021-05-12

1. lua 语法简介:

  • 基本数据类型包括了8种:

    • boolean
    • string
    • number
    • nil
    • table
    • function
    • thread
    • userdata
  • 环境: 有一个全局环境 _ENV

    > a = 42
    > _ENV.a
    42
    
  • 循环

    > start, end, step = 0, 10, 1
    > for i = start, end, step do print(i); end;
    > i = 0
    > while i < 10; do print(i); i = i + 1; end
    > repeat i = i - 1; print(i) ; until i <= 0
    
  • 分支

    if i > 10 then print(i) elseif i > 5 then print(5) else print(i) end
    
  • 函数定义

    function fib(n)
    prev, now = 0, 1
    i = 0
    while i < n do prev, now = now, prev + now; i = i + 1; end
    return prev
    end
    
  • 包管理

    > function dir(a) keys = ""; for k, _ in pairs(a) do keys = keys .. "," .. k; end print(keys) end
    > dir(package)
    ,searchers,loadlib,loaded,path,config,cpath,searchpath,preload
    > dir(package.loaded)
    ,package,table,bit32,os,math,_G,string,debug,utf8,coroutine,io
    >
    

    package.loaded记录了当前已经require的package名称; package.path以及package.cpath定义了当前lua执行require的时候, 需要搜索的路径, 如果名字相同, lua会优先在path找纯lua的库, 再在cpath中找c extend.

LUA_PATH: 是一个定义package.path的环境变量, 会完全覆盖package.path

搜索一个库: package.searchpath("cjson", package.path .. ";" .. package.cpath)

2. wrk中的lua脚本

2.1 涉及到的几个api

  • setup(thread): 每一个thread将会执行一次, 执行的环境是全局之外的一个环境
  • init(): 每一次thread setup完之后调用, 环境是thread 自带的环境; init中定义变量名的时候, 会给thread的环境写入一个变量名的key, 可以直接在request, reponse 中直接使用变量名
  • request() --> return http : 每次http请求调用搞一次
  • reponse(status, header, body): 每次成功收到回包调用一次
  • done(summary, lantency, requests): 压测结束的时候调用, 环境是全局的

2.2 thread userdata的几个api

  • thread.addr : 当前thread使用的ip:port地址
  • thread:set(name, value): 向thread的环境中写入name = value
  • thread:get(name): 从thread的环境中获得名为name的环境变量
  • thread:stop() : 结束当前thread

2.3 wrk package

可以在init, response, request中使用wrk.thread 获得当前运行该还是的thread

demo:

threads = {}
function dir(module)
    for k, v in pairs(module)
    do
        print(k, v)
    end
end

counter = {}

function setup(thread)
    table.insert(threads, thread)
end

function init()
    wrk.thread:set("d", counter)
end

function request()
    return wrk.request()
end

function response(status, headers, body)
    if d[status] == nil then d[status] = 1;
    else
        d[status] = d[status] + 1
    end
end

function done(summary, latency, requests)
    for i, thread in ipairs(threads)
    do
        for k, v in pairs(thread:get("d"))
        do
            print(i, k, v)
        end
    end
end

相关文章

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod

随机推荐

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod