4. 堪比 JMeter 的.Net 压测工具 - Crank 进阶篇 - 认识 wrk、wrk2
1. 前言
上一篇文章我们了解了 bombardier,并知道了 bombardier.yml 与开源项目 bombardier 的关系,接下来的文章我们了解一下 wrk、wrk2,并对比一下它们与 bombardier 的关系
2. 认识 wrk
wrk是一种现代 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大量负载。它结合了多线程设计和可扩展的事件通知系统,例如 epoll 和 kqueue。
其支持参数:
基础用法:
运行了 30 秒的基准测试, 使用 2 个线程、100 个 http 连接:
进阶用法:
每次发送三个 http 请求:
新建 pipeline.lua
3. 认识 wrk2
wrk2是一个主要基于 wrk 的 HTTP 基准测试工具。是一个被 wrk 修改以产生恒定的吞吐量负载,并将延迟细节精确到高 9s(即当运行足够长的时间时可以产生准确的 99.9999%'ile)。除了 wrk 的参数之外,wrk2 通过 --rate 或 -R 参数(默认为 1000)采用吞吐量参数(每秒总请求数)
除支持 wrk 的参数之外,还支持参数:
基础用法:
运行了 30 秒的基准测试, 使用 2 个线程、100 个 http 连接、并保持每秒 2000 个请求的恒定吞吐量:
高级用法与 wrk 一致,此处忽略不写
我们使用 wrk2 测试一下百度的压测情况
安装:
运行:
输出了本次请求每秒请求次数、吞吐量以及详细情况:
Requests/sec: 每秒请求次数
Transfer/sec: 每秒吞吐量
4. 了解 Microsoft.Crank.Jobs.Wrk
在 Microsoft.Crank.Jobs.Wrk 项目中 Program.cs
检查平台是否是 64 位的 Linux 系统、并检查参数是否满足要求
通过 HttpClient 发送请求,并记录第一次发送请求所消耗的时间
下载 wrk,并设置 wrk 是可执行的
通过 yml 传递过来的参数构建完整的 wrk 命令
将输出的结果使用追加到 stringBuilder 上,再赋值给 output,
通过正则匹配结果,最后通过 BenchmarksEventSource 存储并输出到控制台或数据库、csv、json 中
其中:
connections: 每个线程处理时保持打开的 HTTP 连接总数 N = 连接数/线程数
serverUri: 自定义 url,如果此参数存在,则请求地址为: {serverUri}:{serverPort}{path}
serverPort: 服务端口
serverScheme: 服务的 Scheme,默认 http、支持 http、https 两种
serverAddress: 服务地址、不包含 http、例如: www.baidu.com,如果 serverUri 存在,此配置无效,如果不存在,请求格式为: {serverScheme}://{serverAddress}:{serverPort}{path}
path: 服务接口地址,不包含域,例如: /api/check/healthy
warmup: 预热时间,默认 15s,与执行 duration 类似,而并非压测次数
当 warmup > 0 时,会先预热 warmup 秒后再执行一次压测,第二次的压测才是最后返回的结果
当 warmup = 0 时,不进行预热,直接开始压测
duration: 测试时长,默认 15s
threads: 线程数、默认:32
customHeaders: 自定义 headers,如果预设 headers 中没有需要的 header,则通过重写 customHeaders,以完成自定义 header 的目的
pipeline: 管道数量,默认为 1,当大于 1 时,支持同时发送多个请求
script: 如果 pipeline 不大于 1 时,支持自定义 lua 脚本以及 lua 参数{scriptArguments}
5. 总结
优势:
支持 lua 脚本,支持动态参数或者更改请求等复杂操作
使用 C 语言开发、性能高
劣势:
lua 脚本存在学习成本
wrk.yml 的存在是为 Microsoft.Crank.Jobs.Wrk 提供配置参数,Microsoft.Crank.Jobs.Wrk 通过调用开源项目 wrk 实现压测,并将压测结果通过 BenchmarksEventSource 存储并输出到控制台或数据库、csv、json 中
wrk2 是基于 wrk 二次开发,拥有所有 wrk 的配置,并且支持吞吐量限制,bombardier、wrk、wrk2 都是 http 基准测试工具,丰富了 crank 对于 Http 的基准测试能力,三者之间并无优劣之分,根据三者之间的优劣势自行选择适合自己的即可
源码地址:https://github.com/doddgu/crank/tree/sample
开源地址
MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks
MASA.Contrib:https://github.com/masastack/MASA.Contrib
MASA.Utils:https://github.com/masastack/MASA.Utils
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们
版权声明: 本文为 InfoQ 作者【MASA技术团队】的原创文章。
原文链接:【http://xie.infoq.cn/article/36a4682b76c23efbcb3fc7518】。文章转载请联系作者。
评论