【可视化开源性能压测工具】小巧而强大的oha

embedded/2024/12/25 10:25:17/

oha是一款小巧而强大的测试工具,使用Rust语言编写,依托tokio和ratatui库,实现了高效且美观的测试界面。它可用于向Web应用发送负载,并实时显示带有TUI(Text User Interface)动画的测试结果。这款工具受到了rakyll/hey的启发,并在其基础上进行了改进和创新。

1、实时TUI显示:

  • oha在测试过程中会实时显示测试结果,包括请求数、并发数、响应时间等关键指标。

  • TUI界面美观且直观,使得测试结果的查看和分析变得更加方便。

2、灵活的配置选项:

  • oha提供了丰富的配置选项,允许用户根据测试需求进行定制。

  • 用户可以指定请求数、并发数、HTTP版本、请求方法、自定义HTTP头等参数。

3、支持HTTP/1和HTTP/2:

  • oha支持HTTP/1和HTTP/2协议,能够满足不同Web应用的测试需求。

  • 在HTTP/2下,oha能够更高效地处理并发请求,提升测试性能。

4、动态URL生成:

  • oha支持使用正则表达式动态生成URL,使得测试场景更加多样化,例如:oha --rand-regex-url http://127.0.0.1/[a-z][a-z][0-9]

  • 用户可以通过配置选项来限制生成URL的最大重复次数,以避免无效的测试请求。

5、性能优化与结果分析:

  • oha通过优化查询调度和减少资源占用,提高了测试性能。

  • 测试结束后,oha会生成详细的测试结果报告,包括响应时间分布、成功率等信息,便于用户进行结果分析。

 

6、跨平台支持:

  • oha支持Linux、Windows和macOS等多个操作系统,方便用户在不同平台上进行测试。

三、安装与使用

oha的安装过程非常简单,用户可以通过cargo、Homebrew、winget等多种方式进行安装。安装完成后,用户可以通过命令行使用oha进行测试。

# Linux/macOS,使用Cargo安装(需要先安装Rust工具链)
cargo install oha# 使用Homebrew安装(适用于macOS)
brew install oha# Windows,使用winget安装
winget install hatoo.oha

安装完成后,你可以运行基本测试,比如发送100个请求到目标URL:

oha -n 100 https://127.0.0.1:5000

如果你想设置并发连接数为50,可以这样做:

oha -c 50 https://127.0.0.1:5000

或者,如果你想运行持续时间为30秒的测试:

oha -z 30s https://127.0.0.1:5000

当然,这样参数也可以组合使用,例如,要发送100个请求,并发数为50,持续时间30s,可以使用以下命令:

oha -n 200 -c 50 -z 30s https://127.0.0.1:5000

执行完成后,oha能够实时显示请求的发送数量、响应时间、错误率等关键指标,让你对系统的性能表现一目了然。

用户还可以根据需要配置其他选项,如指定HTTP方法、自定义HTTP头、设置请求超时等。

更多参数用法,可参考:

Usage: oha [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-deadlineWhen 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 1Note: If qps is specified, burst will be ignored--rand-regex-urlGenerate 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 do not work 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-correctionCorrect latency to avoid coordinated omission problem. It's ignored if -q is not set.--no-tuiNo realtime tui-j, --jsonPrint 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-x <PROXY>HTTP proxy--proxy-http-version <PROXY_HTTP_VERSION>HTTP version to connect to proxy. Available values 0.9, 1.0, 1.1, 2.--proxy-http2Use HTTP/2 to connect to proxy. Shorthand for --proxy-http-version=2--http-version <HTTP_VERSION>HTTP version. Available values 0.9, 1.0, 1.1, 2.--http2Use HTTP/2. Shorthand for --http-version=2--host <HOST>HTTP Host header--disable-compressionDisable compression.-r, --redirect <REDIRECT>Limit for number of Redirect. Set 0 for no redirection. Redirection isn't supported for HTTP/2. [default: 10]--disable-keepaliveDisable 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--ipv6Lookup only ipv6.--ipv4Lookup only ipv4.--insecureAccept invalid certs.--connect-to <CONNECT_TO>Override DNS resolution and default port numbers with strings like 'example.org:443:localhost:8443'--disable-colorDisable 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-breakdownInclude 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--debugPerform a single request and dump the request and response-h, --helpPrint help-V, --versionPrint version

 oha 作为一款 Rust 开源 HTTP 性能测试工具,以其强大的功能、易用的特性、高效可靠的性能,为http性能压测又提供了一个好的选择,让我们能够针对不同的项目特性选择合适的工具。

如果你在为Jmeter、 LR等工具的一些缺点而烦恼,不妨试一下这个小工具,说不定能给你带来意外的收获。

项目开源地址:https://github.com/hatoo/oha

 

 


http://www.ppmy.cn/embedded/148588.html

相关文章

【C++学习篇】AVL树

目录 1.AVL树的概念 2.AVL树的实现 2.1AVL树的结构 2.2AVL树的插入 2.2.1 AVL树插⼊⼀个值的⼤概过程 2.2.2平衡因子的更新 2.2.3 插⼊结点及更新平衡因⼦的代码实现 ​编辑 2.3旋转 2.3.1旋转的原则 2.3.2 右单旋 2.3.3左右双旋 2.3.4 右左双旋 1.AVL树的概念 1…

Java课程设计:基于Javaweb的超市管理系统

一、项目介绍 超市账单管理系统主要用于对超市的交易账单进行管理&#xff0c;如账单录入、账单修改、账单 删除&#xff0c;以及和超市商品相关的供应商、用户的管理等。所谓账单&#xff0c;就是超市与供应商进 行交易的凭据。超市采购部的职员、超市的部门经理是该系统的目…

flutter轮播图控件根据图片高度动态调整图高度

1.图片链接资源需要带有宽高信息 例如&#xff1a;https://zmkx.oss-cn-hangzhou.aliyuncs.com/oss/folder/atui2024-12-231734938007236a30cb975297842d0b3d2b82e4ec7f72b7unhmlcaj4el.jpg?Size1080x2388 在链接中拼接?Size1080x2388携带。 2.获取到数据后切割出宽高 List…

AI 在医疗行业的应用

AI 在医疗行业的应用正在迅速发展&#xff0c;它不仅提升了医疗服务的效率和准确性&#xff0c;还推动了医学研究和患者管理的创新。以下是 AI 在医疗行业的几个主要应用领域&#xff1a; 1. 疾病诊断与早期检测 医学影像分析&#xff1a;AI&#xff0c;尤其是深度学习&#…

I.MX6U 启动方式详解

一、启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就…

vue3 前端实现pdf打印预览 printjs

在utils建print.ts文件 interface PrintFunction { extendOptions: Function; getStyle: Function; setDomHeight: Function; toPrint: Function; } const Print function (dom, options?: object): PrintFunction { options options || {}; // ts-expect-error if (!(this …

纯css 实现呼吸灯效果

开始效果 呼吸效果 实现代码 <div class"container"><div class"breathing-light"></div> </div><style>html,body {height: 100%;background-color: white;}.container {padding: 100px;}.container .breathing-light {wi…

微服务openfeign配置重试机制

场景&#xff1a; 1、在实际开发中&#xff0c;通过feign调用其他服务&#xff0c;如果出现read-timeout超时、或调用出现异常 2、如上问题&#xff0c;有时候可能是网络速度、网路抖动等原因导致超时异常&#xff0c;并非程序本身错误&#xff0c;所以可以配置openfeign重试…