Перейти к содержимому
Нагрузочное тестирование

Нагрузочное тестирование

Нагрузочное тестирование — проверка производительности API под нагрузкой (RPS, время ответа, потребление ресурсов). Виды: Load (ожидаемая нагрузка), Stress (до разрушения), Soak (длительная, утечки памяти), Spike (резкий скачок). Ключевые метрики: p50/p95/p99 (время ответа), RPS (пропускная способность), CPU/RAM, процент ошибок (5xx, таймауты). Инструменты: k6 (современный), JMeter (классика), Locust (Python). Сценарии: постепенное увеличение, постоянная нагрузка, пик, до разрушения. Анализ: смотреть на перцентили, не на среднее; искать узкие места (БД, сеть, приложение, кеш). В CI/CD: ночной запуск на стенде, похожем на production.

Введение: Проверка на прочность

Представьте, что вы построили мост. Архитекторы проверили чертежи. Строители проверили каждый болт и каждую сварку. Но вы не знаете, выдержит ли мост 10 машин одновременно. Или 100. Или 1000.

Нагрузочное тестирование — это проверка моста на прочность. В мире API это проверка того, как система ведёт себя под нагрузкой: сколько запросов в секунду выдерживает, как быстро отвечает, не падает ли, когда становится тяжело.

Нагрузочное тестирование (Load Testing) — это тестирование производительности системы под ожидаемой нагрузкой. Оно отвечает на вопросы: “Сколько пользователей может обслуживать API?”, “Какое время ответа?”, “Где узкое место?”.

Для системного аналитика нагрузочное тестирование — это проверка нефункциональных требований. Вы не проверяете, правильно ли API считает скидку (это модульные тесты). Вы проверяете, что API отвечает за 200 мс при 1000 запросах в секунду.

Виды нагрузочного тестирования

ВидВопросЦель
Load Testing“Выдержит ли ожидаемую нагрузку?”Проверка соответствия требованиям
Stress Testing“Когда сломается?”Найти предел прочности
Soak Testing“Не течёт ли под нагрузкой?”Проверка утечек памяти, ресурсов
Spike Testing“Переживёт ли резкий скачок?”Проверка на внезапные всплески

Ключевые метрики

Время отклика (Latency)

ПоказательЧто значитТипичные цели
p50 (медиана)Половина запросов быстрее этого времени< 100 мс
p9595% запросов быстрее< 300 мс
p9999% запросов быстрее< 500 мс
p100 (максимум)Самый медленный запрос< 2000 мс

Что важно понимать: Среднее арифметическое (mean) часто обманчиво. Медиана (p50) даёт лучшее представление о типичном пользователе.

Пропускная способность (Throughput)

ПоказательЧто значит
RPS (Requests Per Second)Запросов в секунду
TPS (Transactions Per Second)Транзакций в секунду

Потребление ресурсов

РесурсЧто смотреть
CPUПроцент загрузки процессора
RAMПотребление памяти
СетьВходящий/исходящий трафик
ДискIOPS, чтение/запись
БДКоличество соединений, медленные запросы

Процент ошибок

ПоказательЧто значитДопустимо
Error RateДоля запросов с ошибкой (5xx)< 0.1%
Timeout RateДоля таймаутов0%

Процесс нагрузочного тестирования

Этапы

    graph LR
    A[Планирование] --> B[Создание сценариев]
    B --> C[Запуск тестов]
    C --> D[Сбор метрик]
    D --> E[Анализ]
    E --> F[Оптимизация]
    F --> B
  

Что делает аналитик на каждом этапе

ЭтапДействия аналитика
ПланированиеОпределить цели: “API должен выдерживать 1000 RPS с p95 < 200 мс”
Создание сценариевОпределить, какие эндпоинты тестировать, с какими параметрами
ЗапускСогласовать время (не в час пик), запустить тесты
Сбор метрикПолучить отчёты из инструментов
АнализПонять, где узкое место
ОптимизацияПередать выводы разработчикам, архитекторам

Инструменты нагрузочного тестирования

Популярные инструменты

ИнструментЯзык сценариевЧто умеетПопулярность
JMeterGUI / XMLВсёВысокая
k6JavaScriptСовременный, облачныйВысокая
GatlingScala / KotlinМощные отчётыСредняя
LocustPythonГибкийСредняя
Yandex.TankYAML / PythonИнтеграция с Яндекс.ОблакомНизкая (СНГ)

Что важно для аналитика

АспектЧто смотреть
ОтчётыГрафики, перцентили, количество ошибок
НастраиваемостьМожно ли задать разные типы нагрузки
ИнтеграцияМожно ли встроить в CI/CD
ЦенаЕсть ли бесплатная версия

Сценарии нагрузки

Постепенное увеличение (Ramp-up)

Нагрузка растёт постепенно от 0 до целевого значения.

Время (сек): 0 → 60 → 120
RPS:        0 → 500 → 1000

Что даёт: Позволяет увидеть, при какой нагрузке начинаются проблемы.

Постоянная нагрузка (Constant)

Фиксированное количество RPS в течение времени.

Время (сек): 0 → 300 → 600
RPS:        1000 → 1000 → 1000

Что даёт: Проверка стабильности под нагрузкой.

Пиковая нагрузка (Spike)

Внезапный резкий скачок нагрузки.

Время (сек): 0 → 10 → 60
RPS:        100 → 5000 → 100

Что даёт: Проверка, не падает ли система при резком скачке.

Нагрузка до разрушения (Stress)

Нагрузка увеличивается, пока система не начнёт падать.

Время (сек): 0 → 300 → ...
RPS:        100 → 200 → 400 → 800 → 1600 → (падение)

