oha 是一個小程序,它向 Web 應用程式發送一些負載並顯示即時 tui,靈感來自 rakyll/hey。
該程式是用 Rust 編寫的,由 tokio 提供支持,而 beautiful tui 由ratatui 提供支持。
該程式基於穩定的 Rust 構建,具有透過 Cargo 安裝的make
和cmake
先決條件。
cargo install oha
您可以選擇針對 native-tls 而不是 rustls 建置 oha。
cargo install --no-default-features --features rustls oha
您可以透過啟用vsock
功能來啟用 VSOCK 支援。
cargo install --features vsock oha
pacman -S oha
brew install oha
winget install hatoo.oha
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 環境使用 oha
您也可以建置和建立包含 oha 的容器鏡像
碼頭工人建構。 -t example.com/hatoo/oha:最新
然後就可以直接透過容器使用oha了
docker run -it example.com/hatoo/oha:最新 https://example.com:3000
您可以使用以下命令使用 PGO 建構oha
:
包子運行 pgo.js
二進位檔案將在target/[target-triple]/pgo/oha
處提供。
Linux - 在 Ubuntu 18.04 gnome-terminal 上測試
Windows 10 - 在 Windows Powershell 上測試
MacOS - 在 iTerm2 上測試
-q
選項的運作方式與 rakyll/hey 不同。它設定每秒整體查詢而不是針對每個工作人員。
Ohayou(おはよう),HTTP 負載產生器,靈感來自 rakyll/hey 和 tui 動畫。 用法:oha [OPTIONS]參數: 目標 URL。 選項: -n 要執行的請求數。 [預設值:200] -c 同時運作的連接數。對於較大的“-c”,您可能應該增加對開啟檔案數量的限制。 [預設值:50] -p 在 HTTP/2 上傳送的平行請求數。 `oha` 將總共運行 c * p 個並發工作線程。 [預設值:1] -z 應用程式傳送請求的持續時間。如果指定了持續時間,則忽略 n。 在 HTTP/1 上,當達到持續時間時,正在進行的請求將被中止併計為「由於截止日期而中止」。 目前,在 HTTP/2 上,當達到持續時間時,將等待正在進行的請求。 `-w` 選項被忽略。 例:-z 10s -z 3m。 -w, --在截止日期後等待正在進行的請求 當達到持續時間時,將等待正在進行的請求 -q 所有速率限制,以每秒查詢數 (QPS) 為單位 --burst-delay 在預定義數量的請求之間引入延遲。 注意:如果指定了qps,burst將被忽略 --burst-rate 突發請求的速率。預設值為 1 注意:如果指定了qps,burst將被忽略 --rand-正規表示式-url 透過 rand_regex crate 產生 URL,但每個查詢都停用點,例如 http://127.0.0.1/[az][az][0-9]。目前動態方案、具有保持活動狀態的主機和連接埠效果不佳。有關語法的詳細信息,請參閱 https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html。 --max-repeat “--rand-regex-url”的參數。 max_repeat 參數給出 x*、x+ 和 x{n,} 運算子將達到的最大額外重複計數。 [預設值:4] --dump-urls 轉儲目標 URL 次以進行偵錯 --rand-regex-url --延遲校正 糾正延遲以避免協調遺漏問題。如果未設定 -q 則忽略它。 --no-tui 無即時 tui -j, --json 將結果列印為 JSON --fps tui 的每秒幀數。 [預設值:16] -m, --method HTTP 方法 [預設值:GET] -H 自訂 HTTP 標頭。範例: -H "foo: bar" -t 每個請求的逾時。預設為無限。 -A HTTP 接受標頭。 -d HTTP 請求正文。 -D 檔案中的 HTTP 請求正文。 -T 內容類型。 -a 基本驗證,使用者名稱:密碼 --http-version HTTP 版本。可用值 0.9、1.0、1.1。 --http2 使用 HTTP/2。 --http-version=2 的簡寫 --host HTTP 主機標頭 --disable-compression 停用壓縮。 -r, --redirect 重定向次數限制。設定 0 表示不重定向。 HTTP/2 不支援重定向。 [預設值:10] --禁用保持活動 停用 keep-alive,防止在不同的 HTTP 請求之間重複使用 TCP 連線。 HTTP/2 不支援此功能。 --no-pre-lookup *不*在開始快取時執行 DNS 查找 --ipv6 僅查找 ipv6。 --ipv4 僅查找 ipv4。 --insecure 接受無效證書。 --connect-to 使用「example.org:443:localhost:8443」等字串覆寫 DNS 解析和預設連接埠號 --disable-color 停用配色方案。 --unix-socket 連線到 unix 套接字而不是 URL 中的網域。僅適用於非 HTTPS URL。 --stats-success-breakdown 包含回應狀態代碼成功或不成功細分的時間直方圖與分佈統計資訊--db-url 將成功的請求寫入sqlite 資料庫url EG test.db --debug 執行單一請求並轉儲請求和回應 -h, --help 列印幫助 -V, --version 列印版本
設定-j
選項時, oha
會列印 JSON 輸出。 JSON 輸出的架構在 schema.json 中定義。
我們使用hyperfine
在本地伺服器上對oha
與rakyll/hey
進行基準測試。伺服器是使用節點編碼的。您可以透過複製貼上此檔案然後透過節點運行它來啟動伺服器。複製貼上檔案後,您可以透過hyperfine
執行基準測試。
將內容複製並貼上到名為 app.js 的新 javascript 檔案中
const http = require("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end("Hello Worldn");});server.listen(3000, () => { console.log("伺服器運行在 http://localhost:3000/");});
運行node app.js
在不同的終端選項卡中執行hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
基準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:嘿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 繼承的預設選項,但您可能需要更改選項以在更現實的條件下進行壓力測試。
我建議使用以下選項來運行oha
。
oha <-z 或 -n> -c <並發連線數> -q <每秒查詢次數> --latency- Correction --disable-keepalive <目標位址>
--禁用保持活動
實際上,使用者不會使用 Keep-Alive 查詢相同的 URL。您可能想在沒有Keep-Alive
情況下運行。
--延遲校正
您可以使用--latency-correction
避免Coordinated Omission Problem
。
您可以使用--burst-delay
和--burst-rate
選項來在定義數量的請求之間引入延遲。
oha -n 10 --突發延遲 2s --突發速率 4
在這個特定場景中,每 2 秒將處理 4 個請求,6 秒後總共將處理 10 個請求。注意:如果不設定--burst-rate
選項,則數量預設為 1
您可以使用--rand-regex-url
選項為每個連線產生隨機 url。
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
每個 URL 都是由 rand_regex crate 產生的,但 regex 的點被停用,因為它對於此目的沒有用處,並且如果 url 的點被解釋為 regex 的點,則非常不方便。
您可以選擇設定--max-repeat
選項來限制每個正規表示式的最大重複次數。例如 http://127.0.0.1/[az]* 與--max-repeat 4
將產生類似 http://127.0.0.1/[az]{0,4} 的網址
目前動態方案、具有保持活動狀態的主機和連接埠效果不佳。
請隨時幫助我們!
這裡有一些需要改進的問題。
編寫測試
改進 tui 設計。
顯示更多資訊?
現在實時 tui 中沒有顏色。我需要有一定色彩感的人的幫助。
提高速度
我是東京的新手。我認為查詢調度還有一些優化的空間。