#负载测试 #http #性能 #tui #性能测试 #测试 http #cli

app oha

Ohayou(おはよう), 受到 rakyll/hey 启发的 HTTP 负载生成器,带有 tui 动画

56 个版本 (10 个稳定版)

1.4.6 2024 年 8 月 18 日
1.4.5 2024 年 5 月 29 日
1.4.4 2024 年 4 月 20 日
1.4.1 2024 年 3 月 17 日
0.2.1 2020 年 3 月 29 日

#4 in 性能分析

Download history 65/week @ 2024-05-03 70/week @ 2024-05-10 80/week @ 2024-05-17 276/week @ 2024-05-24 146/week @ 2024-05-31 401/week @ 2024-06-07 253/week @ 2024-06-14 161/week @ 2024-06-21 47/week @ 2024-06-28 104/week @ 2024-07-05 66/week @ 2024-07-12 63/week @ 2024-07-19 158/week @ 2024-07-26 1341/week @ 2024-08-02 289/week @ 2024-08-09 308/week @ 2024-08-16

每月 2,108 次下载

MIT 许可证

765KB
3.5K SLoC

oha (おはよう)

GitHub Actions Crates.io Arch Linux Homebrew Gitter

ko-fi

oha 是一个小巧的程序,可以向 Web 应用程序发送一些负载,并显示受 rakyll/hey 启发的实时 tui。

此程序用 Rust 编写,由 tokio 和美丽的 tui 由 ratatui 提供支持。

demo

安装

此程序基于稳定 Rust 构建,需要通过 cargo 使用 makecmake 预先安装。

cargo install oha

你可以选择使用 native-tls 而不是 rustls 构建 oha。

cargo install --no-default-features --features rustls oha

你可以通过启用 vsock 功能来启用 VSOCK 支持。

cargo install --features vsock oha

在 Arch Linux 上

pacman -S oha

在 macOS (Homebrew) 上

brew install oha

在 Windows (winget) 上

winget install hatoo.oha

在 Debian (Azlux 的仓库) 上

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

容器化

你还可以构建并创建一个包含 oha 的容器镜像

docker build . -t example.com/hatoo/oha:latest

然后你可以通过容器直接使用 oha

docker run -it example.com/hatoo/oha:latest https://example.com:3000

基于配置文件的优化 (PGO)

你可以使用以下命令使用 PGO 构建 oha

bun run pgo.js

并且二进制文件将在 target/[target-triple]/pgo/oha 处可用。

平台

  • Linux - 在 Ubuntu 18.04 gnome 终端上测试
  • Windows 10 - 在 Windows Powershell 上测试
  • MacOS - 在 iTerm2 上测试

用法

-q 选项与 rakyll/hey 不同。它是按每秒整体查询次数设置,而不是按每个工作进程设置。

Ohayou(おはよう), HTTP load generator, inspired by rakyll/hey with tui animation.

Usage: oha [FLAGS] [OPTIONS] <url>

Arguments:
  <URL>  Target URL.

