Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Stress testing и пиковые нагрузки

Stress testing: как система ведёт себя за пределом прочности

Чем stress testing отличается от load testing: поиск точки отказа, поведение под пиковой нагрузкой, graceful degradation и практические сценарии проверки прочности.

Прямой ответ

Stress testing — нагрузочное тестирование за пределом ожидаемой нагрузки, чтобы найти точку отказа (stress testing — «нагрузка выше нормы» — stress testing — ёмкость — «где система ломается» — stress testing), отличие от load testing: load testing — под ожидаемой нагрузкой («справляется ли» — load testing), stress testing — за пределом («где и как ломается» — stress testing — ёмкость — «load — норма, stress — предел» — stress testing); зачем: найти точку отказа (stress testing — «при какой нагрузке падает» — stress testing — ёмкость — «предел системы» — stress testing), проверить деградацию (stress testing — «как деградирует» — stress testing — backpressure — «падает gracefully или катастрофически» — stress testing), валидировать защиту (stress testing — «rate limiting/circuit breaker работают» — stress testing — retry — «защита срабатывает под стрессом» — stress testing), планировать ёмкость (stress testing — «запас прочности» — stress testing — ёмкость — «насколько можно вырасти» — stress testing); сценарии: (1) Step-up (stress testing — «ступенчатый рост до отказа» — stress testing — «100 → 200 → 500 → 1000 RPS» — stress testing — ёмкость — «найти точку, где p99 растёт/ошибки» — stress testing); (2) Spike (stress testing — «резкий пик» — stress testing — «100 → 5000 RPS на 30 с» — stress testing — backpressure — «как система переживает всплеск» — stress testing); (3) Breakpoint (stress testing — «нагрузка до полного отказа» — stress testing — «растим, пока не упадёт» — stress testing — ёмкость — «точка отказа» — stress testing); что наблюдать (метрики): точка отказа (stress testing — «при какой нагрузке p99 взлетает/ошибки растут» — stress testing — метрики), характер деградации (stress testing — «постепенная или обвал» — stress testing — backpressure — «graceful degradation» — backpressure), восстановление (stress testing — «восстанавливается после пика» — stress testing — incident — «отходит после стресса» — stress testing), узкое место (stress testing — «что первое падает — БД/кэш/CPU» — stress testing — ёмкость); когда stress testing: перед масштабированием (stress testing — «растём — знаем предел» — stress testing — ёмкость), проверка защиты (stress testing — «rate limiting/circuit breaker» — stress testing — retry — «защита под стрессом» — stress testing), пиковые события (stress testing — «чёрная пятница/релиз» — stress testing — ёмкость — «пик нагрузки» — stress testing); когда НЕ: прототип (stress testing — «прототип — оверхед» — stress testing — техдолг), прод без изоляции (stress testing — «stress в проде — положит прод» — stress testing — incident — только изолированный staging — stress testing); антипаттерны: stress без мониторинга (метрики — «не видим, что падает» — метрики — мониторинг обязателен — метрики), stress в проде (stress testing — «прод упал» — incident — только staging — stress testing), stress без восстановления (stress testing — «не проверили восстановление» — stress testing — «отходит после пика» — incident).

Практика: stress testing в k6

