共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。
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 req
end
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 wget
sudo 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
- 查看平台是否是 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/cra…
开源地址
MASA.BuildingBlocks:https://github.com/masastack/…
MASA.Contrib:https://github.com/masastack/…
MASA.Utils:https://github.com/masastack/…
MASA.EShop:https://github.com/masalabs/M…
MASA.Blazor:https://github.com/BlazorComp…
如果你对咱们的 MASA Framework 感兴趣,无论是代码奉献、应用、提 Issue,欢送分割咱们