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!