wrk(1)- 详细使用
介绍
- wrk 是一个类似 ab(apache bench)、jmeter 的压力测试工具,官方称它为:现代的 HTTP 基准测试工具
- 用 C 编写的 HTTP 协议压测工具
- 底层基于 epoll 和 kqueue 实现,使用了多线程和多路复用 IO(非阻塞 IO),利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量
- 降低测试工具本身性能开销对测试结果准确性的影响
- 支持使用 LuaJIT 脚本,可以执行 HTTP 请求生成、响应处理和自定义报告
它的定位
- 轻量级性能测试工具
- 仅支持 HTTP 协议
- 仅支持单机压测,多机器压测需要每个机器都手动执行一次 wrk 命令
- 不可取代 Jmeter、LR 等专业性能工具
架构&简单源码解析

- 在 wrk 里面,每个线程都有自己独立的 Lua 虚拟机和 Event Loop
- 通过命令行参数 -c 指定的连接数,会平均分给所有线程,每个新建的 socket,都会调用 fcntl 将其设置为 NONBLOCK,即非阻塞,然后托管给 Event Loop
- 直接使用 redis 的 Event Loop 实现,适配了不同操作系统的实现
- 启动的时候,每个线程都会新建一个 Lua State,并调用 luaL_dofile 加载命令行参数 -s 指定的 lua 脚本文件
- 如果没有自定义的 lua 脚本,wrk 默认发送的是 HTTP 1.1 GET 请求,用长连接
语法格式
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:与服务器保持的 http 连接数
- -d:压测持续运行时间,可以是 2s、2m、2h
- -t:启动的线程数
- -s:指定 lua 脚本
- -H:自定义 http header 请求头,例如:"User-Agent: benchmark-wrk"
- --latency:打印延迟统计数据
- --time:http 超时时间,如果在此时间内未收到响应,则当做超时
数字参数:可以使用 1k、1M、1G 单位
-t
- 一般是 CPU 核数,最大不要超过 CPUx2 核数,否则会带来额外的上下文切换,将线程数设置为 CPU 核数主要是为了 WRK 能最大化利用 CPU,使结果更准确(截取网上,暂时没看到官方推荐)
- 和并发数没有直接关系
- 查看 Linux CPU 总核数:
grep processor /proc/cpuinfo |wc -l
-c
- 连接数(connection)可以理解为并发数
- 一般在测试过程中,这个值需要使用者不断向上调试,直至 QPS 达到一个临界点,便可认为此时的并发数为系统所能承受的最大并发量
- 实际上,wrk 会为每个线程分配(c/t)个 socket 连接
- 每个连接会先执行请求动作,然后等待直到收到响应后才会再发送请求,所以每个时间点的并发数大致等于连接数(connection)
官方 Tips
- 运行 wrk 的机器必须有足够数量的临时端口可用,关闭的 socket 必须快速回收
- 仅更改 HTTP 方法、路径、添加请求头或正文的用户脚本不会对性能产生影响
- 每个请求的操作,特别是构建新的 HTTP 请求,以及 response() 的使用将必然减少可以生成的负载量
简单栗子
启动 2 个线程,保持 5 个 http 连接打开的状态下,持续压测 10s 的基准测试
wrk -t2 -c5 -d10s https://httpbin.org/get

qps 是 14.85
启动 16 个线程,保持 400 个 http 连接打开的状态下,持续压测 5s 的基准测试,并打印延迟统计数据
wrk -t16 -c400 -d5s --latency https://httpbin.org/get

qps 是 578.7
结果解析
Running 5s test @ https://httpbin.org/get 压测时间5s
16 threads and 400 connections 共16个测试线程,400个连接,和上参数设置一样
Thread Stats Avg Stdev Max +/- Stdev
平均值 标准差 最大值 正负标准差的范围,越大表示值和平均值不会差很多,离散也不大,表示 Avg 相对可信
Latency 311.74ms 211.97ms 1.57s 90.79%
延迟
Req/Sec 47.86 31.17 170.00 66.79%
每个线程每秒的完成的请求数
Latency Distribution 延迟分布
50% 234.77ms
75% 244.43ms
90% 402.99ms
99% 1.26s 99% 的请求在 1.26s 内完成
2938 requests in 5.08s, 1.21MB read 5.08 s内共处理完成了 2938 个请求,读取了 1.21MB 数据
Socket errors: connect 166, read 0, write 0, timeout 1 Socket 成功连接 166个,超时 1 个
Requests/sec: 578.70 平均每秒处理完成 578.7 个请求,QPS=578.7
Transfer/sec: 243.05KB 平均每秒读取数据 243.05KB
-t 的一些实验
测试资源
- 施压机:16c32g
- 受压机:8c16g
接下来对某个接口进行基准测试
16 个线程,400个并发量,持续运行 5min

