oha é um pequeno programa que envia alguma carga para uma aplicação web e mostra tui em tempo real inspirado em rakyll/hey.
Este programa foi escrito em Rust e desenvolvido por Tokio e Beautiful Tui por Ratatui.
Este programa é construído em Rust estável, com pré-requisitos make
e cmake
para instalação via cargo.
cargo install oha
Opcionalmente, você pode construir oha contra tls nativos em vez de ferrugem.
cargo install --no-default-features --features rustls oha
Você pode ativar o suporte VSOCK ativando o recurso 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
Você pode instalar com x-cmd.
x env usar oha
Você também pode construir e criar uma imagem de contêiner incluindo oha
construção do docker. -t exemplo.com/hatoo/oha:mais recente
Então você pode usar oha diretamente através do contêiner
docker run -it example.com/hatoo/oha:latest https://example.com:3000
Você pode construir oha
com PGO usando os seguintes comandos:
bun execute pgo.js
E o binário estará disponível em target/[target-triple]/pgo/oha
.
Linux - testado no Ubuntu 18.04 gnome-terminal
Windows 10 – testado no Windows Powershell
MacOS - testado em iTerm2
A opção -q
funciona diferente de rakyll/hey. É definida uma consulta geral por segundo, em vez de para cada trabalhador.
Ohayou(おはよう), gerador de carga HTTP, inspirado em rakyll/hey com animação tui. Uso: oha [OPÇÕES]Argumentos: URL de destino. Opções: -n Número de solicitações a serem executadas. [padrão: 200] -c Número de conexões a serem executadas simultaneamente. Você pode aumentar o limite do número de arquivos abertos para `-c` maiores. [padrão: 50] -p Número de solicitações paralelas a serem enviadas em HTTP/2. `oha` executará c * p trabalhadores simultâneos no total. [padrão: 1] -z Duração do aplicativo para enviar solicitações. Se a duração for especificada, n será ignorado. No HTTP/1, quando a duração é atingida, as solicitações em andamento são abortadas e contadas como "abortadas devido ao prazo". Você pode alterar esse comportamento com a opção `-w`. Atualmente, no HTTP/2, quando a duração é atingida, as solicitações em andamento são aguardadas. A opção `-w` é ignorada. Exemplos: -z 10s -z 3m. -w, --wait-ongoing-solicitações-após-prazo Quando a duração é atingida, as solicitações em andamento são aguardadas -q Limite de taxa para todos, em consultas por segundo (QPS) --burst-delay Introduz atraso entre um número predefinido de solicitações. Nota: Se qps for especificado, o burst será ignorado --burst-rate Taxas de solicitações de burst. O padrão é 1 Nota: Se qps for especificado, o burst será ignorado --rand-regex-url Gere URL por caixa rand_regex, mas o ponto está desabilitado para cada consulta, por exemplo, http://127.0.0.1/[az][az][0-9]. Atualmente o esquema dinâmico, host e porta com keep-alive não funcionam bem. Consulte https://docs.rs/rand_regex/latest/rand_regex/struct.Regex.html para obter detalhes de sintaxe. --max-repeat Um parâmetro para o '--rand-regex-url'. O parâmetro max_repeat fornece a contagem máxima de repetições extras que os operadores x*, x+ e x{n,} se tornarão. [padrão: 4] --dump-urls Despeja URLs de destino vezes para depurar --rand-regex-url --correção de latência Latência correta para evitar problemas de omissão coordenada. É ignorado se -q não estiver definido. --no-tui Não há tui em tempo real -j, --json Imprime os resultados como JSON --fps Quadro por segundo para tui. [padrão: 16] -m, --method Método HTTP [padrão: GET] -H Cabeçalho HTTP personalizado. Exemplos: -H "foo: bar" -t Tempo limite para cada solicitação. Padrão para infinito. -A Cabeçalho de aceitação HTTP. -d Corpo da solicitação HTTP. -D Corpo da solicitação HTTP do arquivo. -T Tipo de conteúdo. -a Autenticação básica, nome de usuário:senha --http-version Versão HTTP. Valores disponíveis 0,9, 1,0, 1,1. --http2 Use HTTP/2. Abreviação de --http-version=2 --host Cabeçalho do host HTTP --disable-compression Desativa a compactação. -r, --redirect Limite para o número de redirecionamentos. Defina 0 para nenhum redirecionamento. O redirecionamento não é compatível com HTTP/2. [padrão: 10] --disable-keepalive Desativar keep-alive, evita a reutilização de conexões TCP entre diferentes solicitações HTTP. Isso não é compatível com HTTP/2. --no-pre-lookup *Não* realizar uma pesquisa de DNS no início do cache. --ipv6 Pesquisa apenas ipv6. --ipv4 Pesquisa apenas ipv4. --insecure Aceita certificados inválidos. --connect-to Substitui a resolução DNS e os números de porta padrão por strings como 'example.org:443:localhost:8443' --disable-color Desativa o esquema de cores. --unix-socket Conecte-se a um soquete unix em vez do domínio na URL. Somente para URLs não HTTPS. --stats-success-breakdown Inclui um código de status de resposta bem-sucedido ou não bem-sucedido para o histograma de tempo e estatísticas de distribuição --db-url Grava solicitações bem-sucedidas no url do banco de dados sqlite EG test.db --debug Executa uma única solicitação e despeje a solicitação e a resposta -h, --help Imprimir ajuda -V, --version Imprimir versão
oha
imprime a saída JSON quando a opção -j
é definida. O esquema da saída JSON é definido em schema.json.
Usamos hyperfine
para comparar oha
com rakyll/hey
em um servidor local. O servidor foi codificado usando node. Você pode iniciar o servidor copiando e colando este arquivo e executando-o via node. Depois de copiar e colar o arquivo, você pode executar o benchmark via hyperfine
.
Copie e cole o conteúdo em um novo arquivo javascript chamado app.js
const http = require("http");const server = http.createServer((req, res) => { res.writeHead(200, { "Tipo de conteúdo": "texto/simples" }); res.end("Olá Mundon");});server.listen(3000, () => { console.log("Servidor rodando em http://localhost:3000/");});
Execute node app.js
Execute hyperfine 'oha --no-tui http://localhost:3000' 'hey http://localhost:3000'
em uma guia de terminal diferente
Referência 1: oha --no-tui http://localhost:3000
Tempo (média ± σ): 10,8 ms ± 1,8 ms [Usuário: 5,7 ms, Sistema: 11,7 ms]
Alcance (mínimo… máximo): 8,7 ms… 24,8 ms (107 execuções)
Referência 2: ei http://localhost:3000
Tempo (média ± σ): 14,3 ms ± 4,6 ms [Usuário: 12,2 ms, Sistema: 19,4 ms]
Alcance (mínimo… máximo): 11,1 ms… 48,3 ms (88 execuções)
Neste benchmark, oha --no-tui http://localhost:3000
foi considerado mais rápido, rodando aproximadamente 1,32 ± 0,48 vezes mais rápido que hey http://localhost:3000
.
oha
usa opções padrão herdadas de rakyll/hey, mas pode ser necessário alterar as opções para o teste de estresse em condições mais realistas.
Eu sugiro executar oha
com as seguintes opções.
oha <-z ou -n> -c-q --latency-correction --disable-keepalive
--disable-keepalive
Na verdade, o usuário não consulta o mesmo URL usando Keep-Alive. Você pode querer executar sem Keep-Alive
.
--correção de latência
Você pode evitar Coordinated Omission Problem
usando --latency-correction
.
Você pode usar --burst-delay
junto com a opção --burst-rate
para introduzir atraso entre um número definido de solicitações.
oha -n 10 --burst-delay 2s --burst-rate 4
Neste cenário específico, a cada 2 segundos, 4 solicitações serão processadas e após 6s será processado um total de 10 solicitações. NOTA: Se você não definir a opção --burst-rate
, o valor padrão será 1
Você pode usar a opção --rand-regex-url
para gerar um URL aleatório para cada conexão.
oha --rand-regex-url http://127.0.0.1/[az][az][0-9]
Cada URL é gerado pela caixa rand_regex, mas o ponto do regex está desabilitado, pois não é útil para esse propósito e é muito inconveniente se os pontos do URL forem interpretados como o ponto do regex.
Opcionalmente, você pode definir a opção --max-repeat
para limitar a contagem máxima de repetições para cada regex. por exemplo, http://127.0.0.1/[az]* com --max-repeat 4
irá gerar um URL como http://127.0.0.1/[az]{0,4}
Atualmente o esquema dinâmico, host e porta com keep-alive não funcionam bem.
Fique à vontade para nos ajudar!
Aqui estão algumas questões para melhorar.
Escreva testes
Melhore o design do tui.
Mostrar mais informações?
Não há cores no tui em tempo real agora. Quero ajuda de alguém que tenha algum senso de cores.
Melhorar a velocidade
Sou novo em Tóquio. Acho que há algum espaço para otimizar o agendamento de consultas.