Step-up сценарий (stress testing: export let options = { stages: [ { duration: '1m', target: 200 }, { duration: '1m', target: 500 }, { duration: '1m', target: 1000 }, { duration: '1m', target: 2000 } ] }; (k6 — «ступени 200→500→1000→2000 VUs» — k6 — ёмкость); Spike сценарий (stress testing: export let options = { stages: [ { duration: '10s', target: 5000 }, { duration: '1m', target: 100 } ] }; (k6 — «пик 5000, потом спад» — k6 — backpressure); Пороги (stress testing: export let options = { thresholds: { http_req_duration: ['p(95)<500'], http_req_failed: ['rate<0.01'] } }; (k6 — «p95 < 500 мс, ошибок < 1%» — k6 — метрики); Мониторинг (метрики: Grafana (Grafana — «метрики системы под стрессом» — Grafana — CPU/память/latency/ошибки (метрики — «что первое saturates» — метрики); Защита под стрессом (retry): rate limiting (retry — «429 под пиком» — retry — circuit breaker (retry — «circuit открылся» — retry — backpressure (backpressure — «поток приторможен» — backpressure).

Практический сценарий: подготовка к пиковой распродаже

Контекст: e-commerce API (ёмкость), ожидается пик ×5 в распродажу (stress testing — «пик ×5» — stress testing — ёмкость), боль: не знаем, выдержит ли (stress testing — «выдержит ли пик» — stress testing — ёмкость); решение — stress testing: (1) step-up на staging (stress testing — «ступени до ×10 нормы» — stress testing — ёмкость — только staging, не прод (stress testing — «prod не трогаем» — incident); (2) метрики (метрики — p95/p99/error rate/CPU/память (метрики — Grafana — «что saturates первым» — метрики); (3) точка отказа (stress testing — «при ×6 p99 взлетает, ошибки 5%» — stress testing — ёмкость — узкое место — пул соединений БД (stress testing — «БД — узкое место» — postgres); (4) деградация (stress testing — «за пределом — 503 + Retry-After, не обвал» — stress testing — backpressure — graceful (backpressure); (5) защита (retry — rate limiting срабатывает (retry — circuit breaker открывается (retry — backpressure (backpressure — «защита работает под стрессом» — retry); (6) восстановление (stress testing — «после пика система отходит за 1 мин» — stress testing — incident); (7) план (stress testing — «увеличить пул БД + autoscaling до пика» — stress testing — ёмкость); результат: точка отказа найдена (×6 — stress testing — ёмкость), узкое место — БД (postgres — пул соединений — postgres), деградация graceful (backpressure — 503, не обвал — backpressure), защита работает (retry — rate limiting/circuit breaker — retry), план масштабирования (ёмкость — пул БД + autoscaling — ёмкость); вывод: stress testing решили задачу (предел прочности известен, деградация graceful, защита проверена — stress testing — ADR — «stress в проде» — антипаттерн — incident — только изолированный staging — stress testing — техдолг).

FAQ

Stress testing против load testing — в чём разница? Load testing (load testing — под ожидаемой нагрузкой (load testing — «справляется ли с нормой» — load testing — ёмкость — «норма» — load testing); Stress testing (stress testing — за пределом (stress testing — «где ломается» — stress testing — ёмкость — «предел» — stress testing); разница: load — проверка нормы (load testing — «норма ок» — load testing), stress — поиск предела (stress testing — «точка отказа» — stress testing); когда load: перед релизом (load testing — «норма» — load testing), когда stress: перед пиком/масштабированием (stress testing — «предел» — stress testing — ёмкость); «stress вместо load» — нет (разные цели — load testing — stress testing — оба нужны — ADR — техдолг).

Что такое graceful degradation и зачем его проверять под стрессом? Graceful degradation (backpressure — «постепенная деградация» — backpressure — «часть функционала, не обвал» — backpressure — «503 + Retry-After вместо падения» — backpressure); зачем проверять: под стрессом система должна деградировать предсказуемо (stress testing — «за пределом — graceful, не обвал» — stress testing — backpressure — «лучше часть, чем ничего» — backpressure); механизмы: rate limiting (retry — «429» — retry), circuit breaker (retry — «circuit открыт» — retry), backpressure (backpressure — «поток приторможен» — backpressure), fallback (retry — «fallback» — retry); «обвал вместо деградации» — антипаттерн (система падает целиком — stress testing — graceful обязателен — backpressure — ADR — техдолг).

Как найти точку отказа и узкое место при stress testing? Точка отказа (stress testing — «нагрузка, где p99 взлетает/ошибки растут» — stress testing — метрики — step-up до отказа (stress testing — «ступени до отказа» — stress testing); Узкое место (stress testing — «что первое saturates» — stress testing — метрики — CPU/память/БД/кэш (метрики — USE-метод (use-метод — «utilization/saturation/errors по ресурсам» — use-метод); Инструменты: Grafana (Grafana — «метрики под стрессом» — Grafana), профилирование (flamegraph — «узкое место в коде» — flamegraph — pprof); «stress без метрик» — антипаттерн (не видим, что падает — метрики — мониторинг обязателен — метрики — ADR — техдолг).

Можно ли проводить stress testing в проде и как делать безопасно? В проде — опасно (stress testing — «stress в проде положит прод» — stress testing — incident — реальный трафик пострадает (stress testing — «пользователи упрутся в отказ» — incident); Безопасно: изолированный staging (stress testing — «staging — копия прода» — stress testing — ёмкость — «та же конфигурация» — ёмкость), теневой трафик (stress testing — «shadow traffic» — stress testing — deploy — «копия трафика без ответов» — deploy), feature flags (stress testing — «фичи под флагами» — stress testing — микросервисы — «включаем по частям» — микросервисы); «stress в проде без изоляции» — антипаттерн (прод падает — incident — только staging/shadow — stress testing — ADR — техдолг).

Источники: k6 docs (stress testing), Wikipedia (stress testing), Grafana k6 docs — ссылки в шапке.