`
January 16, 2018 本文阅读量

wrk性能测试工具使用总结

wrk 压力测试工具的简单小结。

wrk 压力测试工具的简单小结。 项目地址:https://github.com/wg/wrk

安装

Win: https://github.com/wg/wrk/wiki/Installing-wrk-on-Windows-10 Linux: https://github.com/wg/wrk/wiki/Installing-wrk-on-Linux MacOS: brew install wrk

基本命令

➜ ~ wrk

Usage: wrk <options> <url>                            
  Options:                                            
    -c, --connections <N>  连接数   
    -d, --duration    <T>  持续时间          
    -t, --threads     <N>  线程数  
                                                      
    -s, --script      <S>  制定lua脚本       
    -H, --header      <H>  添加请求头     
        --latency          打印延迟分布信息
        --timeout     <T>  设置请求超时
    -v, --version          打印版本信息      
                                                      
  <N>表示数字参数,支持国际单位 (1k, 1M, 1G)
  <T>表示时间参数,支持国际单位 (2s, 2m, 2h)

简单使用及解释

wrk -t1 -d20s -c10 -s post.lua http://api.example.com/fake/post 以单线程 保持10个连接 持续20秒 运行post.lua脚本访问http://api.example.com/fake/post

报告分析

如下是一个简单的性能测试报告

 Running 10s test @ http://api.example.com/vioce/url
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.71s    98.25ms   1.85s    75.00%
    Req/Sec     0.00      0.00     0.00    100.00%
  5 requests in 10.04s, 1.55KB read
  Socket errors: connect 0, read 0, write 0, timeout 1
Requests/sec:      0.50   //QPS
Transfer/sec:     157.88B //每秒处理数据

编写lua脚本实现post请求

-- wrk 全局变量,改动之后会影响所有的请求
wrk = {
    scheme  = "http",
    host    = "localhost",
    port    = nil,
    method  = "GET",
    path    = "/",
    headers = {},
    body    = nil,
    thread  = <userdata>,
}

json格式

对于json格式数据发情post请求也是很简单的

-- filename: post.json.lua
-- 设置请求方式
wrk.method = "POST"
-- json string
wrk.body = '{"key1": "val1", "key2": "val2"}'
-- 设置content-type
wrk.headers["Content-Type"] = "application/json"

使用post.json.lua 脚本: wrk -t4 -d1m -c10 -s post.json.lua http://api.example.com/fake/post/json

上传文件

实现上传文件测试,与json类似,也是设置wrk.bodywrk.headers, 只是body较麻烦一些

wrk.method = "POST"
wrk.headers["Content-Type"] = "multipart/form-data;boundary=------WebKitFormBoundaryX3bY6PBMcxB1vCan"

file = io.open("path/to/fake.jpg", "rb")

-- 拼装form-data
form = "------WebKitFormBoundaryX3bY6PBMcxB1vCan\r\n"
form = form .. "Content-Disposition: form-data; name="file"; filename="fake.jpg"\r\n"
form = form .. "Content-Type: image/jpeg\r\n\r\n"
form = form .. file:read("*a")
form = form .. "\r\n------WebKitFormBoundaryX3bY6PBMcxB1vCan--"

wrk.body  = form

定制化wrk

定制参考: https://github.com/wg/wrk/blob/master/SCRIPTING

未完待续