Options:
  -n <N_REQUESTS>
          Number of requests to run. [default: 200]
  -c <N_CONNECTIONS>
          Number of connections to run concurrently. You may should increase limit to number of open files for larger `-c`. [default: 50]
  -p <N_HTTP2_PARALLEL>
          Number of parallel requests to send on HTTP/2. `oha` will run c * p concurrent workers in total. [default: 1]
  -z <DURATION>
          Duration of application to send requests. If duration is specified, n is ignored.
          On HTTP/1, When the duration is reached, ongoing requests are aborted and counted as "aborted due to deadline"
          You can change this behavior with `-w` option.
          Currently, on HTTP/2, When the duration is reached, ongoing requests are waited. `-w` option is ignored.
          Examples: -z 10s -z 3m.
  -w, --wait-ongoing-requests-after-deadline
          When the duration is reached, ongoing requests are waited
  -q <QUERY_PER_SECOND>
          Rate limit for all, in queries per second (QPS)
      --burst-delay <BURST_DURATION>
          Introduce delay between a predefined number of requests.
          Note: If qps is specified, burst will be ignored
      --burst-rate <BURST_REQUESTS>
          Rates of requests for burst. Default is 1
          Note: If qps is specified, burst will be ignored
      --rand-regex-url
          Generate URL by rand_regex crate but dot is disabled for each query e.g. http://127.0.0.1/[a-z][a-z][0-9]. Currently dynamic scheme, host and port with keep-alive are not works well. See https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html for details of syntax.
      --max-repeat <MAX_REPEAT>
          A parameter for the '--rand-regex-url'. The max_repeat parameter gives the maximum extra repeat counts the x*, x+ and x{n,} operators will become. [default: 4]
      --dump-urls <DUMP_URLS>
          Dump target Urls <DUMP_URLS> times to debug --rand-regex-url
      --latency-correction
          Correct latency to avoid coordinated omission problem. It's ignored if -q is not set.
      --no-tui
          No realtime tui
  -j, --json
          Print results as JSON
      --fps <FPS>
          Frame per second for tui. [default: 16]
  -m, --method <METHOD>
          HTTP method [default: GET]
  -H <HEADERS>
          Custom HTTP header. Examples: -H "foo: bar"
  -t <TIMEOUT>
          Timeout for each request. Default to infinite.
  -A <ACCEPT_HEADER>
          HTTP Accept Header.
  -d <BODY_STRING>
          HTTP request body.
  -D <BODY_PATH>
          HTTP request body from file.
  -T <CONTENT_TYPE>
          Content-Type.
  -a <BASIC_AUTH>
          Basic authentication, username:password
      --http-version <HTTP_VERSION>
          HTTP version. Available values 0.9, 1.0, 1.1.
      --http2
          Use HTTP/2. Shorthand for --http-version=2
      --host <HOST>
          HTTP Host header
      --disable-compression
          Disable compression.
  -r, --redirect <REDIRECT>
          Limit for number of Redirect. Set 0 for no redirection. Redirection isn't supported for HTTP/2. [default: 10]
      --disable-keepalive
          Disable keep-alive, prevents re-use of TCP connections between different HTTP requests. This isn't supported for HTTP/2.
      --no-pre-lookup
          *Not* perform a DNS lookup at beginning to cache it
      --ipv6
          Lookup only ipv6.
      --ipv4
          Lookup only ipv4.
      --insecure
          Accept invalid certs.
      --connect-to <CONNECT_TO>
          Override DNS resolution and default port numbers with strings like 'example.org:443:localhost:8443'
      --disable-color
          Disable the color scheme.
      --unix-socket <UNIX_SOCKET>
          Connect to a unix socket instead of the domain in the URL. Only for non-HTTPS URLs.
      --stats-success-breakdown
          Include a response status code successful or not successful breakdown for the time histogram and distribution statistics
      --db-url <DB_URL>
          Write succeeded requests to sqlite database url E.G test.db
  -h, --help
          Print help
  -V, --version
          Print version

JSON 输出

oha 在设置 -j 选项时打印 JSON 输出。JSON 输出模式定义在 schema.json 中。

基准测试

性能比较

我们使用 hyperfine 对本地服务器上的 oharakyll/hey 进行基准测试。服务器使用 node 编码。您可以复制粘贴此文件,然后通过 node 运行它。复制粘贴文件后,您可以通过 hyperfine 运行基准测试。

  1. 将内容复制粘贴到名为 app.js 的新 JavaScript 文件中
const http = require("http");

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });

  res.end("Hello World\n");
});

server.listen(3000, () => {
  console.log("Server running at https://127.0.0.1:3000/");
});
  1. 运行 node app.js
  2. 在不同的终端标签中运行 hyperfine 'oha --no-tui http://localhost:3000' 'hey https://127.0.0.1:3000'

基准测试结果

基准测试 1: oha --no-tui https://127.0.0.1:3000

  • 时间(平均值 ± σ):10.8 ms ± 1.8 ms [用户:5.7 ms,系统:11.7 ms]
  • 范围(最小值 … 最大值):8.7 ms … 24.8 ms(107 次)

基准测试 2: hey https://127.0.0.1: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 or -n> -c <number of concurrent connections> -q <query per seconds> --latency-correction --disable-keepalive <target-address>
  • --disable-keepalive

    实际上,用户不会使用 Keep-Alive 查询相同的 URL。您可能希望不使用 Keep-Alive 运行。

  • --latency-correction

    您可以通过使用 --latency-correction 来避免 Coordinated Omission Problem

突发功能

您可以使用 --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 选项以限制每个正则表达式的最大重复次数。例如,使用 --max-repeat 4http://127.0.0.1/[a-z]* 将生成类似于 http://127.0.0.1/[a-z]{0,4} 的 URL

当前动态方案、主机和端口带存活功能运行不佳。

贡献

请随时帮助我们!

以下是一些需要改进的问题。

  • 编写测试
  • 改进tui设计。
    • 显示更多信息?
    • 实时tui目前没有颜色。我希望有人能提供一些色彩感。
  • 提高速度
    • 我对tokio比较陌生。我认为查询调度有一些优化空间。

依赖项

~49–77MB
~1.5M SLoC