性能测试工具wrk安装使用详解
建议练习时可以使用FastApi或Flask等Web服务端框架在本地搭建一个HTTP服务。
wrk简介
wrk是一个用于HTTP协议的基准测试工具。基准测试是一种性能测试方法,它通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量和可对比的测试。
GitHub地址:https://github.com/wg/wrk
安装
Mac直接使用HomeBrew进行安装:
$ brew install wrk
命令行选项
在命令行中输入wrk查看命令行选项:
$ wrk
Usage: wrk <options> <url>Options:-c, --connections <N> Connections to keep open# 设置总的 http 并发连接数-d, --duration <T> Duration of test# 设置测试持续时间-t, --threads <N> Number of threads to use# 设置开启的线程数(不能大于设置的并发请求数)-s, --script <S> Load Lua script file# 加载指定的 Lua 脚本-H, --header <H> Add header to request# 添加 http 请求头--latency Print latency statistics# 打印延迟统计情况(建议启用)--timeout <T> Socket/request timeout-v, --version Print version detailsNumeric arguments may include a SI unit (1k, 1M, 1G)Time arguments may include a time unit (2s, 2m, 2h)
基础示例
GET请求:
$ wrk -c100 -t10 -d10s --latency http://localhost:5000/test_get
# 100 个请求分 10 个线程压 10 秒
控制台输出:
Running 10s test @ http://localhost:5000/test_get10 threads and 100 connectionsThread Stats Avg Stdev Max +/- StdevLatency 201.71ms 58.06ms 451.62ms 79.16%Req/Sec 27.94 10.18 70.00 73.70%Latency Distribution50% 196.82ms75% 228.07ms90% 261.79ms99% 394.08ms2817 requests in 10.10s, 473.18KB read
Requests/sec: 278.94
Transfer/sec: 46.86KB
POST请求:
$ wrk -c100 -t10 -d10s -s test_post.lua --latency http://localhost:5000/test_post
# 使用 test_post.lua 脚本
Lua脚本:
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"k1":1,"k2":2}'
控制台输出:
Running 10s test @ http://localhost:5000/test_post10 threads and 100 connectionsThread Stats Avg Stdev Max +/- StdevLatency 188.49ms 60.76ms 352.02ms 67.50%Req/Sec 38.35 23.71 101.00 67.22%Latency Distribution50% 182.22ms75% 230.92ms90% 272.66ms99% 325.02ms3665 requests in 10.10s, 604.87KB read
Requests/sec: 362.77
Transfer/sec: 59.87KB
注:GET请求同样可以使用Lua脚本。
进阶用法
全局变量
Lua脚本在压测时的全局变量(tabel)wrk。
全局变量:
wrk = {scheme = "http",host = "localhost",port = nil,method = "GET",path = "/",headers = {},body = nil,thread = <userdata>,
}
全局方法:
function wrk.format(method, path, headers, body)
--[[wrk.format 方法返回一个 HTTP 请求的字符串,包含传入参数与 wrk 变量的值的组合。
]]--function wrk.lookup(host, service)
--[[wrk.lookup 方法返回一个包含主机所有已知地址的 table 和服务对,这对应于 POSIX 的 getaddrinfo() 方法
]]--
-- host:一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串)
-- service:服务名可以是十进制的端口号,也可以是已定义的服务名称,如ftp、http等function wrk.connect(addr)
--[[判断 addr 是否可以连接上,返回布尔值。addr 必须是一个 wrk.lookup() 方法的返回值。
]]--
Lua脚本的生命周期钩子
启动阶段(Setup):启动阶段开始于请求目标IP地址已解析且所有线程已经初始化但还没启动的时候。
function setup(thread)
--[[在脚本文件中实现 setup 方法,wrk 就会在目标 IP 已解析且测试线程初始化完成但还没有启动的时候调用该方法。wrk 会为每一个测试线程调用一次 setup 方法,并传入代表测试线程的对象 thread 作为参数。setup 方法中可操作该 thread 对象,获取信息、存储信息、甚至关闭该线程。setup 方法每个线程只执行一次。thread 对象提供了 1 个属性,3 个方法:thread.addr 获取或设置线程的服务器地址thread:get(name) 获取线程全局变量thread:set(name, value) 设置线程全局变量thread:stop() 终止线程
]]--
运行阶段(Running):运行阶段开始于对init方法的单次调用,然后在每个请求周期都调用一次request和response方法。
function init(args)
-- 每个线程仅调用 1 次,args 用于获取当前脚本命令行中所有传入的其它命令参数,例如 --env=prefunction delay()
-- 每次发起请求前调用 1 次,在 request 方法前调用,单位为 msfunction request()
-- 每次发起请求前调用 1 次,返回一个包含 HTTP 请求的字符串,wrk 会按该字符串的内容发起 HTTP 请求。
-- 通常会在该方法中调用 wrk.format() 生成 HTTP 请求字符串。function response(status, headers, body)
-- 每次请求返回时调用 1 次,wrk 通过传入 HTTP 响应码,响应头,响应体调用。
结束阶段(Done):
function done(summary, latency, requests)
--[[done 方法接收一个包含测试结果数据的 table 变量 summary 以及两个分别表示每个请求的延迟时间和每个线程的 QPS 的统计对象。持续时间和延迟时间单位均为 ms。整个测试过程中仅被调用 1 次。summary = {duration = N, -- 运行持续时间,单位为 msrequests = N, -- 总共完成的请求书bytes = N, -- 总共接收的数据量errors = {connect = N, -- socket 连接总失败数read = N, -- socket 连接读取总失败数write = N, -- socket 连接写入总失败数status = N, -- total HTTP status codes > 399timeout = N -- total request timeouts}}latency.min -- 最小延时latency.max -- 最大延时latency.mean -- 平均延时latency.stdev -- 延时标准差latency:percentile(99.0) -- 99th percentile valuelatency(i) -- raw value and count
]]--
调用过程示例
命令行语句:
$ wrk -c1 -t1 -d1s -s test_lua.lua http://localhost:5000
Lua脚本:
#!/usr/local/bin/luawrk.body = '{"k1":666}'
path = "/test_post"function setup(thread)print("调用 setup()")print(thread.addr)
endfunction init(args)print("调用 init()")
endfunction delay()print("调用 delay() 等待 500 ms")return 500
endfunction request()print("调用 resquest()")return wrk.format("POST", path)
endfunction response(status, headers, body)print("调用 response()")if (status == 200)thenpath = "/test_get?k1=" .. bodyend
endfunction done(summary, latency, requests)print("调用 done()")
end
控制台输出:
调用 setup()
127.0.0.1:5000
调用 init()
调用 resquest()
Running 1s test @ http://localhost:50001 threads and 1 connections
调用 delay() 等待 500 ms
调用 resquest()
调用 response()
调用 delay() 等待 500 ms
调用 resquest()
调用 response()
调用 delay() 等待 500 msThread Stats Avg Stdev Max +/- StdevLatency 1.08ms 135.06us 1.17ms 100.00%Req/Sec 1.50 0.71 2.00 100.00%2 requests in 1.01s, 525.00B readNon-2xx or 3xx responses: 1
Requests/sec: 1.98
Transfer/sec: 519.09B
调用 done()
HTTP请求日志:
127.0.0.1 - - [15/Nov/2019 11:10:02] "POST /test_post HTTP/1.1" 200 -
127.0.0.1 - - [15/Nov/2019 11:10:03] "POST /test_get?k1={"k1":666} HTTP/1.1" 405 -
最后: 可以在公众号:伤心的辣条 ! 自行领取一份216页软件测试工程师面试宝典文档资料【免费的】。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
性能测试工具wrk安装使用详解相关推荐
- mysql查询性能测试工具_MySQL性能测试工具MySQLslap使用实例详解
原标题:MySQL性能测试工具MySQLslap使用实例详解 MySQLslap是MySQL(了解干货请戳:干货!超过500行的Mysql学习笔记)自带的基准测试工具,优点:查询数据,语法简单,灵活容 ...
- 性能测试工具 wrk 安装与初步使用
开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以支持lua脚本来创建复杂 ...
- HTTP性能测试工具wrk安装及使用
wrk 是一个很简单的 http 性能测试工具,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于HTTP性能测试工具,但是比 ab 功能更加强大,并且可以支持l ...
- Python 自动化工具pyautogui 安装过程详解
Ubuntu 环境上安装pyautogui 的详细步骤如下: 1. 安装pip3 sudo apt-get install python3-pip 2.安装pyautogui pip3 install ...
- php性能测试下载,PHP性能测试工具xhprof安装与使用方法详解
本文实例分析了PHP性能测试工具xhprof安装与使用方法.分享给大家供大家参考,具体如下: xhprof概述: XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞 ...
- 虚拟化工具Xen的安装配置详解
上一篇介绍了虚拟化的基础知识:这里来介绍具体的虚拟化工具的配置使用: 一.Xen的安装配置详解: 1.配置yum源 http://mirrors.163.com/centos/6.5/xen4/x86 ...
- python 自动化办公 案例_python自动化工具之pywinauto实例详解
python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...
- centos6 安装 mantisbt-1.2.8 —— (1) VMware Workstation 12 Pro 虚拟机安装步骤详解(window 10 系统)
对于目前主流之一的VMware 虚拟机而言,一直是各位小伙伴的首选,而VMware 12 Pro 是截止目前最新的VMware Workstation 版本:偶在这里特地给刚刚入坑的小伙伴详细介绍介绍 ...
- linux PHP 编译安装参数详解
linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
最新文章
- 淘宝API商家自用型应用程序全部源代码和详细的帮助文档(1元有偿提供)
- TEASOFT软件 | 动作帮助信息定义语法
- 【机器学习入门到精通系列】不废话直入正题之单变量线性回归(另附单变量非线性代码)
- Anaconda+用conda创建python虚拟环境
- java oracle 乐观锁,oracle为什么默认乐观锁
- Linux应用:FTP
- 不用math type解决word公式上浮问题
- oracle 数据库基础配置,Oracle数据库网络服务配置基础、SQL编程详解-Oracle
- 碉堡了,独家首发Java核心知识点总结,超全!
- 无土栽培中的物联网技术应用
- Xilinx FPGA配置clocking时钟动态相位输出
- IDEA报 java 找不到符号解决办法
- Codeforces Round #531 (Div. 3) F. Elongated Matrix(状压DP)
- 上传身份证照片js_web端上传图片,截取证件照
- 如何设置对话框的最大(小)高度与宽度
- iOS RN学习随笔
- 创建证书与Xcode破解
- Gunicorn配置详解
- 把自己从一个疯狂下载者变成一个真正的学习者
- 音乐网站项目的收尾工作