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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 这篇文章是关于如何使用Wrk工具进行HTTP基准测试的指南,包括Wrk的安装、基本用法、执行Get和Post请求的示例,以及在进行Post请求测试时正确设置Lua脚本的重要性。

一、Wrk简介

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

二、Wrk安装

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

  1. Clone wrk
git clone https://github.com/wg/wrk.git
  1. 编译安装
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直接报错的。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
6月前
|
监控 测试技术
PTS日志问题之请求压测报告失败如何解决
PTS(Performance Testing Service)是一项面向网站、应用等提供的压力测试服务,用于模拟不同场景下的用户访问,评估系统的性能表现;在进行PTS压测时,可能会出现一些异常或报错,本合集将PTS压测中频繁出现的问题及其解决办法进行汇编,旨在帮助用户更有效地进行性能测试和问题定位。
|
弹性计算 负载均衡 监控
jemeter压测【2万用户每秒5次请求在30秒内处理完请求】(二)
jemeter压测【2万用户每秒5次请求在30秒内处理完请求】
177 0
|
弹性计算 负载均衡 Java
jemeter压测【2万用户每秒5次请求在30秒内处理完请求】(一)
jemeter压测【2万用户每秒5次请求在30秒内处理完请求】
104 0
|
4月前
|
测试技术 Python
我们假设要测试一个名为`http://example.com`的网站,并对其进行简单的GET请求性能测试。
我们假设要测试一个名为`http://example.com`的网站,并对其进行简单的GET请求性能测试。
|
消息中间件 缓存 NoSQL
【红包雨压测】提供2万用户30秒内5次请求的并发服务支持
【红包雨压测】提供2万用户30秒内5次请求的并发服务支持
166 0
|
XML JSON 测试技术
性能测试(10)——http请求详解
协议:向目标服务器发送HTTP请求时的协议,可以是http或者是https ,默认值为http 。 服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。 端口号:目标服务器的端口号,默认值为80 。 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。 路径:目标URL路径(不包括服务器地址和端口) Content encoding :内容的编码方式,默认值为iso8859 同请求一起发送参数:GET请求时url中附带参数可以通过此方式添加 消息体数据:POST/PUT请求JSON数据存放地 自动重定向:表示JM
265 0
性能测试(10)——http请求详解
|
测试技术 数据库
JMeter基于http请求的web接口性能测试总结
[本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值、memory是否发生激变甚至泄露、响应结果的error率以及数据库服务器读写方面的情况是否正常等等情况。
2445 0
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
130 3
|
2月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
108 2
|
13天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
40 3