oha ist ein kleines Programm, das etwas Last an eine Webanwendung sendet und Echtzeit-TUI anzeigt, inspiriert von Rakyll/Hey.
Dieses Programm ist in Rust geschrieben und wird von tokio und beautiful tui von ratatui unterstützt.
Dieses Programm basiert auf stabilem Rust und verfügt über make
und cmake
Voraussetzungen für die Installation per Ladung.
cargo install oha
Sie können OHA optional gegen Native-TLS anstelle von RustLs erstellen.
cargo install --no-default-features --features rustls oha
Sie können die VSOCK-Unterstützung aktivieren, indem Sie die vsock
-Funktion aktivieren.
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
Sie können mit x-cmd installieren.
x env benutze oha
Sie können auch ein Container-Image erstellen und erstellen, einschließlich oha
Docker-Build. -t example.com/hatoo/oha:latest
Dann können Sie oha direkt über den Behälter verwenden
docker run -it example.com/hatoo/oha:latest https://example.com:3000
Sie können oha
mit PGO erstellen, indem Sie die folgenden Befehle verwenden:
bun pgo.js ausführen
Und die Binärdatei wird unter target/[target-triple]/pgo/oha
verfügbar sein.
Linux – Getestet auf Ubuntu 18.04 Gnome-Terminal
Windows 10 – Getestet auf Windows Powershell
MacOS – Getestet auf iTerm2
Die Option -q
funktioniert anders als rakyll/hey. Es wird eine Gesamtabfrage pro Sekunde und nicht für jeden einzelnen Arbeiter festgelegt.
Ohayou, HTTP-Lastgenerator, inspiriert von Rakyll/Hey mit Tui-Animation. Verwendung: oha [OPTIONEN]Argumente: Ziel-URL. Optionen: -n Anzahl der auszuführenden Anforderungen. [Standard: 200] -c Anzahl der gleichzeitig auszuführenden Verbindungen. Möglicherweise sollten Sie die Begrenzung der Anzahl geöffneter Dateien für größere „-c“ erhöhen. [Standard: 50] -p Anzahl der parallelen Anfragen, die über HTTP/2 gesendet werden sollen. „oha“ führt insgesamt c*p gleichzeitige Worker aus. [Standard: 1] -z Dauer der Anwendung zum Senden von Anfragen. Wenn die Dauer angegeben ist, wird n ignoriert. Bei HTTP/1 werden laufende Anfragen abgebrochen und als „wegen Frist abgebrochen“ gezählt, wenn die Dauer erreicht ist. Sie können dieses Verhalten mit der Option „-w“ ändern. Derzeit wird bei HTTP/2 auf laufende Anfragen gewartet, wenn die Dauer erreicht ist. Die Option „-w“ wird ignoriert. Beispiele: -z 10s -z 3m. -w, --wait-ongoing-requests-after-deadline Wenn die Dauer erreicht ist, wird auf laufende Anfragen gewartet -q Ratenbegrenzung für alle, in Abfragen pro Sekunde (QPS) --burst-delay Verzögerung zwischen einer vordefinierten Anzahl von Anfragen einführen. Hinweis: Wenn qps angegeben ist, wird Burst ignoriert --burst-rate Anfragenraten für Burst. Der Standardwert ist 1 Hinweis: Wenn qps angegeben ist, wird Burst ignoriert --rand-regex-url URL durch rand_regex-Kiste generieren, aber Punkt ist für jede Abfrage deaktiviert, z. B. http://127.0.0.1/[az][az][0-9]. Derzeit funktionieren dynamisches Schema, Host und Port mit Keep-Alive nicht gut. Einzelheiten zur Syntax finden Sie unter https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html. --max-repeat Ein Parameter für die „--rand-regex-url“. Der Parameter max_repeat gibt die maximale Anzahl zusätzlicher Wiederholungen an, zu der die Operatoren x*, x+ und x{n,} werden. [Standard: 4] --dump-urls Ziel-URLs mal ausgeben, um --rand-regex-url zu debuggen --Latenzkorrektur Korrigieren Sie die Latenz, um das Problem koordinierter Auslassungen zu vermeiden. Es wird ignoriert, wenn -q nicht gesetzt ist. --no-tui Kein Echtzeit-Tui -j, --json Ergebnisse als JSON ausgeben --fps Frame pro Sekunde für Tui. [Standard: 16] -m, --method HTTP-Methode [Standard: GET] -H Benutzerdefinierter HTTP-Header. Beispiele: -H "foo: bar" -t Zeitüberschreitung für jede Anfrage. Standardmäßig ist unendlich. -A HTTP-Akzeptanzheader. -d HTTP-Anfragetext. -D HTTP-Anfragetext aus der Datei. -T Inhaltstyp. -a Basisauthentifizierung, Benutzername:Passwort --http-version HTTP-Version. Verfügbare Werte 0,9, 1,0, 1,1. --http2 Verwenden Sie HTTP/2. Abkürzung für --http-version=2 --host HTTP-Host-Header --disable-compression Deaktiviert die Komprimierung. -r, --redirect Begrenzung für die Anzahl der Weiterleitungen. Legen Sie 0 für keine Umleitung fest. Die Umleitung wird für HTTP/2 nicht unterstützt. [Standard: 10] --disable-keepalive Keep-Alive deaktivieren, verhindert die Wiederverwendung von TCP-Verbindungen zwischen verschiedenen HTTP-Anfragen. Dies wird für HTTP/2 nicht unterstützt. --no-pre-lookup *Keine* Führt zu Beginn eine DNS-Suche durch, um sie zwischenzuspeichern --ipv6 Suche nur ipv6. --ipv4 Suche nur nach IPv4. --insecure Ungültige Zertifikate akzeptieren. --connect-to Überschreiben Sie die DNS-Auflösung und die Standardportnummern mit Zeichenfolgen wie „example.org:443:localhost:8443“. --disable-color Deaktiviert das Farbschema. --unix-socket Stellt eine Verbindung zu einem Unix-Socket anstelle der Domäne in der URL her. Nur für Nicht-HTTPS-URLs. --stats-success-breakdown Fügt eine Aufschlüsselung des Antwortstatuscodes „Erfolgreich“ oder „Nicht erfolgreich“ für das Zeithistogramm und die Verteilungsstatistik ein. --db-url Erfolgreiche Anfragen in die SQLite-Datenbank-URL schreiben, z. B. test.db --debug Eine einzelne Anfrage ausführen und geben Sie die Anfrage und Antwort aus. -h, --help Hilfe drucken -V, --version Druckversion
oha
druckt die JSON-Ausgabe, wenn die Option -j
gesetzt ist. Das Schema der JSON-Ausgabe ist in schema.json definiert.
Wir haben hyperfine
zum Benchmarking oha
mit rakyll/hey
auf einem lokalen Server verwendet. Der Server wurde mit node codiert. Sie können den Server starten, indem Sie diese Datei kopieren, einfügen und dann über den Knoten ausführen. Nachdem Sie die Datei kopiert und eingefügt haben, können Sie den Benchmark über hyperfine
ausführen.
Kopieren Sie den Inhalt und fügen Sie ihn in eine neue Javascript-Datei namens app.js ein
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("Server läuft unter http://localhost:3000/");});
Führen Sie node app.js
aus
Führen Sie hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
in einem anderen Terminal-Tab aus
Benchmark 1: oha --no-tui http://localhost:3000
Zeit (Mittelwert ± σ): 10,8 ms ± 1,8 ms [Benutzer: 5,7 ms, System: 11,7 ms]
Reichweite (min … max): 8,7 ms … 24,8 ms (107 Läufe)
Benchmark 2: Hallo http://localhost:3000
Zeit (Mittelwert ± σ): 14,3 ms ± 4,6 ms [Benutzer: 12,2 ms, System: 19,4 ms]
Reichweite (min … max): 11,1 ms … 48,3 ms (88 Läufe)
In diesem Benchmark erwies sich oha --no-tui http://localhost:3000
als schneller und lief etwa 1,32 ± 0,48 Mal schneller als hey http://localhost:3000
.
oha
verwendet von Rakyll/Hey übernommene Standardoptionen, aber Sie müssen möglicherweise Optionen ändern, um den Stresstest unter realistischeren Bedingungen durchzuführen.
Ich schlage vor, oha
mit den folgenden Optionen auszuführen.
oha <-z oder -n> -c-q --latency-correction --disable-keepalive
--disable-keepalive
In Wirklichkeit fragt der Benutzer nicht dieselbe URL mit Keep-Alive ab. Möglicherweise möchten Sie ohne Keep-Alive
laufen.
--Latenzkorrektur
Sie können Coordinated Omission Problem
vermeiden, indem Sie --latency-correction
verwenden.
Sie können --burst-delay
zusammen mit der Option --burst-rate
verwenden, um eine Verzögerung zwischen einer definierten Anzahl von Anfragen einzuführen.
oha -n 10 --burst-delay 2s --burst-rate 4
In diesem speziellen Szenario werden alle 2 Sekunden 4 Anfragen verarbeitet und nach 6 Sekunden werden insgesamt 10 Anfragen verarbeitet. HINWEIS: Wenn Sie die Option --burst-rate
nicht festlegen, ist der Wert standardmäßig 1
Sie können die Option --rand-regex-url
verwenden, um für jede Verbindung eine zufällige URL zu generieren.
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
Jede URL wird von der rand_regex-Kiste generiert, aber der Punkt des Regex ist deaktiviert, da er für diesen Zweck nicht nützlich ist und es sehr unpraktisch ist, wenn die Punkte der URL als Punkt des Regex interpretiert werden.
Optional können Sie die Option --max-repeat
festlegen, um die maximale Wiederholungsanzahl für jede Regex zu begrenzen. Beispiel: http://127.0.0.1/[az]* mit --max-repeat 4
generiert eine URL wie http://127.0.0.1/[az]{0,4}
Derzeit funktionieren dynamisches Schema, Host und Port mit Keep-Alive nicht gut.
Helfen Sie uns gerne!
Hier sind einige Punkte, die verbessert werden müssen.
Schreiben Sie Tests
Tui-Design verbessern.
Weitere Informationen anzeigen?
Es gibt derzeit keine Echtzeit-Tui-Farben. Ich brauche Hilfe von jemandem, der ein gewisses Gespür für Farben hat.
Geschwindigkeit verbessern
Ich bin neu in Tokio. Ich denke, es gibt Raum für die Optimierung der Abfrageplanung.