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.