写点什么

4. 堪比 JMeter 的.Net 压测工具 - Crank 进阶篇 - 认识 wrk、wrk2

  • 2022 年 4 月 12 日
  • 本文字数:2205 字

    阅读完需:约 7 分钟

1. 前言

上一篇文章我们了解了 bombardier,并知道了 bombardier.yml 与开源项目 bombardier 的关系,接下来的文章我们了解一下 wrk、wrk2,并对比一下它们与 bombardier 的关系


2. 认识 wrk

wrk是一种现代 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大量负载。它结合了多线程设计和可扩展的事件通知系统,例如 epoll 和 kqueue。


其支持参数:


-c, --connections: total number of HTTP connections to keep open with                   each thread handling N = connections/threads
-d, --duration: duration of the test, e.g. 2s, 2m, 2h
-t, --threads: total number of threads to use
-s, --script: LuaJIT script, see SCRIPTING
-H, --header: HTTP header to add to request, e.g. "User-Agent: wrk"
--latency: print detailed latency statistics
--timeout: record a timeout if a response is not received within this amount of time.
复制代码


基础用法:


运行了 30 秒的基准测试, 使用 2 个线程、100 个 http 连接:


wrk -t2 -c100 -d30s http://127.0.0.1:8080/index.html
复制代码


进阶用法:


每次发送三个 http 请求:


wrk -t2 -c100 -d30s --script ./pipeline.lua http://127.0.0.1:8080
复制代码


新建 pipeline.lua


-- example script demonstrating HTTP pipelining
init = function(args) local r = {} r[1] = wrk.format(nil, "/?foo") r[2] = wrk.format(nil, "/?bar") r[3] = wrk.format(nil, "/?baz")
req = table.concat(r)end
request = function() return reqend
复制代码

3. 认识 wrk2

wrk2是一个主要基于 wrk 的 HTTP 基准测试工具。是一个被 wrk 修改以产生恒定的吞吐量负载,并将延迟细节精确到高 9s(即当运行足够长的时间时可以产生准确的 99.9999%'ile)。除了 wrk 的参数之外,wrk2 通过 --rate 或 -R 参数(默认为 1000)采用吞吐量参数(每秒总请求数)


除支持 wrk 的参数之外,还支持参数:


-R, --rate: 采用吞吐量参数(每秒总请求数),默认为1000
复制代码


基础用法:


运行了 30 秒的基准测试, 使用 2 个线程、100 个 http 连接、并保持每秒 2000 个请求的恒定吞吐量:


wrk -t2 -c100 -d30s -R2000 http://127.0.0.1:8080/index.html
复制代码


高级用法与 wrk 一致,此处忽略不写


我们使用 wrk2 测试一下百度的压测情况


安装:


sudo apt install wgetsudo wget https://aspnetbenchmarks.blob.core.windows.net/tools/wrk2
复制代码


运行:


./wrk2 -d 3s -c 200 -t 200 -R 10 -L https://www.baidu.com
复制代码



输出了本次请求每秒请求次数、吞吐量以及详细情况:


  • Requests/sec: 每秒请求次数

  • Transfer/sec: 每秒吞吐量

4. 了解 Microsoft.Crank.Jobs.Wrk

在 Microsoft.Crank.Jobs.Wrk 项目中 Program.cs


  1. 检查平台是否是 64 位的 Linux 系统、并检查参数是否满足要求

  2. 通过 HttpClient 发送请求,并记录第一次发送请求所消耗的时间

  3. 下载 wrk,并设置 wrk 是可执行的

  4. 通过 yml 传递过来的参数构建完整的 wrk 命令

  5. 将输出的结果使用追加到 stringBuilder 上,再赋值给 output,

  6. 通过正则匹配结果,最后通过 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,欢迎联系我们



发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2021.10.26 加入

还未添加个人简介

评论

发布
暂无评论
4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2_C#_MASA技术团队_InfoQ写作平台