Где магазин ломается, когда посетители приходят покупать, а не смотреть?

Интернет-магазин в Чёрную пятницу

Предел найден — предварительно

Держит ~30 запр./с на коротких ступенях (2,1 мин), не выдерживает ~35 запр./с

Не прошли проверки: Выбор доставки: ошибок 1,2 % > 1 %, Категории: ошибок 1,4 % > 1 %, Поиск: ошибок 1,8 % > 1 %.

Держит
~30запр./с
измерено за 2,1 мин
Не выдерживает
~35запр./с
по SLO

Проверено 6 из 12 шагов на этой скорости; 6 не проверены — мало замеров (< 100 в окне)

  • Выбор доставки
  • Оформление заказа
  • Начало оплаты
  • Платёжная сессия
  • Способы доставки
  • Адрес доставки

ступени по 2,1–7 мин · проверки: 149 прошли, 5 не прошли, 6 — мало данных, 0 не выполнялись · подано 99 % плана · здоровье генераторов не подтверждено

Синтетическая нагрузка снаружи; реальный трафик и метрики ваших серверов сюда не входят.

Что делать дальше

  1. Подтвердите нагрузочным тестом на ~24 запр./с.
  2. Чтобы проверить Выбор доставки, Оформление заказа, Начало оплаты и ещё 3, нужен прогон не короче 4,7 мин на этой скорости: у них меньше 100 замеров.

Большой каталог под визитом дня распродажи при постоянной скорости: меньше просмотров, больше корзин и заказов на визит. Это модель состава визита, а не всплеска трафика в день распродажи.

Пример: настоящий прогон CapacityLab против магазина, который мы держим сами

Как проводился тест

Где лежит предел

Каждая точка — скорость, на которой магазин держали не меньше полутора минут. Она пройдена, если каждый шаг визита с достаточной выборкой держит p95 в границе задержки и ошибок меньше 1%; редкий шаг оформления с малой выборкой на этой скорости показан как отсутствующий, а не как пройденный.

Держит30,3 запр./сЛомается к35,3 запр./сПредел лежит между ними
  • Выдержал 30 мин24,5 запр./с
  • Выдержал 60 мин24,5 запр./с
  • Выдержал 180 мин24,5 запр./с
  • Выдержал 720 мин24,5 запр./с
Замедлился первым
Поиск
Граница задержки
p95 ≤ 1,5 с

План против факта

Поиск поднимается по лестнице скоростей. На каждой ступени генераторы подавали запланированную скорость; столбики — сколько магазин на самом деле ответил, и его p95 на этой ступени.

020406001 s2 sp95 ≤ 1,5 с для каждого шага30,335,341,248План, запр./с
ПланФактp95 (правая шкала)
ПланФактp95ОшибкиИтог
30,329,9750 мс0,5%Выдержал
35,335750 мс0,65%Сломался
41,240750 мс0,75%Сломался
4847,2750 мс0,93%Сломался
Почему 35,3 запр./с не выдержал
  • Выбор доставки: 1,18% запросов с ошибкой при допустимых 1%.
  • Категории: 1,39% запросов с ошибкой при допустимых 1%.
  • Поиск: 1,84% запросов с ошибкой при допустимых 1%.
Почему 41,2 запр./с не выдержал
  • Поиск: 2,87% запросов с ошибкой при допустимых 1%.

Какой шаг замедлился первым

p95 каждого шага визита на каждой скорости против границы. Шаг, который Result называет ограничивающим, отмечен.

Какой шаг замедлился первым
Шаг визитаДоля30,3 запр./с35,3 запр./с41,2 запр./с
Регион магазинаGET /store/regions
3,9%
75 мс0,7% ошибок
100 мс
100 мс0,6% ошибок
КатегорииGET /store/product-categories
8,6%
100 мс0,6% ошибок
75 мс1,4% ошибок
100 мс0,5% ошибок
КаталогGET /store/products
24%
100 мс0,7% ошибок
100 мс0,3% ошибок
100 мс0,4% ошибок
ПоискОграничиваетGET /store/products
12%
750 мс0,9% ошибок
750 мс1,8% ошибок
750 мс2,9% ошибок
Карточка товараGET /store/products/{product_id}
37%
100 мс0,3% ошибок
100 мс0,5% ошибок
100 мс0,6% ошибок
Добавить в корзинуPOST /store/carts
3,9%
500 мс0,7% ошибок
500 мс
500 мс
Адрес доставкиPOST /store/carts/{cart_id}
2,2%
—
1 000 мс0,6% ошибок
750 мс0,7% ошибок
Способы доставкиGET /store/shipping-options
2,2%
—
300 мс
300 мс
Выбор доставкиPOST /store/carts/{cart_id}/shipping-methods
2,2%
—
1 500 мс1,2% ошибок
1 000 мс0,4% ошибок
Начало оплатыPOST /store/payment-collections
1,2%
—
300 мс
300 мс0,7% ошибок
Платёжная сессияPOST /store/payment-collections/{payment_collection_id}/payment-sessions
1,2%
—
200 мс
200 мс
Оформление заказаPOST /store/carts/{cart_id}/complete
1,2%
—
1 000 мс
1 000 мс

