Нагрузочное тестирование: k6, NBomber, метрики и профили нагрузки
↑ 7.5 Нагрузочное и продвинутое тестирование · → Следующая
Зачем это на собесе
Как проверить, что сервис выдержит нагрузку, и как интерпретировать результаты.
Объяснение
| Профиль | Цель |
|---|---|
| Load | ожидаемая рабочая нагрузка, проверка SLO |
| Stress | нарастание до отказа: где предел и как деградирует |
| Spike | резкий всплеск: справляется ли автоскейлинг |
| Soak (endurance) | длительная нагрузка: утечки, деградация |
| Breakpoint | найти максимальную пропускную способность |
Инструменты: k6 (JS-сценарии, метрики, пороги, CI), NBomber (.NET, сценарии на C#), Gatling, JMeter, bombardier/wrk для быстрых замеров, Locust.
import http from "k6/http"; import { check, sleep } from "k6";
export const options = {
stages: [{ duration: "2m", target: 100 }, { duration: "5m", target: 100 }, { duration: "1m", target: 0 }],
thresholds: { http_req_failed: ["rate<0.01"], http_req_duration: ["p(95)<300"] }, // тест падает при нарушении
};
export default function () {
const r = http.get(`${__ENV.BASE}/orders?limit=20`, { headers: { Authorization: `Bearer ${__ENV.TOKEN}` } });
check(r, { "status 200": (x) => x.status === 200 });
sleep(1);
}Метрики: RPS, перцентили задержки (p50/p95/p99), доля ошибок, насыщение (CPU, память, пул соединений, потоки), метрики БД (медленные запросы, блокировки).
Порядок: определить SLO → реалистичный сценарий (миксы запросов, данные, think time) → прогрев → нагрузка → анализ узкого места → исправление → повтор.
Нюансы и подводные камни
- Тест генератором на той же машине искажает результат.
- Нереалистичные данные (один и тот же id) дают нереальный кэш-хит.
- Смотрите не среднее, а p95/p99 и ошибки.
- Открытая (фиксированный RPS) и закрытая (фиксированное число VU) модели нагрузки дают разные картины при деградации.
- Нагрузочный тест на проде — только с планом и защитой (тестовые данные, лимиты).
Практика
- Напишите k6-сценарий с порогами и запустите в CI.
- Найдите предел RPS и первое узкое место.
- Проведите soak-тест на 1 час и сравните память.
Вопросы с ответами
Чем stress отличается от load?
Load проверяет ожидаемую нагрузку, stress доводит до отказа, чтобы понять предел и поведение при деградации.
Почему важны перцентили?
Среднее скрывает хвостовые задержки, которые ощущают пользователи.