oha es un pequeño programa que envía algo de carga a una aplicación web y muestra tui en tiempo real inspirado en rakyll/hey.
Este programa está escrito en Rust y desarrollado por tokio y beautiful tui de ratatui.
Este programa se basa en Rust estable, con requisitos previos make
y cmake
para instalar mediante carga.
cargo install oha
Opcionalmente, puedes compilar oha contra Native-tls en lugar de Rustls.
cargo install --no-default-features --features rustls oha
Puede habilitar la compatibilidad con VSOCK habilitando la función 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
Puedes instalar con x-cmd.
x env uso oha
También puedes construir y crear una imagen de contenedor que incluya oha.
construcción de ventana acoplable. -t ejemplo.com/hatoo/oha:latest
Entonces puedes usar oha directamente a través del contenedor.
ventana acoplable ejecutar -it ejemplo.com/hatoo/oha:latest https://example.com:3000
Puedes construir oha
con PGO usando los siguientes comandos:
ejecutar bollo pgo.js
Y el binario estará disponible en target/[target-triple]/pgo/oha
.
Linux: probado en Ubuntu 18.04 gnome-terminal
Windows 10: probado en Windows Powershell
MacOS: probado en iTerm2
La opción -q
funciona de manera diferente a rakyll/hey. Se establece una consulta general por segundo en lugar de para cada trabajador.
Ohayou(おはよう), generador de carga HTTP, inspirado en rakyll/hey con animación tui. Uso: oha [OPCIONES]Argumentos: URL de destino. Opciones: -n Número de solicitudes a ejecutar. [predeterminado: 200] -c Número de conexiones que se ejecutarán simultáneamente. Es posible que deba aumentar el límite de la cantidad de archivos abiertos para `-c` más grande. [predeterminado: 50] -p Número de solicitudes paralelas para enviar en HTTP/2. `oha` ejecutará c * p trabajadores simultáneos en total. [predeterminado: 1] -z Duración de la aplicación para enviar solicitudes. Si se especifica la duración, se ignora n. En HTTP/1, cuando se alcanza la duración, las solicitudes en curso se cancelan y se cuentan como "anuladas debido a la fecha límite". Puede cambiar este comportamiento con la opción `-w`. Actualmente, en HTTP/2, cuando se alcanza la duración, se esperan las solicitudes en curso. La opción `-w` se ignora. Ejemplos: -z 10s -z 3m. -w, --esperar-solicitudes-en-curso-después-de-la-fecha límite Cuando se alcanza la duración, se esperan las solicitudes en curso. -q Límite de velocidad para todos, en consultas por segundo (QPS) --burst-delay Introduce un retraso entre un número predefinido de solicitudes. Nota: Si se especifica qps, se ignorará la ráfaga --burst-rate Tasas de solicitudes de ráfaga. El valor predeterminado es 1 Nota: Si se especifica qps, se ignorará la ráfaga --rand-regex-url Genere la URL mediante caja rand_regex pero el punto está deshabilitado para cada consulta, por ejemplo, http://127.0.0.1/[az][az][0-9]. Actualmente, el esquema dinámico, el host y el puerto con keep-alive no funcionan bien. Consulte https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html para obtener detalles sobre la sintaxis. --max-repeat Un parámetro para '--rand-regex-url'. El parámetro max_repeat proporciona el número máximo de repeticiones adicionales en las que se convertirán los operadores x*, x+ y x{n,}. [predeterminado: 4] --dump-urls Vuelca las URL de destino veces para depurar --rand-regex-url --corrección-latencia Latencia correcta para evitar problemas de omisión coordinada. Se ignora si -q no está configurado. --no-tui Sin tui en tiempo real -j, --json Imprime los resultados como JSON --fps Cuadro por segundo para tui. [predeterminado: 16] -m, --method Método HTTP [predeterminado: GET] -H Encabezado HTTP personalizado. Ejemplos: -H "foo: bar" -t Tiempo de espera para cada solicitud. Por defecto es infinito. -Un encabezado de aceptación HTTP . -d Cuerpo de la solicitud HTTP. -D Cuerpo de solicitud HTTP del archivo. -T Tipo de contenido. -a Autenticación básica, nombre de usuario:contraseña --http-version Versión HTTP. Valores disponibles 0,9, 1,0, 1,1. --http2 Utilice HTTP/2. Abreviatura de --http-version=2 --host Encabezado de host HTTP --disable-compression Deshabilita la compresión. -r, --redirect Límite para el número de redirecciones. Establezca 0 para que no haya redirección. La redirección no es compatible con HTTP/2. [predeterminado: 10] --disable-keepalive Deshabilite keep-alive, evita la reutilización de conexiones TCP entre diferentes solicitudes HTTP. Esto no es compatible con HTTP/2. --no-pre-lookup *No* realizar una búsqueda de DNS al principio para almacenarlo en caché --ipv6 Búsqueda solo ipv6. --ipv4 Búsqueda solo ipv4. --insecure Aceptar certificados no válidos. --connect-to Anula la resolución DNS y los números de puerto predeterminados con cadenas como 'example.org:443:localhost:8443' --disable-color Deshabilita la combinación de colores. --unix-socket Conéctese a un socket Unix en lugar del dominio en la URL. Solo para URL que no sean HTTPS. --stats-success-breakdown Incluye un código de estado de respuesta exitoso o no exitoso para el histograma de tiempo y las estadísticas de distribución --db-url Escribe solicitudes exitosas en la URL de la base de datos sqlite EG test.db --debug Realiza una sola solicitud y volcar la solicitud y la respuesta -h, --help Imprimir ayuda -V, --version Versión para imprimir
oha
imprime la salida JSON cuando se establece la opción -j
. El esquema de salida JSON se define en esquema.json.
Usamos hyperfine
para comparar oha
con rakyll/hey
en un servidor local. El servidor fue codificado usando node. Puede iniciar el servidor copiando, pegando este archivo y luego ejecutándolo a través de node. Después de copiar y pegar el archivo, puede ejecutar el punto de referencia mediante hyperfine
.
Copie y pegue el contenido en un nuevo archivo javascript llamado app.js
const http = require("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Tipo de contenido": "texto/sin formato" }); res.end("Hola mundo");});server.listen(3000, () => { console.log("Servidor ejecutándose en http://localhost:3000/");});
Ejecutar node app.js
Ejecute hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
en una pestaña de terminal diferente
Punto de referencia 1: oha --no-tui http://localhost:3000
Tiempo (media ± σ): 10,8 ms ± 1,8 ms [Usuario: 5,7 ms, Sistema: 11,7 ms]
Rango (mín. … máx.): 8,7 ms … 24,8 ms (107 ejecuciones)
Punto de referencia 2: Hola http://localhost:3000
Tiempo (media ± σ): 14,3 ms ± 4,6 ms [Usuario: 12,2 ms, Sistema: 19,4 ms]
Rango (mín. … máx.): 11,1 ms … 48,3 ms (88 ejecuciones)
En este punto de referencia, se descubrió que oha --no-tui http://localhost:3000
era más rápido y se ejecutaba aproximadamente 1,32 ± 0,48 veces más rápido que hey http://localhost:3000
.
oha
usa opciones predeterminadas heredadas de rakyll/hey, pero es posible que deba cambiar las opciones para realizar pruebas de estrés en condiciones más realistas.
Sugiero ejecutar oha
con las siguientes opciones.
oha <-z o -n> -c-q --latency-correction --disable-keepalive
--disable-keepalive
En realidad, el usuario no consulta la misma URL usando Keep-Alive. Es posible que desee ejecutar sin Keep-Alive
.
--corrección-latencia
Puede evitar Coordinated Omission Problem
utilizando --latency-correction
.
Puede utilizar --burst-delay
junto con la opción --burst-rate
para introducir un retraso entre un número definido de solicitudes.
oha -n 10 --retraso de ráfaga 2s --velocidad de ráfaga 4
En este escenario particular, cada 2 segundos se procesarán 4 solicitudes y después de 6 segundos se procesará un total de 10 solicitudes. NOTA: Si no configura la opción --burst-rate
, la cantidad predeterminada es 1
Puede utilizar la opción --rand-regex-url
para generar una URL aleatoria para cada conexión.
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
Cada URL se genera mediante caja rand_regex, pero el punto de la expresión regular está deshabilitado ya que no es útil para este propósito y es muy inconveniente si los puntos de la URL se interpretan como puntos de la expresión regular.
Opcionalmente, puede configurar la opción --max-repeat
para limitar el recuento máximo de repeticiones para cada expresión regular. por ejemplo, http://127.0.0.1/[az]* con --max-repeat 4
generará una URL como http://127.0.0.1/[az]{0,4}
Actualmente, el esquema dinámico, el host y el puerto con keep-alive no funcionan bien.
¡No dudes en ayudarnos!
Aquí hay algunas cosas para mejorar.
Escribir pruebas
Mejorar el diseño de tui.
¿Mostrar más información?
Ahora no hay colores en tui en tiempo real. Quiero ayuda de alguien que tenga algo de sentido del color.
mejorar la velocidad
Soy nuevo en Tokio. Creo que hay algo de espacio para optimizar la programación de consultas.