oha est un petit programme qui envoie une charge à une application Web et affiche un tui en temps réel inspiré de rakyll/hey.
Ce programme est écrit en Rust et propulsé par tokio et beautiful tui par ratatui.
Ce programme est construit sur Rust stable, avec les prérequis make
et cmake
pour l'installation via cargo.
cargo install oha
Vous pouvez éventuellement créer oha avec des natifs-tls au lieu de rustls.
cargo install --no-default-features --features rustls oha
Vous pouvez activer la prise en charge de VSOCK en activant la fonctionnalité 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
Vous pouvez installer avec x-cmd.
x env utiliser oha
Vous pouvez également créer et créer une image de conteneur incluant oha
construction de docker. -t exemple.com/hatoo/oha:latest
Ensuite, vous pouvez utiliser oha directement via le conteneur
docker run -it example.com/hatoo/oha:latest https://example.com:3000
Vous pouvez créer oha
avec PGO en utilisant les commandes suivantes :
chignon exécuter pgo.js
Et le binaire sera disponible sur target/[target-triple]/pgo/oha
.
Linux - Testé sur Ubuntu 18.04 gnome-terminal
Windows 10 - Testé sur Windows Powershell
MacOS - Testé sur iTerm2
L'option -q
fonctionne différemment de rakyll/hey. Il définit une requête globale par seconde plutôt que pour chaque travailleur.
Ohayou(おはよう), générateur de charge HTTP, inspiré de rakyll/hey avec animation tui. Utilisation : oha [OPTIONS]Arguments : URL cible. Possibilités : -n Nombre de requêtes à exécuter. [par défaut : 200] -c Nombre de connexions à exécuter simultanément. Vous devrez peut-être augmenter la limite du nombre de fichiers ouverts pour les « -c » plus grands. [par défaut : 50] -p Nombre de requêtes parallèles à envoyer sur HTTP/2. `oha` exécutera c * p travailleurs simultanés au total. [par défaut : 1] -z Durée de l'application pour envoyer des requêtes. Si la durée est spécifiée, n est ignoré. Sur HTTP/1, lorsque la durée est atteinte, les requêtes en cours sont abandonnées et comptées comme « abandonnées en raison de la date limite ». Vous pouvez modifier ce comportement avec l'option « -w ». Actuellement, sur HTTP/2, lorsque la durée est atteinte, les requêtes en cours sont attendues. L'option `-w` est ignorée. Exemples : -z 10s -z 3m. -w, --wait-ongoing-requests-après-date limite Lorsque la durée est atteinte, les demandes en cours sont attendues -q Limite de débit pour tous, en requêtes par seconde (QPS) --burst-delay Introduit un délai entre un nombre prédéfini de requêtes. Remarque : Si qps est spécifié, la rafale sera ignorée --burst-rate Taux de demandes de rafale. La valeur par défaut est 1 Remarque : Si qps est spécifié, la rafale sera ignorée --rand-regex-url Générez une URL par rand_regex crate mais le point est désactivé pour chaque requête, par exemple http://127.0.0.1/[az][az][0-9]. Actuellement, le schéma dynamique, l'hôte et le port avec maintien en vie ne fonctionnent pas bien. Voir https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html pour plus de détails sur la syntaxe. --max-repeat Un paramètre pour '--rand-regex-url'. Le paramètre max_repeat donne le nombre maximum de répétitions supplémentaires que deviendront les opérateurs x*, x+ et x{n,}. [par défaut : 4] --dump-urls Vider les URL cibles fois pour déboguer --rand-regex-url --latence-correction Corrigez la latence pour éviter les problèmes d’omission coordonnée. Il est ignoré si -q n'est pas défini. --no-tui Pas de tui en temps réel -j, --json Imprimer les résultats au format JSON --fps Images par seconde pour tui. [par défaut : 16] -m, --method Méthode HTTP [par défaut : GET] -H En-tête HTTP personnalisé. Exemples : -H "foo: bar" -t Délai d'expiration pour chaque requête. Par défaut, infini. -Un en-tête d'acceptation HTTP . -d corps de la requête HTTP. -D Corps de la requête HTTP à partir du fichier. -T Type de contenu. -a Authentification de base, nom d'utilisateur : mot de passe --http-version Version HTTP. Valeurs disponibles 0,9, 1,0, 1,1. --http2 Utilisez HTTP/2. Raccourci pour --http-version=2 --host En-tête de l'hôte HTTP --disable-compression Désactive la compression. -r, --redirect Limite du nombre de redirection. Définissez 0 pour aucune redirection. La redirection n'est pas prise en charge pour HTTP/2. [par défaut : 10] --disable-keepalive Désactivez le maintien en vie, empêche la réutilisation des connexions TCP entre différentes requêtes HTTP. Ceci n'est pas pris en charge pour HTTP/2. --no-pre-lookup *Pas* effectuer une recherche DNS au début pour le mettre en cache --ipv6 Recherche uniquement ipv6. --ipv4 Recherche uniquement ipv4. --insecure Accepte les certificats invalides. --connect-to Remplace la résolution DNS et les numéros de port par défaut avec des chaînes comme 'example.org:443:localhost:8443' --disable-color Désactive le jeu de couleurs. --unix-socket Connectez-vous à un socket Unix au lieu du domaine dans l'URL. Uniquement pour les URL non HTTPS. --stats-success-breakdown Inclut un code d'état de réponse réussi ou non pour l'histogramme temporel et les statistiques de distribution --db-url Écrire les requêtes réussies dans l'url de la base de données sqlite EG test.db --debug Effectuer une seule requête et videz la demande et la réponse -h, --help Imprimer l'aide -V, --version Imprimer la version
oha
imprime la sortie JSON lorsque l'option -j
est définie. Le schéma de sortie JSON est défini dans schema.json.
Nous avons utilisé hyperfine
pour comparer oha
à rakyll/hey
sur un serveur local. Le serveur a été codé à l'aide de node. Vous pouvez démarrer le serveur en copiant-collant ce fichier puis en l'exécutant via node. Après avoir copié-collé le fichier, vous pouvez exécuter le benchmark via hyperfine
.
Copiez-collez le contenu dans un nouveau fichier javascript appelé app.js
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("Serveur exécuté sur http://localhost:3000/");});
Exécutez node app.js
Exécutez hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
dans un autre onglet de terminal
Référence 1 : oha --no-tui http://localhost:3000
Temps (moyenne ± σ) : 10,8 ms ± 1,8 ms [Utilisateur : 5,7 ms, Système : 11,7 ms]
Plage (min… max) : 8,7 ms… 24,8 ms (107 exécutions)
Benchmark 2 : hé http://localhost:3000
Temps (moyenne ± σ) : 14,3 ms ± 4,6 ms [Utilisateur : 12,2 ms, Système : 19,4 ms]
Plage (min… max) : 11,1 ms… 48,3 ms (88 exécutions)
Dans ce benchmark, oha --no-tui http://localhost:3000
s'est avéré plus rapide, fonctionnant environ 1,32 ± 0,48 fois plus vite que hey http://localhost:3000
.
oha
utilise les options par défaut héritées de rakyll/hey mais vous devrez peut-être modifier les options pour effectuer un test de résistance dans des conditions plus réalistes.
Je suggère d'exécuter oha
avec les options suivantes.
oha <-z ou -n> -c-q --latency-correction --disable-keepalive
--disable-keepalive
En réalité, l'utilisateur n'interroge pas la même URL en utilisant Keep-Alive. Vous souhaiterez peut-être exécuter sans Keep-Alive
.
--latence-correction
Vous pouvez éviter Coordinated Omission Problem
en utilisant --latency-correction
.
Vous pouvez utiliser --burst-delay
avec l'option --burst-rate
pour introduire un délai entre un nombre défini de requêtes.
oha -n 10 --burst-delay 2s --burst-rate 4
Dans ce scénario particulier, toutes les 2 secondes, 4 requêtes seront traitées, et après 6 secondes, un total de 10 requêtes seront traitées. REMARQUE : Si vous ne définissez pas l'option --burst-rate
, le montant est par défaut de 1.
Vous pouvez utiliser l'option --rand-regex-url
pour générer une URL aléatoire pour chaque connexion.
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
Chaque URL est générée par la caisse rand_regex mais le point de l'expression régulière est désactivé car il n'est pas utile à cet effet et c'est très gênant si les points de l'URL sont interprétés comme le point de l'expression régulière.
En option, vous pouvez définir l'option --max-repeat
pour limiter le nombre maximum de répétitions pour chaque regex. par exemple, http://127.0.0.1/[az]* avec --max-repeat 4
générera une URL comme http://127.0.0.1/[az]{0,4}
Actuellement, le schéma dynamique, l'hôte et le port avec maintien en vie ne fonctionnent pas bien.
N'hésitez pas à nous aider !
Voici quelques points à améliorer.
Écrire des tests
Améliorez la conception du tui.
Afficher plus d'informations ?
Il n’y a plus de couleur en temps réel maintenant. Je veux l'aide de quelqu'un qui a un certain sens des couleurs.
Améliorer la vitesse
Je suis nouveau sur Tokyo. Je pense qu'il y a de la place pour optimiser la planification des requêtes.