oha 是一个小型程序,用于向 Web 应用发送一些负载,并展示受 rakyll/hey 启发的实时 TUI。
该程序使用 Rust 编写,并由 tokio 提供支持,并使用 ratatui 展示美观的 TUI。
该程序基于稳定的 Rust 构建,通过 Cargo 安装需要 make 和 cmake 作为先决条件。
cargo install oha
您可以选择将 oha 构建在 native-tls 上而不是 rustls。
cargo install --no-default-features --features native-tls oha
您可以通过启用 vsock 功能来启用 VSOCK 支持。
cargo install --features vsock oha
您可以通过启用 http3 功能来启用实验性的 HTTP3 支持。这使用了由 Hyper 开发者提供的 H3 库。
只要 H3 仍处于实验阶段,它就会保持实验性。目前它依赖于使用 rustls 进行 TLS。
您可以从每个版本的 发布页面 或每次提交的 发布工作流 和 发布 PGO 工作流 下载预构建的二进制文件。
pacman -S oha
brew install oha
winget install hatoo.oha
在 Debian (Azlux's repository) 上
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 env use oha您也可以构建并创建包含 oha 的容器镜像
docker build -t hatoo/oha:latest .然后您可以通过容器直接使用 oha
docker run --rm -it --network=host hatoo/oha:latest https://example.com:3000您可以通过以下命令使用 PGO 构建 oha:
bun run pgo.js并且二进制文件将位于 target/[target-triple]/pgo/oha。
注意:请记住,为了运行上述命令,
您需要安装 cargo-pgo cargo 包。
您可以通过 cargo install cargo-pgo 安装它。
- Linux - 在 Ubuntu 18.04 gnome-terminal 上测试
- Windows 10 - 在 Windows Powershell 上测试
- MacOS - 在 iTerm2 上测试
-q 选项的工作方式与 rakyll/hey 不同。它是设置总体每秒查询次数,而不是针对每个工作线程。
Ohayou(おはよう), HTTP load generator, inspired by rakyll/hey with tui animation.
Usage: oha [OPTIONS] <URL>
Arguments:
<URL> 目标 URL 或包含多个 URL 的文件。
Options:
-n <N_REQUESTS>
要运行的请求数量。接受纯数字或后缀:k = 1,000, m = 1,000,000 (例如 10k, 1m)。 [默认值: 200]
-c <N_CONNECTIONS>
要并发运行的连接数。对于较大的 `-c`,您可能需要增加对打开文件数量的限制。 [默认值: 50]
-p <N_HTTP2_PARALLEL>
在 HTTP/2 上发送的并行请求数量。`oha` 将总共运行 c * p 个并发工作线程。 [默认值: 1]
-z <DURATION>
应用程序发送请求的持续时间。
在 HTTP/1 上,当达到持续时间时,正在进行的请求会被中止并计为“因截止时间而中止”
您可以使用 `-w` 选项更改此行为。
当前,在 HTTP/2 上,当达到持续时间时,会等待正在进行的请求。`-w` 选项被忽略。
示例:-z 10s -z 3m。
-w, --wait-ongoing-requests-after-deadline
当达到持续时间时,等待正在进行的请求
-q <QUERY_PER_SECOND>
总体查询速率限制,单位为每秒查询次数 (QPS)
--burst-delay <BURST_DURATION>
在预定义数量的请求之间引入延迟。
注意:如果指定了 qps,则会忽略 burst
--burst-rate <BURST_REQUESTS>
突发请求的速率。默认为 1
注意:如果指定了 qps,则会忽略 burst
--rand-regex-url
使用 rand_regex crate 生成 URL,但点在此查询中被禁用 例如 http://127.0.0.1/[a-z][a-z][0-9]。当前动态方案、主机和端口与 keep-alive 不能很好地工作。有关语法细节,请参见 https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html。
--urls-from-file
从文件读取要查询的 URL
--max-repeat <MAX_REPEAT>
'--rand-regex-url' 的参数。max_repeat 参数给出了 x*, x+ 和 x{n,} 操作符将变成的最大额外重复次数。 [默认值: 4]
--dump-urls <DUMP_URLS>
将目标 URL 转储 <DUMP_URLS> 次以调试 --rand-regex-url
--latency-correction
校正延迟以避免协调遗漏问题。如果未设置 -q,则忽略此选项。
--no-tui
无实时 TUI
--fps <FPS>
TUI 的帧率。 [默认值: 16]
-m, --method <METHOD>
HTTP 方法 [默认值: GET]
-H <HEADERS>
自定义 HTTP 头。示例:-H "foo: bar"
--proxy-header <PROXY_HEADERS>
自定义代理 HTTP 头。示例:--proxy-header "foo: bar"
-t <TIMEOUT>
每个请求的超时时间。默认为无限。
--connect-timeout <CONNECT_TIMEOUT>
建立新连接的超时时间。默认为 5s。 [默认值: 5s]
-A <ACCEPT_HEADER>
HTTP Accept 头。
-d <BODY_STRING>
HTTP 请求体。
-D <BODY_PATH>
从文件读取 HTTP 请求体。
-Z <BODY_PATH_LINES>
逐行从文件读取 HTTP 请求体。
-F, --form <FORM>
指定 HTTP multipart POST 数据 (与 curl 兼容)。示例:-F 'name=value' -F 'file=@path/to/file'
-T <CONTENT_TYPE>
内容类型。
-a <BASIC_AUTH>
基本认证 (用户名:密码),或 AWS 凭证 (访问密钥:私有密钥)
--aws-session <AWS_SESSION>
AWS 会话令牌
--aws-sigv4 <AWS_SIGV4>
AWS SigV4 签名参数 (格式: aws:amz:region:service)
-x <PROXY>
HTTP 代理
--proxy-http-version <PROXY_HTTP_VERSION>
连接到代理的 HTTP 版本。可用值 0.9, 1.0, 1.1, 2。
--proxy-http2
使用 HTTP/2 连接代理。相当于 --proxy-http-version=2
--http-version <HTTP_VERSION>
HTTP 版本。可用值 0.9, 1.0, 1.1, 2, 3
--http2
使用 HTTP/2。相当于 --http-version=2
--host <HOST>
HTTP Host 头
--disable-compression
禁用压缩。
-r, --redirect <REDIRECT>
重定向次数限制。设置 0 表示不重定向。HTTP/2 不支持重定向。 [默认值: 10]
--disable-keepalive
禁用 keep-alive,防止在不同 HTTP 请求之间重用 TCP 连接。HTTP/2 不支持此功能。
--no-pre-lookup
*不* 在开始时执行 DNS 查找以缓存它
--ipv6
仅查找 ipv6。
--ipv4
仅查找 ipv4。
--cacert <CACERT>
(TLS) 使用指定的证书文件验证对等方。即使指定了此参数,也会使用本机证书存储。
--cert <CERT>
(TLS) 使用指定的客户端证书文件。必须同时指定 --key
--key <KEY>
(TLS) 使用指定的客户端密钥文件。必须同时指定 --cert
--insecure
接受无效证书。
--connect-to <CONNECT_TO>
使用类似 'example.org:443:localhost:8443' 的字符串覆盖 DNS 解析和默认端口号
注意:如果对同一 host:port:target_host:target_port 多次使用,将随机选择
--no-color
禁用配色方案。 [环境变量: NO_COLOR=]
--unix-socket <UNIX_SOCKET>
连接到 Unix 套接字而不是 URL 中的域。仅适用于非 HTTPS URL。
--stats-success-breakdown
在时间直方图和分布统计信息中包含响应状态码成功或失败的分解
--db-url <DB_URL>
将成功的请求写入 sqlite 数据库 URL,例如 test.db
--debug
执行单个请求并转储请求和响应
-o, --output <OUTPUT>
将结果写入的输出文件。如果未指定,则结果写入标准输出。
--output-format <OUTPUT_FORMAT>
输出格式 [默认值: text] [可能的值: text, json, csv, quiet]
-u, --time-unit <TIME_UNIT>
要使用的时间单位。如果未指定,则自动确定时间单位。此选项仅影响文本格式。 [可能的值: ns, us, ms, s, m, h]
-h, --help
打印帮助
-V, --version
打印版本当设置了 --no-tui 选项且未设置 -q 和 --burst-delay 时,oha 会使用更快的实现,因为它可以避免实时收集数据的开销。
默认情况下,oha 输出结果的文本摘要。
当设置了 --output-format json 选项时,oha 会打印 JSON 摘要输出。
JSON 输出的模式定义在 schema.json 中。
当使用 --output-format csv 时,每个请求的结果将以逗号分隔值的形式打印为一行。
oha 使用从 rakyll/hey 继承的默认选项,但您可能需要更改选项以在更现实的条件下进行压力测试。
我建议使用以下选项运行 oha。
oha <-z or -n> -c <并发连接数> -q <每秒查询数> --latency-correction --disable-keepalive <目标地址>-
--disable-keepalive
在现实中,用户不会使用 Keep-Alive 查询同一个 URL。您可能希望在没有 Keep-Alive 的情况下运行。
-
--latency-correction
您可以使用
--latency-correction来避免协调遗漏问题。
您可以使用 --burst-delay 与 --burst-rate 选项一起,在定义数量的请求之间引入延迟。
oha -n 10 --burst-delay 2s --burst-rate 4在这种特定场景中,每 2 秒处理 4 个请求,6 秒后总共处理 10 个请求。
注意:如果您不设置 --burst-rate 选项,则数量默认为 1
您可以使用 --rand-regex-url 选项为每个连接生成随机 URL。
oha --rand-regex-url http://127.0.0.1/[a-z][a-z][0-9]每个 URL 都由 rand_regex crate 生成,但由于对于此目的来说不实用,且如果 URL 的点被解释为正则表达式的点会非常不便,所以正则表达式的点已被禁用。
您可以选择设置 --max-repeat 选项来限制每个正则表达式的最大重复次数。例如,http://127.0.0.1/[a-z]* 与 --max-repeat 4 一起使用将生成类似 http://127.0.0.1/[a-z]{0,4} 的 URL。
目前,带有 keep-alive 的动态方案、主机和端口无法正常工作。
您可以使用 --urls-from-file 从文件读取目标 URL。该文件的每一行都需要包含一个有效的 URL,如下例所示。
http://domain.tld/foo/bar
http://domain.tld/assets/vendors-node_modules_highlight_js_lib_index_js-node_modules_tanstack_react-query_build_modern-3fdf40-591fb51c8a6e.js
http://domain.tld/images/test.png
http://domain.tld/foo/bar?q=test
http://domain.tld/foo
例如,可以从访问日志创建此类文件,以在服务器的不同页面上生成更真实的负载分布。
当使用这种 URL 规范时,每个请求都会随机访问文件中给出的 URL。
欢迎帮助我们!
以下是一些需要改进的领域。
- 编写测试
- 改进 TUI 设计。
- 显示更多信息?
- 提升速度
- 我是 tokio 新手。我认为在查询调度方面还有一些优化空间。
桌面平板移动/微信 oha (おはよう) GitHub Actions Crates.io Arch Linux Homebrew
ko-fi
oha 是一个小型程序,用于向 Web 应用发送一些负载,并展示受 rakyll/hey 启发的实时 TUI。
该程序使用 Rust 编写,并由 tokio 提供支持,并使用 ratatui 展示美观的 TUI。
演示
安装 该程序基于稳定的 Rust 构建,通过 Cargo 安装需要 make 和 cmake 作为先决条件。
cargo install oha
您可以选择将 oha 构建在 native-tls 上而不是 rustls。
cargo install --no-default-features --features native-tls oha
您可以通过启用 vsock 功能来启用 VSOCK 支持。
cargo install --features vsock oha
您可以通过启用 http3 功能来启用实验性的 HTTP3 支持。这使用了由 Hyper 开发者提供的 H3 库。 只要 H3 仍处于实验阶段,它就会保持实验性。目前它依赖于使用 rustls 进行 TLS。
下载预构建二进制文件 您可以从每个版本的发布页面或每次提交的发布工作流和发布 PGO 工作流下载预构建的二进制文件。
在 Arch Linux 上 pacman -S oha
在 macOS (Homebrew) 上 brew install oha
在 Windows (winget) 上 winget install hatoo.oha
在 Debian (Azlux's repository) 上 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 (Linux, macOS, Windows WSL/GitBash) 您可以使用 x-cmd 安装。
x env use oha
容器化 官方 Docker 镜像 ghcr.io/hatoo/oha
本地构建镜像 您也可以构建并创建包含 oha 的容器镜像
docker build -t hatoo/oha:latest .
然后您可以通过容器直接使用 oha
docker run --rm -it --network=host hatoo/oha:latest https://example.com:3000
基于配置文件的优化 (PGO) 您可以通过以下命令使用 PGO 构建 oha:
bun run pgo.js
并且二进制文件将位于 target/[target-triple]/pgo/oha。
注意:请记住,为了运行上述命令, 您需要安装 cargo-pgo cargo 包。
您可以通过 cargo install cargo-pgo 安装它。
平台 Linux - 在 Ubuntu 18.04 gnome-terminal 上测试 Windows 10 - 在 Windows Powershell 上测试 MacOS - 在 iTerm2 上测试 用法 -q 选项的工作方式与 rakyll/hey 不同。它是设置总体每秒查询次数,而不是针对每个工作线程。
Ohayou(おはよう), HTTP load generator, inspired by rakyll/hey with tui animation.
Usage: oha [OPTIONS]
Arguments: 目标 URL 或包含多个 URL 的文件。
Options:
-n
要运行的请求数量。接受纯数字或后缀:k = 1,000, m = 1,000,000 (例如 10k, 1m)。 [默认值: 200]
-c
要并发运行的连接数。对于较大的 -c,您可能需要增加对打开文件数量的限制。 [默认值: 50]
-p
在 HTTP/2 上发送的并行请求数量。oha 将总共运行 c * p 个并发工作线程。 [默认值: 1]
-z
应用程序发送请求的持续时间。
在 HTTP/1 上,当达到持续时间时,正在进行的请求会被中止并计为“因截止时间而中止”
您可以使用 -w 选项更改此行为。
当前,在 HTTP/2 上,当达到持续时间时,会等待正在进行的请求。-w 选项被忽略。
示例:-z 10s -z 3m。
-w, --wait-ongoing-requests-after-deadline
当达到持续时间时,等待正在进行的请求
-q
总体查询速率限制,单位为每秒查询次数 (QPS)
--burst-delay
在预定义数量的请求之间引入延迟。
注意:如果指定了 qps,则会忽略 burst
--burst-rate
突发请求的速率。默认为 1
注意:如果指定了 qps,则会忽略 burst
--rand-regex-url
使用 rand_regex crate 生成 URL,但点在此查询中被禁用 例如 http://127.0.0.1/[a-z][a-z][0-9]。当前动态方案、主机和端口与 keep-alive 不能很好地工作。有关语法细节,请参见 https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html。
--urls-from-file
从文件读取要查询的 URL
--max-repeat
'--rand-regex-url' 的参数。max_repeat 参数给出了 x*, x+ 和 x{n,} 操作符将变成的最大额外重复次数。 [默认值: 4]
--dump-urls
将目标 URL 转储 次以调试 --rand-regex-url
--latency-correction
校正延迟以避免协调遗漏问题。如果未设置 -q,则忽略此选项。
--no-tui
无实时 TUI
--fps
TUI 的帧率。 [默认值: 16]
-m, --method
HTTP 方法 [默认值: GET]
-H
自定义 HTTP 头。示例:-H "foo: bar"
--proxy-header
自定义代理 HTTP 头。示例:--proxy-header "foo: bar"
-t
每个请求的超时时间。默认为无限。
--connect-timeout
建立新连接的超时时间。默认为 5s。 [默认值: 5s]
-A
HTTP Accept 头。
-d
HTTP 请求体。
-D
从文件读取 HTTP 请求体。
-Z
逐行从文件读取 HTTP 请求体。
-F, --form
指定 HTTP multipart POST 数据 (与 curl 兼容)。示例:-F 'name=value' -F 'file=@path/to/file'
-T
内容类型。
-a
基本认证 (用户名:密码),或 AWS 凭证 (访问密钥:私有密钥)
--aws-session
AWS 会话令牌
--aws-sigv4
AWS SigV4 签名参数 (格式: aws:amz:region:service)
-x
HTTP 代理
--proxy-http-version
连接到代理的 HTTP 版本。可用值 0.9, 1.0, 1.1, 2。
--proxy-http2
使用 HTTP/2 连接代理。相当于 --proxy-http-version=2
--http-version
HTTP 版本。可用值 0.9, 1.0, 1.1, 2, 3
--http2
使用 HTTP/2。相当于 --http-version=2
--host
HTTP Host 头
--disable-compression
禁用压缩。
-r, --redirect
重定向次数限制。设置 0 表示不重定向。HTTP/2 不支持重定向。 [默认值: 10]
--disable-keepalive
禁用 keep-alive,防止在不同 HTTP 请求之间重用 TCP 连接。HTTP/2 不支持此功能。
--no-pre-lookup
不 在开始时执行 DNS 查找以缓存它
--ipv6
仅查找 ipv6。
--ipv4
仅查找 ipv4。
--cacert
(TLS) 使用指定的证书文件验证对等方。即使指定了此参数,也会使用本机证书存储。
--cert
(TLS) 使用指定的客户端证书文件。必须同时指定 --key
--key
(TLS) 使用指定的客户端密钥文件。必须同时指定 --cert
--insecure
接受无效证书。
--connect-to
使用类似 'example.org:443:localhost:8443' 的字符串覆盖 DNS 解析和默认端口号
注意:如果对同一 host:port:target_host:target_port 多次使用,将随机选择
--no-color
禁用配色方案。 [环境变量: NO_COLOR=]
--unix-socket
连接到 Unix 套接字而不是 URL 中的域。仅适用于非 HTTPS URL。
--stats-success-breakdown
在时间直方图和分布统计信息中包含响应状态码成功或失败的分解
--db-url
将成功的请求写入 sqlite 数据库 URL,例如 test.db
--debug
执行单个请求并转储请求和响应
-o, --output
将结果写入的输出文件。如果未指定,则结果写入标准输出。
--output-format
输出格式 [默认值: text] [可能的值: text, json, csv, quiet]
-u, --time-unit
要使用的时间单位。如果未指定,则自动确定时间单位。此选项仅影响文本格式。 [可能的值: ns, us, ms, s, m, h]
-h, --help
打印帮助
-V, --version
打印版本
性能 当设置了 --no-tui 选项且未设置 -q 和 --burst-delay 时,oha 会使用更快的实现,因为它可以避免实时收集数据的开销。
输出 默认情况下 oha 输出结果的文本摘要。
当设置了 --output-format json 选项时,oha 会打印 JSON 摘要输出。 JSON 输出的模式定义在 schema.json 中。
当使用 --output-format csv 时,每个请求的结果将以逗号分隔值的形式打印为一行。
提示 在更现实的条件下进行压力测试 oha 使用从 rakyll/hey 继承的默认选项,但您可能需要更改选项以在更现实的条件下进行压力测试。
我建议使用以下选项运行 oha。
oha <-z or -n> -c <并发连接数> -q <每秒查询数> --latency-correction --disable-keepalive <目标地址>
--disable-keepalive
在现实中,用户不会使用 Keep-Alive 查询同一个 URL。您可能希望在没有 Keep-Alive 的情况下运行。
--latency-correction
您可以使用 --latency-correction 来避免协调遗漏问题。
突发功能 您可以使用 --burst-delay 与 --burst-rate 选项一起,在定义数量的请求之间引入延迟。
oha -n 10 --burst-delay 2s --burst-rate 4
在这种特定场景中,每 2 秒处理 4 个请求,6 秒后总共处理 10 个请求。 注意:如果您不设置 --burst-rate 选项,则数量默认为 1
动态 URL 功能 您可以使用 --rand-regex-url 选项为每个连接生成随机 URL。
oha --rand-regex-url http://127.0.0.1/[a-z][a-z][0-9]
每个 URL 都由 rand_regex crate 生成,但由于对于此目的来说不实用,且如果 URL 的点被解释为正则表达式的点会非常不便,所以正则表达式的点已被禁用。
您可以选择设置 --max-repeat 选项来限制每个正则表达式的最大重复次数。例如,http://127.0.0.1/[a-z]* 与 --max-repeat 4 一起使用将生成类似 http://127.0.0.1/[a-z]{0,4} 的 URL。
目前,带有 keep-alive 的动态方案、主机和端口无法正常工作。
从文件读取 URL 功能 您可以使用 --urls-from-file 从文件读取目标 URL。该文件的每一行都需要包含一个有效的 URL,如下例所示。
http://domain.tld/foo/bar http://domain.tld/assets/vendors-node_modules_highlight_js_lib_index_js-node_modules_tanstack_react-query_build_modern-3fdf40-591fb51c8a6e.js http://domain.tld/images/test.png http://domain.tld/foo/bar?q=test http://domain.tld/foo
例如,可以从访问日志创建此类文件,以在服务器的不同页面上生成更真实的负载分布。
当使用这种 URL 规范时,每个请求都会随机访问文件中给出的 URL。
贡献 欢迎帮助我们!
以下是一些需要改进的领域。
编写测试 改进 TUI 设计。 显示更多信息? 提升速度 我是 tokio 新手。我认为在查询调度方面还有一些优化空间。
