131 слов | 1 минута
WRK: нагрузочное тестирование
WRK — многопоточный инструмент нагрузочного тестирования HTTP с поддержкой Lua-скриптов для создания сложных сценариев.
Ключевые возможности:
- Многопоточная архитектура с высокой производительностью
- Lua-скрипты для нестандартных сценариев (POST, заголовки, авторизация)
- Точные измерения задержек при высоких нагрузках
Примеры запуска
# Базовый тест: 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-запрос с JSON
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
Динамические URL
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 <token>"
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/
Интерпретация результатов
Пример вывода с флагом --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 — количество запросов в секунду на каждый поток.
Latency — время от отправки запроса до получения ответа.
Avg, Stdev, Max
| Метрика | Описание |
|---|---|
Avg |
Среднее время ответа. Может быть искажено выбросами |
Stdev |
Стандартное отклонение. Низкое значение → стабильная производительность |
Max |
Максимальная задержка. Показывает «worst case» сценарий |
+/- Stdev |
Доля запросов в диапазоне [Avg ± Stdev]. Выше 80% — предсказуемая производительность |
Сравнение серверов:
Сервер A: Avg = 10ms, Max = 15ms → стабильный
Сервер B: Avg = 10ms, Max = 5000ms → есть серьёзные проблемы
Правило: смотрите не только на среднее значение, но и на весь набор метрик. Система с
Avg=10msиMax=5000msзначительно хуже системы сAvg=20msиMax=30ms.