398 слов | 1 минута
WRK
Современный многопоточный инструмент нагрузочного тестирования с поддержкой Lua-скриптов для создания сложных сценариев.
Основные возможности:
- Многопоточный и высокопроизводительный
- Поддержка скриптов на Lua
- Более точные измерения при высоких нагрузках
- Возможность создавать сложные сценарии тестирования
Примеры
Простой тест - 30 секунд, 12 потоков, 400 соединений
wrk -t12 -c400 -d30s https://example.com/
Детальный тест с выводом задержек
# -t: количество потоков
# -c: количество соединений
# -d: длительность теста
# --latency: показать детальную статистику задержек
wrk -t8 -c200 -d60s --latency https://example.com/api/data
Тест с таймаутом
wrk -t4 -c100 -d30s --timeout 10s https://example.com/slow-endpoint
Использование Lua скрипта для POST запроса
# Сначала создаем файл post.lua:
cat > post.lua << 'EOF'
wrk.method = "POST"
wrk.body = '{"username":"test","password":"pass123"}'
wrk.headers["Content-Type"] = "application/json"
EOF
# Запускаем тест с скриптом
wrk -t4 -c100 -d30s -s post.lua https://example.com/api/login
Скрипт с динамическими данными
cat > dynamic.lua << 'EOF'
counter = 0
request = function()
counter = counter + 1
path = "/api/user/" .. counter
return wrk.format("GET", path)
end
EOF
wrk -t4 -c100 -d20s -s dynamic.lua https://example.com
Скрипт с заголовками авторизации
cat > auth.lua << 'EOF'
wrk.method = "GET"
wrk.headers["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
wrk.headers["Accept"] = "application/json"
EOF
wrk -t8 -c200 -d30s -s auth.lua https://example.com/api/protected
Расширенный скрипт с обработкой ответов
cat > advanced.lua << 'EOF'
done = function(summary, latency, requests)
io.write("------------------------------\n")
io.write(string.format("Requests: %d\n", summary.requests))
io.write(string.format("Duration: %.2fs\n", summary.duration / 1000000))
io.write(string.format("Bytes: %d\n", summary.bytes))
io.write(string.format("Errors: %d\n", summary.errors.connect +
summary.errors.read +
summary.errors.write +
summary.errors.timeout))
io.write("------------------------------\n")
end
EOF
wrk -t8 -c200 -d30s -s advanced.lua https://example.com/
Результаты
Когда wrk выполняет тест с флагом --latency, он выводит статистику задержек. Давайте разберем каждую метрику подробно.
Пример вывода:
Latency Distribution
50% 2.45ms
75% 3.12ms
90% 4.28ms
99% 8.91ms
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.67ms 1.23ms 45.12ms 87.32%
Req/Sec 1.52k 234.56 2.10k 73.45%
Req/Sec— это количество запросов в секунду, которое каждый поток (thread) смог обработать во время теста.Latency— это время, которое проходит от момента отправки запроса до получения ответа. Это одна из самых важных метрик производительности!
1. Avg (Average / Среднее значение)
Среднее арифметическое всех измерений задержки
Формула: Avg = (сумма всех задержек) / (количество запросов)
Пример:
- Если у вас 5 запросов с задержками: 10ms, 20ms, 15ms, 25ms, 30ms
- Avg = (10 + 20 + 15 + 25 + 30) / 5 = 20ms
Что это значит:
- Если Avg = 2.67ms → в среднем каждый запрос обрабатывается за 2.67 миллисекунды
- Это самая базовая метрика, но она не показывает полную картину
- Может быть искажена выбросами (очень медленными запросами)
2. Stdev (Standard Deviation / Стандартное отклонение)
Мера разброса данных относительно среднего значения. Показывает, насколько сильно отдельные измерения отличаются от среднего
Что это значит:
- Низкое стандартное отклонение (например, 0.5ms при Avg = 2.67ms) → стабильная производительность, большинство запросов обрабатывается примерно за одно и то же время
- Высокое стандартное отклонение (например, 5ms при Avg = 2.67ms) → нестабильная производительность, есть большой разброс в времени ответа
Стабильный сервер:
Задержки: 10ms, 11ms, 10ms, 12ms, 10ms, 11ms
Avg = 10.67ms
Stdev = 0.75ms (низкое → стабильно)
Нестабильный сервер:
Задержки: 5ms, 50ms, 3ms, 45ms, 8ms, 100ms
Avg = 35.17ms
Stdev = 35.24ms (высокое → нестабильно!)
3. Max (Maximum / Максимальное значение)
Самая большая задержка, зафиксированная за весь тест
Что это значит:
- Max = 45.12ms → хотя бы один запрос занял 45.12 миллисекунды
- Это важная метрика для понимания "worst case" сценария
- Помогает выявить проблемы, которые не видны в среднем значении
Почему это важно:
Сервер A: Avg = 10ms, Max = 15ms → стабильный
Сервер B: Avg = 10ms, Max = 5000ms → есть серьезные проблемы!
4. +/- Stdev (Процент значений в пределах одного стандартного отклонения)
Процент запросов, которые попадают в диапазон [Avg - Stdev, Avg + Stdev].
Если у вас:
- Avg = 10ms
- Stdev = 2ms
- +/- Stdev = 87.32%
Это означает, что 87.32% всех запросов имели задержку в диапазоне 8ms-12ms (то есть 10ms ± 2ms).
Интерпретация:
- +/- Stdev = 68% → нормальное распределение (соответствует теории вероятности)
- +/- Stdev > 80% → большинство запросов близки к среднему, производительность предсказуема
- +/- Stdev < 50% → большой разброс, много выбросов, непредсказуемая производительность
Золотое правило: Смотрите не только на среднее значение, но и на весь набор метрик. Система с Avg=10ms и Max=5000ms гораздо хуже системы с Avg=20ms и Max=30ms!