Restful Api 压力测试有很多专业工具,但那些工具对于开发人员说过于复杂了(我觉得那些是给测试人员用的)。wrk 是一个简单的多线程的基于命令行的测试工具,它的一个很好的特性是用很少的线程压出很大的并发,能快速的验证接口的性能,比较适合开发场景。下面是使用过程记录。需要注意的是 wrk 只能运行在 linux 平台。

安装wrk

需要从github拉代码并编译

git clone https://github.com/wg/wrk.git  
cd wrk
make

编译成功后,会在当前目录中生成可执行的wrk。将其copy到bin目录。

sudo cp wrk /usr/local/bin
whick wrk

使用wrk

简单使用

  • 命令

    wrk -t4 -c10 -d10s -T3s --latency http://www.lefer.cn 
    • -t4 开启四个线程
    • -c10 保持10个连接
    • -d10s 持续测试10秒
    • -T3s 超时设置为3秒
    • –latency 统计延迟分布
  • 执行结果

    [web@localhost ~]$ wrk -t4 -c10 -d10s -T3s --latency http://www.lefer.cn
    Running 10s test @ http://www.lefer.cn
    4 threads and 10 connections
    Thread Stats Avg Stdev Max +/- Stdev
    Latency 19.16ms 12.69ms 237.07ms 99.18%
    Req/Sec 109.24 11.49 121.00 89.50%
    Latency Distribution
    50% 17.95ms
    75% 18.43ms
    90% 19.35ms
    99% 29.69ms
    4372 requests in 10.05s, 1.59MB read
    Requests/sec: 434.84
    Transfer/sec: 161.79KB

    第五行是延迟统计:平均延迟,标准差,最大延迟,正负一个标准差的结果占比

    第六行是线程请求次数统计:每个线程的平均请求次数,标准差,最大请求次数,正负一个标准差的结果占比

    第八到十一行是延迟分布统计:50%的请求延迟在多少以内,75的请求延迟在多少以内,依次类推

    第十二行是总请求数

正常使用

上面的例子太简陋了,下面是一个正常的post请求,并以json格式传递request body数据的例子。

  • 编写lua脚本

    wrk.method = "POST"  
    wrk.headers["Content-Type"] = "application/json;charset=UTF-8"
    wrk.body = '{ "Request": { "Head": { "Version": "1.1", "TransferType": "", "Callback": "", "TranCode": "PV0602", "LicId": "sdssdsds", "ContentType": "text/json", "ContentEncoding": "", "OrgId": "123321", "AppId": "HIS", "MessageId": "123221212121", "AppType": "PC", "SecurityPolicy": "AES", "SecurityContent": "", "Timestamp": "2017-03-23 14:22:49.727" } } } '

    这里需要注意的是wrk.body的数据不能换行。

  • 执行命令

    wrk -t1 -c1 -d10s -T3s --script=bisr.lua --latency http://localhost:8000/v1/bisr

事实上可以在lua脚本里做很多事情,可以参考GitHub上提供的脚本示例

END

欢迎留言讨论