oha 是一个小程序,它向 Web 应用程序发送一些负载并显示实时 tui,灵感来自 rakyll/hey。
该程序是用 Rust 编写的,由 tokio 提供支持,而 beautiful tui 由ratatui 提供支持。
该程序基于稳定的 Rust 构建,具有通过 Cargo 安装的make
和cmake
先决条件。
cargo install oha
您可以选择针对 native-tls 而不是 rustls 构建 oha。
cargo install --no-default-features --features rustls oha
您可以通过启用vsock
功能来启用 VSOCK 支持。
cargo install --features vsock oha
pacman -S oha
brew install oha
winget install hatoo.oha
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ stable main" | sudo tee /etc/apt/sources.list.d/azlux.list sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg apt update apt install oha
您可以使用 x-cmd 安装。
x 环境使用 oha
您还可以构建和创建包含 oha 的容器镜像
码头工人构建。 -t example.com/hatoo/oha:最新
然后就可以直接通过容器使用oha了
docker run -it example.com/hatoo/oha:最新 https://example.com:3000
您可以使用以下命令使用 PGO 构建oha
:
包子运行 pgo.js
二进制文件将在target/[target-triple]/pgo/oha
处提供。
Linux - 在 Ubuntu 18.04 gnome-terminal 上测试
Windows 10 - 在 Windows Powershell 上测试
MacOS - 在 iTerm2 上测试
-q
选项的工作方式与 rakyll/hey 不同。它设置每秒整体查询而不是针对每个工作人员。
Ohayou(おはよう),HTTP 负载生成器,灵感来自 rakyll/hey 和 tui 动画。 用法:oha [OPTIONS]参数: 目标 URL。 选项: -n 要运行的请求数。 [默认值:200] -c 同时运行的连接数。对于较大的“-c”,您可能应该增加对打开文件数量的限制。 [默认值:50] -p 在 HTTP/2 上发送的并行请求数。 `oha` 将总共运行 c * p 个并发工作线程。 [默认值:1] -z 应用程序发送请求的持续时间。如果指定了持续时间,则忽略 n。 在 HTTP/1 上,当达到持续时间时,正在进行的请求将被中止并计为“由于截止日期而中止”。您可以使用“-w”选项更改此行为。 目前,在 HTTP/2 上,当达到持续时间时,将等待正在进行的请求。 `-w` 选项被忽略。 示例:-z 10s -z 3m。 -w, --在截止日期后等待正在进行的请求 当达到持续时间时,将等待正在进行的请求 -q 所有速率限制,以每秒查询数 (QPS) 为单位 --burst-delay 在预定义数量的请求之间引入延迟。 注意:如果指定了qps,burst将被忽略 --burst-rate 突发请求的速率。默认值为 1 注意:如果指定了qps,burst将被忽略 --rand-正则表达式-url 通过 rand_regex crate 生成 URL,但每个查询都禁用点,例如 http://127.0.0.1/[az][az][0-9]。目前动态方案、具有保持活动状态的主机和端口效果不佳。有关语法的详细信息,请参阅 https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html。 --max-repeat “--rand-regex-url”的参数。 max_repeat 参数给出 x*、x+ 和 x{n,} 运算符将达到的最大额外重复计数。 [默认值:4] --dump-urls 转储目标 URL 次以进行调试 --rand-regex-url --延迟校正 纠正延迟以避免协调遗漏问题。如果未设置 -q 则忽略它。 --no-tui 无实时 tui -j, --json 将结果打印为 JSON --fps tui 的每秒帧数。 [默认值:16] -m, --method HTTP 方法 [默认值:GET] -H 自定义 HTTP 标头。示例: -H "foo: bar" -t 每个请求的超时。默认为无限。 -A HTTP 接受标头。 -d HTTP 请求正文。 -D 文件中的 HTTP 请求正文。 -T 内容类型。 -a 基本身份验证,用户名:密码 --http-version HTTP 版本。可用值 0.9、1.0、1.1。 --http2 使用 HTTP/2。 --http-version=2 的简写 --host HTTP 主机标头 --disable-compression 禁用压缩。 -r, --redirect 重定向次数限制。设置 0 表示不重定向。 HTTP/2 不支持重定向。 [默认值:10] --禁用保持活动 禁用 keep-alive,防止在不同的 HTTP 请求之间重复使用 TCP 连接。 HTTP/2 不支持此功能。 --no-pre-lookup *不*在开始缓存时执行 DNS 查找 --ipv6 仅查找 ipv6。 --ipv4 仅查找 ipv4。 --insecure 接受无效证书。 --connect-to 使用“example.org:443:localhost:8443”等字符串覆盖 DNS 解析和默认端口号 --disable-color 禁用配色方案。 --unix-socket 连接到 unix 套接字而不是 URL 中的域。仅适用于非 HTTPS URL。 --stats-success-breakdown 包含响应状态代码成功或不成功细分的时间直方图和分布统计信息 --db-url 将成功的请求写入 sqlite 数据库 url EG test.db --debug 执行单个请求并转储请求和响应 -h, --help 打印帮助 -V, --version 打印版本
设置-j
选项时, oha
会打印 JSON 输出。 JSON 输出的架构在 schema.json 中定义。
我们使用hyperfine
在本地服务器上对oha
与rakyll/hey
进行基准测试。服务器是使用节点编码的。您可以通过复制粘贴此文件然后通过节点运行它来启动服务器。复制粘贴文件后,您可以通过hyperfine
运行基准测试。
将内容复制粘贴到名为 app.js 的新 javascript 文件中
const http = require("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end("Hello Worldn");});server.listen(3000, () => { console.log("服务器运行在 http://localhost:3000/");});
运行node app.js
在不同的终端选项卡中运行hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
基准1:oha --no-tui http://localhost:3000
时间(平均值 ± σ):10.8 ms ± 1.8 ms [用户:5.7 ms,系统:11.7 ms]
范围(最小值 … 最大值):8.7 ms … 24.8 ms(107 次运行)
基准2:嘿http://localhost:3000
时间(平均值 ± σ):14.3 ms ± 4.6 ms [用户:12.2 ms,系统:19.4 ms]
范围(最小…最大):11.1 ms…48.3 ms(88 次运行)
在此基准测试中,发现oha --no-tui http://localhost:3000
更快,运行速度比hey http://localhost:3000
快大约 1.32 ± 0.48 倍。
oha
使用从 rakyll/hey 继承的默认选项,但您可能需要更改选项以在更现实的条件下进行压力测试。
我建议使用以下选项运行oha
。
oha <-z 或 -n> -c <并发连接数> -q <每秒查询次数> --latency- Correction --disable-keepalive <目标地址>
--禁用保持活动
实际上,用户不会使用 Keep-Alive 查询相同的 URL。您可能想在没有Keep-Alive
情况下运行。
--延迟校正
您可以使用--latency-correction
来避免Coordinated Omission Problem
。
您可以使用--burst-delay
和--burst-rate
选项来在定义数量的请求之间引入延迟。
oha -n 10 --突发延迟 2s --突发速率 4
在这个特定场景中,每 2 秒将处理 4 个请求,6 秒后总共将处理 10 个请求。注意:如果不设置--burst-rate
选项,则数量默认为 1
您可以使用--rand-regex-url
选项为每个连接生成随机 url。
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
每个 URL 都是由 rand_regex crate 生成的,但 regex 的点被禁用,因为它对于此目的没有用处,并且如果 url 的点被解释为 regex 的点,则非常不方便。
您可以选择设置--max-repeat
选项来限制每个正则表达式的最大重复次数。例如 http://127.0.0.1/[az]* 与--max-repeat 4
将生成类似 http://127.0.0.1/[az]{0,4} 的网址
目前动态方案、具有保持活动状态的主机和端口效果不佳。
请随时帮助我们!
这里有一些需要改进的问题。
编写测试
改进 tui 设计。
显示更多信息?
现在实时 tui 中没有颜色。我需要有一定色彩感的人的帮助。
提高速度
我是东京的新手。我认为查询调度还有一些优化的空间。