p95, SLO ≤ 1 500 мс

Держит ли дольше

Поиск предела находит его за минуты. Длинные прогоны ниже предела показывают, держит ли магазин дальше: утечки, очереди и холодные кэши проявляются не сразу.

  1. Найти пределПредел найден — предварительноДержит ~30 запр./с на коротких ступенях (2,1 мин), не выдерживает ~35 запр./с2 окт. 2026 г., 16:05 UTC
  2. Держать 30 минВыдержал24,6 запр./с, p95 500 мс, ошибки 0%30 сент. 2026 г., 18:45 UTC
  3. Держать 1 чВыдержал24,4 запр./с, p95 500 мс, ошибки 0,01%30 сент. 2026 г., 19:17 UTC
  4. Держать 3 чВыдержал24,5 запр./с, p95 500 мс, ошибки 0%30 сент. 2026 г., 20:19 UTC
  5. Держать 12 чВыдержал24,5 запр./с, p95 500 мс, ошибки 0,04%30 сент. 2026 г., 23:34 UTC

Что мы видели на своих серверах

Этого в отчёте нет: магазин наш, поэтому мы видим метрики его хостинга. У своего приложения вы смотрите свои дашборды; CapacityLab измеряет снаружи.

  • Приложение (Node.js)1,28 vCPUПик памяти 678 MB
  • База данных (PostgreSQL)11 vCPUПик памяти 5 328 MB
  • Кэш (Redis)0,02 vCPUПик памяти 28 MB

Сильнее была нагружена база данных: её CPU доходил до 11 vCPU, а приложение оставалось на 1,28. CPU базы не был ограничен, поэтому это показывает, куда ушла работа, а не что база исчерпала ресурс; поиск по такому каталогу — работа базы и вероятное место очереди, но блокировки и планы запросов не измерялись.

188 из 47 592 запросов закончились ошибкой сервера.

Что делать дальше

  1. Подтвердить до планов

    Запустить нагрузочный тест на 24,2 запр./с на 30 минут: поиск советует подтвердить эту скорость следующей, и только подтверждение покажет, держит ли каждый шаг свою границу.

  2. Смотреть на свою сторону во время прогона

    Держите открытыми свои дашборды. Отчёт говорит, какой шаг замедлился; ваши метрики — почему.

  3. Изменить одно и сравнить

    После изменения повторите тот же тест и положите два отчёта рядом.

Своя копия этого отчёта — через одну регистрацию

Зарегистрируйтесь по почте. Новый аккаунт откроется с этим и остальными демо-отчётами внутри, чтобы сравнить их со своим первым прогоном.

Открыть этот отчёт в своём аккаунте Регистрация бесплатная. Отчёт уже будет в новом аккаунте, а на первый собственный прогон — $5 кредитов.

Откуда эти цифры

Экспортировано из опубликованных отчётов этих прогонов. CPU и память магазина — из метрик Railway, число ошибок — из его собственного журнала доступа.

Идентификаторы и контрольные суммы
ПрогонDigest результатаПосчитан
2f2bc0b7-b0c8-49a3-82d4-1c138209e73bsha256:386667c70d9ca0840cdee6aeb1acd1a6c07e3922ec9adb555910568ba8dfd39e2 окт. 2026 г., 16:25 UTC
4d174fec-5654-4ade-a097-f56b69567486sha256:b67c3b95dc3c4ae89398b1c4910ae7c7fb08ee5904f5e7ba37df34630432e2c430 сент. 2026 г., 19:16 UTC
0eacc785-d9b2-4233-971f-e7e55af25f05sha256:860d8d217e03cc4923877b350f95fbd864151bbb07a460e7b05b0d040db2385b30 сент. 2026 г., 20:18 UTC
843bd07c-9dc7-4e21-b0e2-5e3e983ade22sha256:3bc313613e1fa767f8632d5143cacee30d4958ffde2585f3dc41db8f5700425b30 сент. 2026 г., 23:20 UTC
172d3b8d-a7de-423e-987a-ffd27b0dd14bsha256:f85696037294e3e70e8e607c4ee8298c4b8b648ae8881a53da7bf4501642e83f1 окт. 2026 г., 11:37 UTC