Где магазин ломается, когда посетители приходят покупать, а не смотреть?
Интернет-магазин в Чёрную пятницу
Держит ~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 % плана · здоровье генераторов не подтверждено
Синтетическая нагрузка снаружи; реальный трафик и метрики ваших серверов сюда не входят.
Что делать дальше
- Подтвердите нагрузочным тестом на ~24 запр./с.
- Чтобы проверить Выбор доставки, Оформление заказа, Начало оплаты и ещё 3, нужен прогон не короче 4,7 мин на этой скорости: у них меньше 100 замеров.
Большой каталог под визитом дня распродажи при постоянной скорости: меньше просмотров, больше корзин и заказов на визит. Это модель состава визита, а не всплеска трафика в день распродажи.
Пример: настоящий прогон CapacityLab против магазина, который мы держим сами
Как проводился тест
Где лежит предел
Каждая точка — скорость, на которой магазин держали не меньше полутора минут. Она пройдена, если каждый шаг визита с достаточной выборкой держит p95 в границе задержки и ошибок меньше 1%; редкий шаг оформления с малой выборкой на этой скорости показан как отсутствующий, а не как пройденный.
- Выдержал 30 мин24,5 запр./с
- Выдержал 60 мин24,5 запр./с
- Выдержал 180 мин24,5 запр./с
- Выдержал 720 мин24,5 запр./с
- Замедлился первым
- Поиск
- Граница задержки
- p95 ≤ 1,5 с
План против факта
Поиск поднимается по лестнице скоростей. На каждой ступени генераторы подавали запланированную скорость; столбики — сколько магазин на самом деле ответил, и его p95 на этой ступени.
| План | Факт | p95 | Ошибки | Итог |
|---|---|---|---|---|
| 30,3 | 29,9 | 750 мс | 0,5% | Выдержал |
| 35,3 | 35 | 750 мс | 0,65% | Сломался |
| 41,2 | 40 | 750 мс | 0,75% | Сломался |
| 48 | 47,2 | 750 мс | 0,93% | Сломался |
- Выбор доставки: 1,18% запросов с ошибкой при допустимых 1%.
- Категории: 1,39% запросов с ошибкой при допустимых 1%.
- Поиск: 1,84% запросов с ошибкой при допустимых 1%.
- Поиск: 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 мс
Держит ли дольше
Поиск предела находит его за минуты. Длинные прогоны ниже предела показывают, держит ли магазин дальше: утечки, очереди и холодные кэши проявляются не сразу.
- Найти пределПредел найден — предварительноДержит ~30 запр./с на коротких ступенях (2,1 мин), не выдерживает ~35 запр./с2 окт. 2026 г., 16:05 UTC
- Держать 30 минВыдержал24,6 запр./с, p95 500 мс, ошибки 0%30 сент. 2026 г., 18:45 UTC
- Держать 1 чВыдержал24,4 запр./с, p95 500 мс, ошибки 0,01%30 сент. 2026 г., 19:17 UTC
- Держать 3 чВыдержал24,5 запр./с, p95 500 мс, ошибки 0%30 сент. 2026 г., 20:19 UTC
- Держать 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 запросов закончились ошибкой сервера.
Что делать дальше
- Подтвердить до планов
Запустить нагрузочный тест на 24,2 запр./с на 30 минут: поиск советует подтвердить эту скорость следующей, и только подтверждение покажет, держит ли каждый шаг свою границу.
- Смотреть на свою сторону во время прогона
Держите открытыми свои дашборды. Отчёт говорит, какой шаг замедлился; ваши метрики — почему.
- Изменить одно и сравнить
После изменения повторите тот же тест и положите два отчёта рядом.
Своя копия этого отчёта — через одну регистрацию
Зарегистрируйтесь по почте. Новый аккаунт откроется с этим и остальными демо-отчётами внутри, чтобы сравнить их со своим первым прогоном.
Откуда эти цифры
Экспортировано из опубликованных отчётов этих прогонов. CPU и память магазина — из метрик Railway, число ошибок — из его собственного журнала доступа.
Идентификаторы и контрольные суммы
| Прогон | Digest результата | Посчитан |
|---|---|---|
2f2bc0b7-b0c8-49a3-82d4-1c138209e73b | sha256:386667c70d9ca0840cdee6aeb1acd1a6c07e3922ec9adb555910568ba8dfd39e | 2 окт. 2026 г., 16:25 UTC |
4d174fec-5654-4ade-a097-f56b69567486 | sha256:b67c3b95dc3c4ae89398b1c4910ae7c7fb08ee5904f5e7ba37df34630432e2c4 | 30 сент. 2026 г., 19:16 UTC |
0eacc785-d9b2-4233-971f-e7e55af25f05 | sha256:860d8d217e03cc4923877b350f95fbd864151bbb07a460e7b05b0d040db2385b | 30 сент. 2026 г., 20:18 UTC |
843bd07c-9dc7-4e21-b0e2-5e3e983ade22 | sha256:3bc313613e1fa767f8632d5143cacee30d4958ffde2585f3dc41db8f5700425b | 30 сент. 2026 г., 23:20 UTC |
172d3b8d-a7de-423e-987a-ffd27b0dd14b | sha256:f85696037294e3e70e8e607c4ee8298c4b8b648ae8881a53da7bf4501642e83f | 1 окт. 2026 г., 11:37 UTC |