qps:20504.3
64 个线程,400个并发量,持续运行 5min

qps:19948.69
128 个线程,400个并发量,持续运行 5min

qps:18811.35
结论
- 线程数增加,qps 反而下降
- 初步可以认为,-t 线程数取系统 CPU 核数是一个比较靠谱的建议
wrk(1)- 详细使用的更多相关文章
- Http压测工具wrk使用指南
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- Http压测工具wrk使用指南【转】
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- 性能测试工具 wrk 使用教程
文章首发自个人微信公众号:小哈学Java 个人网站地址:https://www.exception.site/wrk 被面试官经常问到之前开发的系统接口 QPS 能达到多少,经常给不出一个数值,支支吾 ...
- linux下wrk的安装
wrk是linux下开源的性能测试工具,并且只能在linux下运行,下面介绍下安装教程(以ubantu18.04环境为例): 1.预先安装git,如:apt install git 2.从git上拉取 ...
- http压测工具wrk使用
安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...
- nginx压测工具--wrk
基本使用 命令行敲下wrk,可以看到使用帮助 Usage: wrk <options> <url> Options: -c, --connections <N> C ...
- 使用wrk进行压力测试
最近需要对新的服务进行压力测试.比较了ab和jemeter以及wrk.最终选择wrk来作为压力测试工具,可以把cpu压到100%. 官方源码: https://github.com/wg/wrk 安装 ...
- HTTP性能测试工具wrk安装及使用
wrk 是一个很简单的 http 性能测试工具,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于HTTP性能测试工具,但是比 ab 功能更加强大,并且可以支持l ...
- http压测工具wrk
安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...
- wrk性能测试(详解)
一.简介 wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产 ...
随机推荐
- POJ 3228 二分最大流
题意: 给你N个位置,每个位置都有金矿数量和仓库数量,然后位置和位置之间的距离给了出来,最后问你吧所有的金矿都放到库里面走的路径 最长的最短 是多少? 思路: 比较简单的一个题, ...
- Python脚本抓取京东手机的配置信息
以下代码是使用python抓取京东小米8手机的配置信息 首先找到小米8商品的链接:https://item.jd.com/7437788.html 然后找到其配置信息的标签,我们找到其配置信息的标签为 ...
- URL分发器(视图层)
目录 视图 URL映射 path函数 URL中传入参数 普通传入参数 变量形式传入参数 URL中包含另一个urls模块 URL命名.URL反转.应用命名空间 视图 视图一般都写在 app 的 vi ...
- Windows核心编程 第26章 窗口消 息
窗 口 消 息 Wi n d o w s允许一个进程至多建立10 000个不同类型的用户对象(User object):图符.光标.窗口类.菜单.加速键表等等.当一个线程调用一个函数来建立某个对象时, ...
- <JVM中篇:字节码与类的加载篇>02-字节码指令集
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 前端基础问题:CSS居中的几种方式
水平居中 (1)内联元素: text-align: center; 利用 text-align: center :可以实现在块级元素内部的内联元素水平居中. 如果一行中有多个块级元素,可以通过设置块级 ...
- Day008 数组的使用
数组的使用 For-Each循环 数组作方法入参 数组作返回值 用普通for循环遍历 int[] arrays={1,2,3,4,5}; //打印全部的数组元素 for (int i = 0; i & ...
- 在微信框架模块中,基于Vue&Element前端,通过动态构建投票选项,实现单选、复选的投票操作
最近把微信框架的前端改造一下,在原来基于Bootstrap框架基础上的微信后台管理,增加一套Vue&Element的前端,毕竟Vue的双向绑定开发起来也还是很方便的,而且Element本身也提 ...
- Java容器 | 基于源码分析List集合体系
一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...
- Dom树,什么是dom树?
相信很多初学前端的小伙伴,学了html,css,js之后,欣喜之余还有一丝小傲娇,没有想到那些大佬们口中又 提到了DOM树.你两眼一抹黑,年轻人总是要接受社会的爱(du)护(da). DOM 是 Do ...