Прямой ответ
Load testing — нагрузочное тестирование для проверки производительности под ожидаемой нагрузкой (load testing — «система под нагрузкой» — load testing — ёмкость — «как система ведёт себя под нагрузкой» — load testing), зачем: проверка производительности (load testing — «p95/p99 под нагрузкой» — load testing — ёмкость — «как система ведёт себя» — load testing), поиск узких мест (load testing — «узкие места под нагрузкой» — load testing — ёмкость — «где тормозит» — load testing), валидация ёмкость (load testing — «ёмкость подтверждена» — load testing — ёмкость — «расчёты верны» — load testing); инструменты: (1) k6 (k6 — современный, JavaScript-скрипты (k6 — «k6 — JS» — k6 — Grafana — «k6 + Grafana» — Grafana — простой API (k6 — «k6 проще JMeter» — k6 — техдолг); (2) JMeter (JMeter — зрелый, GUI (JMeter — «JMeter — GUI» — JMeter — техдолг — «JMeter — GUI, k6 — код» — k6 — сложный, но мощный (JMeter — «JMeter мощный» — JMeter — техдолг); сценарии нагрузки (load testing — «сценарии» — load testing — ёмкость): (1) Constant load (load testing — «постоянная нагрузка» — load testing — «100 RPS 5 минут» — load testing — ёмкость — «как система под постоянной нагрузкой» — load testing); (2) Ramp-up (load testing — «нарастание нагрузки» — load testing — «0 → 100 RPS за 1 минуту» — load testing — ёмкость — «как система справляется с ростом» — load testing); (3) Spike (load testing — «пик нагрузки» — load testing — «100 → 1000 RPS на 10 с» — load testing — stress testing — «как система под пиком» — stress testing); (4) Soak (load testing — «длительная нагрузка» — load testing — «100 RPS 1 час» — load testing — ёмкость — «как система под длительной нагрузкой» — load testing — «утечки памяти» — ёмкость); метрики (load testing — «метрики» — load testing — метрики): RPS (load testing — «requests per second» — load testing — ёмкость — «сколько запросов в секунду» — load testing), latency (load testing — «p50/p95/p99» — load testing — метрики — «задержка» — load testing), error rate (load testing — «процент ошибок» — load testing — метрики — «ошибки под нагрузкой» — load testing), throughput (load testing — «пропускная способность» — load testing — ёмкость — «сколько данных в секунду» — load testing); когда load testing: перед релизом (load testing — «перед релизом» — load testing — deploy — «как система под нагрузкой» — load testing), изменение архитектуры (load testing — «архитектура изменилась» — load testing — микросервисы — «как новая архитектура под нагрузкой» — load testing), валидация ёмкость (load testing — «ёмкость подтверждена» — load testing — ёмкость — «расчёты верны» — load testing); когда НЕ load testing: прототип (load testing — «прототип — load testing оверхед» — load testing — техдолг — «load testing для прототипа» — оверхед — техдолг), простые случаи (load testing — «load testing не нужен» — load testing — техдолг — «load testing оверхед» — техдолг); антипаттерны: load testing без метрик (метрики — «load testing без метрик» — метрики — «не знаем, что измерять» — метрики — метрики обязательны — метрики), load testing без мониторинга (метрики — «load testing без мониторинга» — метрики — «не видим, что происходит» — метрики — мониторинг обязателен — метрики), load testing в проде (load testing — «load testing в проде» — load testing — incident — «прод упал» — incident — только staging — load testing).
Практика: k6 для load testing API
k6 скрипт (k6: import http from 'k6/http'; import { check, sleep } from 'k6'; export let options = { vus: 100, duration: '5m' }; export default function () { let res = http.get(''); check(res, { 'status 200': (r) => r.status === 200 }); sleep(1); } (k6 — «100 VUs, 5 минут» — k6 — ёмкость); Запуск (k6: k6 run script.js (k6 — «k6 run» — k6 — ёмкость); JMeter (JMeter — GUI (JMeter — «JMeter GUI» — JMeter — техдолг — Thread Group (JMeter — «100 threads, 5 минут» — JMeter — ёмкость — HTTP Request (JMeter — «GET /users» — JMeter — ёмкость); Метрики (метрики: RPS (load testing — «RPS» — load testing — ёмкость), latency (метрики — «p50/p95/p99» — метрики — load testing), error rate (метрики — «процент ошибок» — метрики — load testing); Мониторинг (метрики: Grafana (Grafana — «k6 + Grafana» — Grafana — метрики — дашборды (Grafana — «метрики load testing» — Grafana — метрики).
Практический сценарий: load testing API перед релизом
Контекст: API (ёмкость), релиз (deploy — «релиз» — deploy — load testing), боль: не знаем, как API под нагрузкой (load testing — «как API под нагрузкой» — load testing — ёмкость); решение — load testing: (1) k6 скрипт (k6 — import http from 'k6/http'; import { check, sleep } from 'k6'; export let options = { vus: 100, duration: '5m' }; export default function () { let res = http.get(''); check(res, { 'status 200': (r) => r.status === 200 }); sleep(1); } (k6 — «100 VUs, 5 минут» — k6 — ёмкость); (2) Запуск (k6 — k6 run script.js (k6 — «k6 run» — k6 — ёмкость); (3) Метрики (метрики — RPS (load testing — «RPS» — load testing — ёмкость), latency (метрики — «p50/p95/p99» — метрики — load testing), error rate (метрики — «процент ошибок» — метрики — load testing); (4) Grafana (Grafana — «k6 + Grafana» — Grafana — метрики — дашборды (Grafana — «метрики load testing» — Grafana); (5) Результаты (load testing — RPS 500, p95 200 мс, error rate 0.1% (load testing — «API под нагрузкой» — load testing — ёмкость); (6) Выводы (load testing — «API справляется с нагрузкой» — load testing — ёмкость — релиз ок (deploy — «релиз ок» — deploy); результат: API под нагрузкой (load testing — «как API под нагрузкой» — load testing — ёмкость — метрики (метрики — RPS/latency/error rate (метрики — load testing — релиз ок (deploy — «релиз ок» — deploy); вывод: load testing решили задачу (API под нагрузкой проверено — load testing — ADR — «load testing без метрик» — антипаттерн — техдолг).
FAQ
k6 против JMeter — что выбрать? k6 (k6 — современный, JavaScript (k6 — «k6 — JS» — k6 — Grafana — «k6 + Grafana» — Grafana — простой API (k6 — «k6 проще JMeter» — k6 — техдолг); JMeter (JMeter — зрелый, GUI (JMeter — «JMeter — GUI» — JMeter — техдолг — сложный, но мощный (JMeter — «JMeter мощный» — JMeter — техдолг); когда k6: современный стек (k6 — «k6 — JS» — k6 — Grafana, простота (k6 — «k6 проще» — k6 — техдолг), когда JMeter: зрелость (JMeter — «JMeter зрелый» — JMeter — техдолг, GUI (JMeter — «JMeter GUI» — JMeter — техдолг); «k6 вместо JMeter» — ок (k6 современнее — k6 — ADR — техдолг).
Какие сценарии load testing бывают и когда какой использовать? Constant load (load testing — «постоянная нагрузка» — load testing — «100 RPS 5 минут» — load testing — ёмкость — когда: постоянная нагрузка (load testing — «постоянная» — load testing); Ramp-up (load testing — «нарастание» — load testing — «0 → 100 RPS за 1 минуту» — load testing — ёмкость — когда: рост нагрузки (load testing — «рост» — load testing); Spike (load testing — «пик» — load testing — «100 → 1000 RPS на 10 с» — load testing — stress testing — когда: пик (load testing — «пик» — stress testing); Soak (load testing — «длительная» — load testing — «100 RPS 1 час» — load testing — ёмкость — когда: длительная нагрузка (load testing — «длительная» — load testing — «утечки памяти» — ёмкость); «один сценарий для всего» — нет (разные цели — разные сценарии — load testing — ADR — техдолг).
Какие метрики измерять при load testing? RPS (load testing — «requests per second» — load testing — ёмкость — «сколько запросов в секунду» — load testing), latency (load testing — «p50/p95/p99» — load testing — метрики — «задержка» — load testing), error rate (load testing — «процент ошибок» — load testing — метрики — «ошибки под нагрузкой» — load testing), throughput (load testing — «пропускная способность» — load testing — ёмкость — «сколько данных в секунду» — load testing); зачем: RPS (load testing — «сколько запросов» — load testing — ёмкость), latency (load testing — «задержка» — load testing — метрики), error rate (load testing — «ошибки» — load testing — метрики), throughput (load testing — «пропускная способность» — load testing — ёмкость); «load testing без метрик» — антипаттерн (не знаем, что измерять — метрики — метрики обязательны — метрики — ADR — техдолг).
Когда load testing действительно нужен, а когда — оверхед? Нужен: перед релизом (load testing — «перед релизом» — load testing — deploy, изменение архитектуры (load testing — «архитектура изменилась» — load testing — микросервисы, валидация ёмкость (load testing — «ёмкость подтверждена» — load testing — ёмкость); Оверхед: прототип (load testing — «прототип — load testing оверхед» — load testing — техдолг, простые случаи (load testing — «load testing не нужен» — load testing — техдолг); «load testing для прототипа» — антипаттерн (оверхед — техдолг — «load testing только для прода» — load testing — ADR — техдолг).
Источники: k6 docs, JMeter docs, Grafana k6 docs — ссылки в шапке.