OHA简介
OHA是一个用Rust编写的开源项目,灵感来源于rakyll/hey工具,同时结合了tokio异步运行时和ratatui库提供的精美文本用户界面(TUI)。OHA不仅能够发送HTTP请求到指定的Web应用,还能以实时的方式展示测试结果,使得开发人员能够直观地看到系统的表现。
OHA项目托管在GitHub上,其仓库地址为:https://github.com/hatoo/oha。通过该链接,你可以找到最新的代码、文档以及社区贡献。
安装OHA
OHA支持多种操作系统,包括Linux、macOS和Windows。下面将详细介绍如何在不同平台上安装OHA。
在Arch Linux上安装
对于Arch Linux用户,你可以直接使用AUR助手(如yay或pamac)来安装OHA。例如,使用yay命令:
yay -S oha
在macOS上使用Homebrew安装
macOS用户可以通过Homebrew来安装OHA。首先,确保你已经安装了Homebrew,然后运行以下命令:
brew install hatoo/tap/oha
在Windows上使用winget安装
Windows用户可以通过winget包管理器来安装OHA。如果你还没有安装winget,可以从Microsoft的官方网站下载并安装。安装完成后,运行以下命令:
winget install oha
在Debian上使用Azlux的仓库安装
对于Debian用户,你可以添加Azlux的APT仓库来安装OHA。首先,添加仓库到/etc/apt/sources.list
文件中:
deb https://repo.azlux.fr/apt/debian/ stable main
然后,更新APT索引并安装OHA:
sudo apt-get update
sudo apt-get install oha
使用X-CMD安装(适用于Linux、macOS、Windows WSL/GitBash)
X-CMD是一个跨平台的命令行工具,它允许你在不同的操作系统上运行相同的命令。如果你已经安装了X-CMD,你可以使用它来安装OHA:
x-cmd install oha
OHA的使用方法
OHA的使用非常直观,它提供了丰富的命令行选项来定制测试参数。下面将详细介绍OHA的使用方法,并对Usage部分进行中文翻译。
基本用法
OHA的基本用法非常简单,你只需要提供要测试的URL即可。例如:
oha http://example.com
默认情况下,OHA会发送200个请求,并发连接数为50。
选项详解
OHA提供了许多选项来定制测试行为。
- -n<N_REQUESTS>:要运行的请求数。[默认值:200]
- -c<N_CONNECTIONS>:要并发运行的连接数。对于较大的
-c
,你可能需要增加打开文件的限制。[默认值:50] - -p<N_HTTP2_PARALLEL>:在 HTTP/2 上发送的并行请求数。
oha
将总共运行 c*p 个并发工作线程。[默认值:1] - -z:应用程序发送请求的持续时间。如果指定了持续时间,则忽略 n。在 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>:burst 的请求速率。默认值为 1。注意:如果指定了 qps,则忽略 burst。
- –rand-regex-url:使用 rand_regex 库生成 URL,但每个查询禁用点的匹配,例如 http://127.0.0.1/[a-z][a-z][0-9]。目前,动态方案、主机和端口与 keep-alive 配合使用效果不佳。
- –urls-from-file:从文件中读取要查询的 URL。
- –max-repeat<MAX_REPEAT>:用于
--rand-regex-url
的参数。max_repeat 参数给出了 x*、x+ 和 x{n,} 操作符将变成的最大额外重复次数。[默认值:4] - –dump-urls<DUMP_URLS>:调试 --rand-regex-url 时,转储目标 URL。
- –latency-correction:校正延迟以避免协调省略问题。如果未设置 -q,则忽略此项。
- –no-tui:无实时 TUI。
- -j, --json:以 JSON 格式打印结果。
- -fps :TUI 的每秒帧数。[默认值:16]
- -m, --method :HTTP 方法。[默认值:GET]
- -H :自定义 HTTP 头。示例:-H “foo: bar”
- -t :每个请求的超时时间。默认为无限。
- -A <ACCEPT_HEADER>:HTTP Accept 头。
- -d <BODY_STRING>:HTTP 请求体。
- -D <BODY_PATH>:从文件获取 HTTP 请求体。
- -T <CONTENT_TYPE>:Content-Type。
- -a <BASIC_AUTH>:基本身份验证,用户名:密码
- -x :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。
- –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。
- –insecure:接受无效证书。
- –connect-to <CONNECT_TO>:使用类似 ‘example.org:443:localhost:8443’ 的字符串覆盖 DNS 解析和默认端口号。
- –disable-color:禁用颜色方案。
- –unix-socket <UNIX_SOCKET>:连接到 Unix 套接字而不是 URL 中的域。仅适用于非 HTTPS URL。
- –stats-success-breakdown:在时间直方图和分布统计信息中包含响应状态码的成功或不成功细分。
- –db-url <DB_URL>:将成功请求写入 sqlite 数据库 url,例如 test.db。
- –debug:执行单个请求并转储请求和响应。
- -h, --help:打印帮助信息。
- -V, --version:打印版本信息。
JSON 输出:
当设置 -j 选项时,oha 会打印 JSON 输出。JSON 输出的模式在 schema.json 中定义。
基准测试:
性能比较
我们使用 hyperfine 对 oha 和 rakyll/hey 在本地服务器上进行了基准测试。服务器使用 node 编写。你可以通过复制粘贴此文件的内容,然后运行它来启动服务器。复制粘贴文件内容后,你可以在不同的终端选项卡中运行 hyperfine 进行基准测试。
基准测试结果:
- 基准测试 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:hey 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 继承的默认选项,但你可能需要更改选项以在更逼真的条件下进行压力测试。
- –disable-keepalive:在现实中,用户不会使用 Keep-Alive 查询相同的 URL。你可能想要在没有 Keep-Alive 的情况下运行。
- –latency-correction:你可以使用 --latency-correction 来避免协调省略问题。
- Burst 功能:你可以使用 --burst-delay 和 --burst-rate 选项在定义的请求数量之间引入延迟。
- 动态 URL 功能:你可以使用 --rand-regex-url 选项为每个连接生成随机 URL。
- 从文件读取 URL 功能:你可以使用 --urls-from-file 选项从文件中读取目标 URL。