oha — это крошечная программа, которая отправляет некоторую нагрузку на веб-приложение и показывает в реальном времени туи, вдохновленную rakyll/hey.
Эта программа написана на Rust и работает на платформе tokio и прекрасной туи от ratatui.
Эта программа построена на стабильной версии Rust и требует как make
, так и cmake
для установки через Cargo.
cargo install oha
При желании вы можете построить oha на основе Native-TLS вместо Rustls.
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 env использовать оха
Вы также можете собрать и создать образ контейнера, включая oha
сборка докера. -t example.com/hatoo/oha:latest
Затем вы можете использовать oha непосредственно через контейнер.
docker run -it example.com/hatoo/oha:latest https://example.com:3000
Вы можете собрать oha
с помощью PGO, используя следующие команды:
булочка запустить 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 [ОПЦИИ]Аргументы: Целевой URL. Параметры: -n Количество запросов для выполнения. [по умолчанию: 200] -c Количество соединений, которые будут выполняться одновременно. Возможно, вам следует увеличить ограничение на количество открытых файлов для большего размера `-c`. [по умолчанию: 50] -p Количество параллельных запросов для отправки по HTTP/2. `oha` будет одновременно запускать c * p рабочих процессов. [по умолчанию: 1] -z <ПРОДОЛЖИТЕЛЬНОСТЬ> Продолжительность отправки запросов приложением. Если указана продолжительность, n игнорируется. В HTTP/1 по достижении заданного времени текущие запросы прерываются и считаются «прерванными из-за крайнего срока». Это поведение можно изменить с помощью опции `-w`. В настоящее время на HTTP/2 по достижении продолжительности текущие запросы ожидаются. Опция `-w` игнорируется. Примеры: -z 10s -z 3m. -w, --wait-congoing-requests-after-deadline Когда продолжительность достигнута, текущие запросы ожидаются. -q Ограничение скорости для всех, в запросах в секунду (QPS) --burst-delay Ввести задержку между предопределенным количеством запросов. Примечание. Если указано qps, пакетная передача будет игнорироваться. --burst-rate Частота запросов на пакетную передачу. По умолчанию – 1. Примечание. Если указано qps, пакетная передача будет игнорироваться. --rand-regex-url Создать URL-адрес с помощью ящика rand_regex, но точка отключена для каждого запроса, например 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 --latency-коррекция Исправьте задержку, чтобы избежать проблемы скоординированного пропуска. Он игнорируется, если не установлен параметр -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] --disable-поддержание активности Отключить поддержку активности, предотвращает повторное использование TCP-соединений между различными HTTP-запросами. Это не поддерживается для HTTP/2. --no-pre-lookup *Не* выполнять поиск DNS в начале кэширования --ipv6 Поиск только ipv6. --ipv4 Искать только IPv4. --insecure Принять недействительные сертификаты. --connect-to Переопределить разрешение DNS и номера портов по умолчанию с помощью строк типа 'example.org:443:localhost:8443' --disable-color Отключить цветовую схему. --unix-socket Подключиться к сокету unix вместо домена в URL-адресе. Только для URL-адресов, отличных от HTTPS. --stats-success-breakdown Включить успешный или неуспешный код состояния ответа для гистограммы времени и статистики распределения --db-url Записать успешные запросы на URL-адрес базы данных sqlite, например test.db --debug Выполнить одиночный запрос и выгрузить запрос и ответ -h, --help Распечатать справку -V, --version Версия для печати
oha
печатает вывод JSON, когда установлена опция -j
. Схема вывода JSON определяется в файле Schema.json.
Мы использовали hyperfine
для сравнения oha
с rakyll/hey
на локальном сервере. Сервер был написан с использованием node. Вы можете запустить сервер, скопировав этот файл и затем запустив его через node. После копирования файла вы можете запустить тест через hyperfine
.
Скопируйте и вставьте содержимое в новый файл JavaScript с именем 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("Сервер работает по адресу 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 мс ± 1,8 мс [Пользователь: 5,7 мс, Система: 11,7 мс]
Диапазон (мин…макс): 8,7 мс…24,8 мс (107 запусков)
Тест 2: эй, http://localhost:3000
Время (среднее ± σ): 14,3 мс ± 4,6 мс [Пользователь: 12,2 мс, Система: 19,4 мс]
Диапазон (мин… макс): 11,1 мс… 48,3 мс (88 запусков)
В этом тесте oha --no-tui http://localhost:3000
оказался быстрее: примерно в 1,32 ± 0,48 раза быстрее, чем hey http://localhost:3000
.
oha
использует параметры по умолчанию, унаследованные от rakyll/hey, но вам может потребоваться изменить параметры стресс-теста в более реалистичных условиях.
Я предлагаю запустить oha
со следующими опциями.
oha <-z или -n> -c <количество одновременных подключений> -q <запрос в секунду> --latency-correction --disable-keepalive <целевой адрес>
--disable-поддержание активности
В действительности пользователь не запрашивает один и тот же URL-адрес с помощью Keep-Alive. Возможно, вы захотите запустить без Keep-Alive
.
--latency-коррекция
Вы можете избежать Coordinated Omission Problem
используя --latency-correction
.
Вы можете использовать --burst-delay
вместе с опцией --burst-rate
, чтобы ввести задержку между определенным количеством запросов.
oha -n 10 --burst-delay 2s --burst-rate 4
В этом конкретном сценарии каждые 2 секунды будут обрабатываться 4 запроса, а через 6 секунд будет обработано всего 10 запросов. ПРИМЕЧАНИЕ. Если вы не установили параметр --burst-rate
, сумма по умолчанию равна 1.
Вы можете использовать опцию --rand-regex-url
для генерации случайного URL-адреса для каждого соединения.
оха --rand-regex-url http://127.0.0.1/[az][az][0-9]
Каждый URL-адрес генерируется контейнером rand_regex, но точка регулярного выражения отключена, поскольку она бесполезна для этой цели, и очень неудобно, если точки URL-адреса интерпретируются как точка регулярного выражения.
При желании вы можете установить опцию --max-repeat
, чтобы ограничить максимальное количество повторений для каждого регулярного выражения. например http://127.0.0.1/[az]* с --max-repeat 4
создаст URL-адрес типа http://127.0.0.1/[az]{0,4}
В настоящее время динамическая схема, хост и порт с поддержкой активности не работают должным образом.
Смело помогайте нам!
Вот некоторые проблемы, требующие улучшения.
Написание тестов
Улучшите дизайн туи.
Показать дополнительную информацию?
В туи в реальном времени теперь нет цвета. Мне нужна помощь человека, у которого есть чувство цвета.
Улучшить скорость
Я новичок в Токио. Я думаю, что есть место для оптимизации планирования запросов.