当前位置:首页 > 技术分析 > 正文内容

告别“慢吞吞”:用 oha 让你的 HTTP 请求“飞”起来!

ruisui883个月前 (01-23)技术分析14

还在为测试 HTTP 接口的性能而烦恼吗?还在用那些笨重的工具吗?是时候认识一下 oha 了!这个用 Rust 编写的开源小工具,能让你像玩游戏一样轻松搞定 HTTP 压力测试,而且还自带炫酷的实时 TUI 界面,简直是程序员的福音!

一、什么是 oha?

oha,日语“おはよう”(早上好)的意思,正如其名,它是一个小巧、快速的 HTTP 负载生成器。灵感来源于 rakyll/hey,并由 tokio 和 ratatui 驱动。它不仅速度快,而且功能强大,支持跨平台(Linux、Windows、macOS),还可选支持 native-tls 和 vsock。更重要的是,它有一个实时 TUI 界面,让你随时掌握测试进度,就像在玩一个实时战略游戏一样!

1. 主要特性

  • 实时 TUI 显示: 告别黑乎乎的命令行,实时查看测试数据,一目了然。
  • Tokio 和 Ratatui 驱动: 性能与美观兼得,充分发挥 Rust 的强大力量!
  • 跨平台支持: 不论你使用什么操作系统,都能轻松运行。
  • 可选支持 native-tls 和 vsock: 满足你各种高级需求。
  • JSON 输出支持: 方便进行数据分析。
  • 突发模式和动态 URL 生成: 模拟真实场景,测试更加精准。
  • 从文件读取 URL: 批量测试,效率翻倍。
  • 延迟校正: 避免协同省略问题,确保测试结果更可靠。
  • 将成功请求写入 SQLite 数据库: 方便后续分析。

二、如何部署 oha?

oha 的部署方式非常多样,总有一款适合你:

1. Cargo 安装

如果你是 Rust 爱好者,可以直接使用 Cargo 安装:

cargo install oha
# 或者使用 rustls 功能:
cargo install --no-default-features --features rustls oha
# 或者使用 vsock 功能:
cargo install --features vsock oha

