Wrk压测发送Post请求的正确姿势

一、Wrk简介

wrk 是一个能够在单个多核 CPU 上产生显著负载的现代 HTTP 基准测试工具。它采用了多线程设计,并使用了像 epoll 和 kqueue 这样的可扩展事件通知机制。此外,用户可以指定 LuaJIT 脚本来完成 HTTP 请求生成、响应处理和自定义报告等功能。

二、Wrk安装

wrk仅支持Linux和Unix系列,并不支持Windows

  1. Clone wrk

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

  2. 编译安装

    cd wrk; make; cp wrk /usr/local/bin

3.验证安装

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 与服务器建立并保持的TCP连接数,其实就是并发数
-d 压测的持续时间(单位为秒),默认为 10s
-t 压测的线程数。正常设置为cpu核心线程数的2-4倍即可。如果线程数过多,会因线程上下文切换频繁,影响到压测效果
-s 指定Lua脚本路径。可以通过Lua脚本实现复杂请求
-H 指定请求的 HTTP Header
--latency 压测结束后,打印响应时间统计消息 
--timeout 请求超时时间 
-v 版本信息

三、Wrk实战压测实战

  1. Get请求

    wrk -t32 -c5000 -d60s --timeout 30s --latency https://www.baidu.com/

    Running 1m test @ https://www.baidu.com/
    32 threads and 5000 connections
    Thread Stats Avg Stdev Max +/- Stdev
    Latency 6.59s 5.02s 29.57s 79.01%
    Req/Sec 5.14 4.82 36.00 83.11%
    Latency Distribution
    50% 4.91s
    75% 8.24s
    90% 13.38s
    99% 25.42s
    4677 requests in 1.00m, 51.98MB read
    Socket errors: connect 40, read 0, write 0, timeout 27
    Requests/sec: 77.82
    Transfer/sec: 0.86MB

    a、 Thread Stats 线程统计,包括响应时间以及请求时间
    Latency:响应时间,有平均值、标准偏差、最大值、正负一个标准差占比。
    Req/Sec:每个线程每秒完成的请求数, 同样有平均值、标准偏差、最大值、正负一个标准差占比。
    b、 Latency Distribution 响应时间分布
    50%:50% 的响应时间为4.91s。
    75%:75% 的响应时间为8.24s 。
    90%:90% 的响应时间为13.38s
    99%:99% 的响应时间为25.42s。
    c、 4677 requests in 1.00m, 51.98MB read 1m 完成的总请求数(4677)和数据读取量(51.98MB)
    d、 Socket errors: connect 40, read 0, write 0, timeout 27 错误统计,会统计 connect 连接失败请求个数(40个)、读失败请求个数、写失败请求个数、超时请求个数(27个)。
    e、 Requests/sec: 77.82 每秒请求数为77.82(QPS)
    f、 Transfer/sec: 0.86MB 平均每秒读取0.86MB数据(TPS)

Get请求非常简单,不做过多赘述。

2.Post请求【重点】

  1. 编写执行Post请求的lua脚本,

    --vim post.lua
    wrk.method = "POST"
    wrk.body = "{"gaid":"96a940e6-ada5-4e13-9efb-e444610240cf","ip":"195.16.186.34","ua":"4.10.0 (Linux; U; Android 13; 23021RAAEG MIUI/V15.0.14.0.TMTMIXM) (mipicks; 4003085; 2536)"}"
    wrk.headers["Content-Type"] = "application/json"
    response = function(status, headers, body)
    print(body) --调试用,正式测试时需要关闭,因为解析response非常消耗资源
    end

Ps:划重点这里网上几乎都是错误的教程,错在将写成 wrk.body = '{"gaid":"96a940e6-ada5-4e13-9efb-e444610240cf","ip":"195.16.186.34","ua":"4.10.0 (Linux; U; Android 13; 23021RAAEG MIUI/V15.0.14.0.TMTMIXM) (mipicks; 4003085; 2536)"}' 实际上需要对Body体的Json进行转义并且双引号引用

  1. 调用post.lua脚本进行压测调用

    wrk -t 16 -c 100 -d 30s --latency --timeout 5s --script=post.lua http://10.90.34.194:8080/v1/click/boosted

四、Wrk总结

总体使用起来非常简单,需要注意的就是执行Post请求压测的时候一定要把lua脚本中的wrk.body写正确,不然被压测Server是取不到Body直接报错的。

五、扫码关注 发现精彩内容

相关推荐
恋喵大鲤鱼1 个月前
wrk(1) command
wrk
todoitbo7 个月前
掌握wrk压力测试工具的优化技巧与实践
测试工具·压力测试·wrk
路过秋天7 个月前
Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET Core 版本
wrk·taurus.mvc·ab·性能压力测试
生生世世是所说的1 年前
web api性能测试使用wrk
wrk·web性能测试