Что даёт: Понимание предела прочности.

Анализ результатов

Хорошие результаты

ПоказательЗначение
p95< 200 мс
Error rate< 0.1%
RPS≥ целевого
CPU< 70%
RAM< 80%

Тревожные сигналы

СигналЧто может значить
p95 резко растёт после какого-то RPSУзкое место, очередь
Ошибки 5xx появляются при нагрузкеСервер не справляется
Ошибки 429 (Too Many Requests)Rate limiting сработал
Таймауты увеличиваютсяБаза данных медленная
CPU 100%Упираемся в процессор
RAM растёт бесконечноУтечка памяти

Типичные узкие места

Узкое местоПризнакиКто решает
База данныхМедленные запросы, высокая загрузка CPU на БДРазработчики, DBA
СетьВысокая задержка, потери пакетовDevOps, сетевики
ПриложениеВысокий CPU, много потоков в WAITРазработчики
Внешние APIТаймауты, ошибки от внешнего сервисаКоманда интеграции
Кеш (Redis)Высокая задержка, ошибкиРазработчики, DevOps

Пример: Отчёт нагрузочного тестирования

Шапка

Отчёт нагрузочного тестирования
API: GET /users/{id}
Дата: 2024-01-15
Цель: 1000 RPS, p95 < 200 мс
Инструмент: k6

Результаты

ПоказательЗначениеСтатус
Максимальный RPS1050
p5045 мс
p95180 мс
p99320 мс❌ (цель 300 мс)
Error rate0.05%
CPU (макс)65%
RAM (макс)2.1 ГБ

График

Время отклика (мс)
500 |                          *
400 |                        * *
300 |                      * * *
200 |    * * * * * * * * * * * * *
100 |  * * * * * * * * * * * * * * *
  0 +--------------------------------
    0   100  200  300  400  500  600  RPS

Выводы

1. Целевая нагрузка 1000 RPS достигнута.
2. p99 превышает цель (320 мс > 300 мс) при нагрузке > 800 RPS.
3. Рекомендация: оптимизировать медленные запросы, добавить кеш.

Нагрузочное тестирование в CI/CD

Где запускается

    graph LR
    A[Модульные тесты] --> B[Интеграционные]
    B --> C[Нагрузочные]
    C -->|Ночной запуск| D[Отчёт утром]
  

Особенности запуска

АспектКак
ЧастотаНе на каждый коммит (долго, дорого)
ВремяНочью, в выходные
СредаStaging, не production
МониторингСобирать метрики с серверов, БД, кеша

Интеграция с CI

# Пример .gitlab-ci.yml
load_test:
  stage: test
  script:
    - k6 run load_test.js
  artifacts:
    reports:
      load_report: load_report.json
  only:
    - main
  when: manual

Распространённые ошибки

Ошибка 1: Тестирование на неправильных данных

Тесты используют одни и те же данные, кеш разогрет, БД не напрягается.

Решение: Использовать разные данные (параметризация).

Ошибка 2: Тестирование на неправильной среде

Среда отличается от production: меньше ресурсов, другая конфигурация.

Решение: Стенд для нагрузочного тестирования должен быть как production.

Ошибка 3: Игнорирование холодного старта

Первый запрос после запуска может быть медленным из-за инициализации.

Решение: Игнорировать первые N запросов или сделать прогревочный прогон.

Ошибка 4: Смотреть только среднее

Среднее может быть хорошим, а p99 — ужасным.

Решение: Смотреть на перцентили (p95, p99).

Ошибка 5: Тестирование одного эндпоинта

В реальности пользователи делают разные запросы.

Решение: Смешанный сценарий: 60% GET /users, 20% GET /orders, 10% POST /orders, 10% остальное.

Планирование нагрузочного тестирования

Вопросы для аналитика

ВопросЗачем
“Какая ожидаемая нагрузка?”Целевые RPS
“Какие пиковые нагрузки?”Spike тестирование
“Какие эндпоинты самые критичные?”Приоритеты
“Какое допустимое время ответа?”SLO (Service Level Objective)
“Сколько пользователей одновременно?”Конкуренция
“Какой профиль нагрузки?”Равномерная, волнообразная, суточная

Пример целевых показателей (SLO)

ЭндпоинтЦелевой RPSp95p99
GET /users500100 мс200 мс
GET /users/{id}200050 мс100 мс
POST /orders100300 мс500 мс
GET /reports105 с10 с

Резюме

  1. Нагрузочное тестирование — проверка производительности системы под нагрузкой. Ответы на вопросы: “Сколько выдержит?”, “Как быстро?”, “Где узкое место?”

  2. Виды: Load (ожидаемая нагрузка), Stress (до разрушения), Soak (длительная), Spike (резкий скачок).

  3. Ключевые метрики: время отклика (p50, p95, p99), пропускная способность (RPS), потребление ресурсов (CPU, RAM), процент ошибок.

  4. Инструменты: k6 (современный, простой), JMeter (классика), Locust (гибкий).

  5. Сценарии: постепенное увеличение, постоянная нагрузка, пик, нагрузка до разрушения.

  6. Анализ: искать узкие места (БД, сеть, приложение, кеш). Смотреть на перцентили, не на среднее.

  7. В CI/CD: нагрузочные тесты обычно запускаются ночью, не на каждый коммит. Нужен стенд, похожий на production.

Проверка знаний

Вопрос 1 из 4
Что проверяет нагрузочное тестирование API?
Что означает метрика p95 latency?
Какой вид теста отвечает на вопрос 'Когда система сломается?'
Что из перечисленного является ключевой метрикой нагрузочного тестирования?

Вопросы, где были ошибки