2. 其他安装方式

  • Arch Linux: pacman -S oha
  • macOS (Homebrew): brew install oha
  • Windows (winget): winget install hatoo.oha
  • Debian (Azlux's repository): 请参考原文说明。
  • X-CMD (Linux, macOS, Windows WSL/GitBash): x env use oha
  • 容器化: Docker 镜像也已就绪,随时待命!

3. PGO 优化

如果你追求极致性能,可以使用 PGO (Profile-Guided Optimization) 进行构建:

bun run pgo.js

三、如何使用 oha?

oha 的使用非常简单,只需一条命令即可开始测试:

oha [OPTIONS] <URL>

1. 常用选项

  • -n <N_REQUESTS>: 请求数量 (默认: 200)
  • -c <N_CONNECTIONS>: 并发连接数 (默认: 50)
  • -p <N_HTTP2_PARALLEL>: HTTP/2 并行请求数 (默认: 1)
  • -z <DURATION>: 测试持续时间 (例如: -z 10s, -z 3m)
  • -q <QUERY_PER_SECOND>: 每秒请求数 (QPS)
  • --burst-delay <BURST_DURATION>: 突发请求之间的延迟
  • --burst-rate <BURST_REQUESTS>: 突发请求的速率 (默认: 1)
  • --rand-regex-url: 使用正则表达式生成 URL
  • --urls-from-file: 从文件读取 URL
  • --latency-correction: 延迟校正,避免协同省略
  • --no-tui: 禁用实时 TUI
  • -j, --json: 以 JSON 格式输出结果
  • -m, --method <METHOD>: HTTP 方法 (例如: -m POST) (默认: GET)
  • -H <HEADERS>: 自定义 HTTP 头 (例如: -H "foo: bar")
  • -t <TIMEOUT>: 请求超时时间
  • -d <BODY_STRING>: HTTP 请求体
  • -D <BODY_PATH>: 从文件读取 HTTP 请求体
  • -T <CONTENT_TYPE>: Content-Type 头
  • -a <BASIC_AUTH>: 基本认证或 AWS 凭证
  • --aws-session <AWS_SESSION>: AWS 会话令牌
  • --aws-sigv4 <AWS_SIGV4>: AWS SigV4 签名参数
  • -x <PROXY>: HTTP 代理
  • --proxy-http-version <PROXY_HTTP_VERSION>: 连接代理的 HTTP 版本
  • --proxy-http2: 使用 HTTP/2 连接代理
  • --http-version <HTTP_VERSION>: HTTP 版本
  • --http2: 使用 HTTP/2
  • --host <HOST>: HTTP Host 头
  • --disable-compression: 禁用压缩
  • -r, --redirect <REDIRECT>: 重定向次数限制 (默认: 10)
  • --disable-keepalive: 禁用 keep-alive
  • --no-pre-lookup: 不预先进行 DNS 查询
  • --ipv6: 仅查询 IPv6
  • --ipv4: 仅查询 IPv4
  • --insecure: 接受无效证书
  • --connect-to <CONNECT_TO>: 覆盖 DNS 解析和默认端口
  • --disable-color: 禁用彩色输出
  • --unix-socket <UNIX_SOCKET>: 连接到 Unix 套接字
  • --stats-success-breakdown: 统计成功和不成功请求的分布
  • --db-url <DB_URL>: 将成功请求写入 SQLite 数据库
  • --debug: 执行单个请求并输出请求和响应

2. 真实压力测试小贴士

  • 使用 --disable-keepalive 模拟用户不使用 keep-alive 连接的情况。
  • 使用 --latency-correction 避免协同省略问题。
  • 结合 -z 或 -n、-c 和 -q 模拟真实负载。

总而言之,oha 是一个强大、易用且高效的 HTTP 负载生成器,无论你是开发人员、测试人员还是运维人员,它都能成为你得力的助手。快来试试吧,让你的 HTTP 请求“飞”起来!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/484.html

分享给朋友:

“告别“慢吞吞”:用 oha 让你的 HTTP 请求“飞”起来!” 的相关文章

快速掌握 Git:程序员必会的版本控制技巧

在现代软件开发中,版本控制系统(VCS)是开发人员不可或缺的工具。无论是个人项目,还是多人协作的团队开发,良好的版本控制都能确保代码管理的高效性与稳定性。而在版本控制系统中,Git 凭借其分布式、灵活性和高效性,成为了最流行的工具之一。几乎所有的开发团队都在使用 Git 来管理代码版本、协作开发和追...

理解virt、res、shr之间的关系(linux系统篇)

前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。...

el-table内容\n换行解决办法

问题请求到的数据带有换行符 '\n'但页面展示时不换行statusRemark: "\"1、按期完成计划且准确率100%,得100分;\n2、各项目每延误1天,扣1分;每失误1次或者员工投诉1次,扣3分,失误层面达到公司级影响较大的,该项绩效分数为0\"\n&...

微信外H5跳转小程序——组件(vue项目)

场景有个H5(vue项目),需要实现点击商品item跳转到小程序,微信内和微信外都要支持,这里我们只介绍一下H5在微信外的跳转。如图所示,红框内是一个商品,就是点击这里,要跳转小程序:配置微信小程序云开发(云函数)1、开通云开发然后选择免费额度2、云开发权限设置找到权限设置,把这里的「未登录用户访问...

html5迁移到微信小程序的 方法 亲测可用

切图网习惯于在做小程序之前先做成html5+vuejs的形式,因为html5切图是我们比较熟悉的方式,而且有专业的工具 以及浏览器调试也会更加的方便 灵活,效率高,而且html5的方式可以方便预览看效果,方便调整,当html5页面做好确认没问题以后 再转成小程序或者官方出品wepy的方式,这个时候就...

vue.js 双向绑定如何理解,有什么好处!#云南小程序开发

Vue.js 的双向数据绑定是借助于 JavaScript 的一些特性,如对象的属性 getter 和 setter 以及 Vue 的依赖追踪系统实现的。简单来说,双向数据绑定就是数据与视图间的双向通信,也就是说数据的改变会马上反映到视图中,视图的改变也会立刻改变数据。具体来说,当你改变了数据时,视...