awesome-everything EN
↑ Обратно к восхождению

Производительность

Цикл performance: дисциплина, а не проект

Суть Performance деградирует по умолчанию. Восьмишаговый цикл — observe, profile, classify, predict, fix, verify, enforce, repeat — это дисциплина, удерживающая сервис быстрым год за годом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 10 min

Команда исправила p99 с 1,2 с до 200 мс. Они объявили задачу завершённой, выпустили релиз и занялись другим. Через шесть месяцев p99 снова 900 мс. Не одна регрессия — просто новые фичи, новые библиотеки, больший JSON-ответ от upstream-сервиса. Исправление было правильным. Не хватало дисциплины.

Почему performance деградирует по умолчанию

Каждая новая фича добавляет байты, запросы или аллокации. Каждое обновление зависимостей привносит новые code path. Каждое изменение схемы может превратить быстрый запрос в медленный. Без механизма для обнаружения этих добавлений performance непрерывно деградирует.

Разовая оптимизация имеет эффективный период полураспада три-шесть месяцев. После этого окна накопленные изменения от новых фич отменяют улучшения. Команды, которые воспринимают performance как проект, добиваются результата — и постепенно откатываются назад. Команды, которые воспринимают его как дисциплину, удерживают результат.

Разница — в одном механизме: цикле.

Восьмишаговый цикл performance

Каждое расследование производительности, независимо от слоя, следует одной структуре:

  1. Observe — появляется симптом: SLO burn, RUM-регрессия, жалоба пользователя, алерт на дашборде. Это говорит о том, что что-то не так, но не что именно.
  2. Profile — захватить данные, подходящие к симптому. Flame graph по CPU для CPU-спайков, allocation profile для роста памяти, network waterfall для медленных загрузок страниц, bundle analyzer для client-side раздутости.
  3. Classify — назвать bottleneck по family: CPU-algorithmic, allocation-bound, cache-bound, lock-bound, I/O-bound (N+1), syscall-bound (batching), JIT-deopt, bundle-bound. Каждая family имеет известный набор исправлений.
  4. Predict — использовать закон Амдала для оценки улучшения headline-метрики при устранении этого hotspot. Если прогноз ниже целевого SLO, это не тот hotspot — вернитесь к шагу 2.
  5. Fix — из playbook family выбрать технику, соответствующую конкретной форме hotspot. Применить только предсказанное изменение; никакого scope creep.
  6. Verify — повторно профилировать под той же нагрузкой. Подтвердить, что и локальный hotspot уменьшился, И headline-метрика улучшилась.
  7. Enforce — добавить CI gate, алерт или запись в runbook, предотвращающую возврат именно этой регрессии.
  8. Move on — найти следующий bottleneck. Цикл никогда не заканчивается; он перемещается между слоями.
ШагДействиеРезультат служит входом для
1. ObserveЗаметить симптомКакой сервис / метрику профилировать
2. ProfileЗахватить правильный поток данныхИмя горячей функции / span
3. ClassifyНазвать family bottleneckPlaybook для исправлений
4. PredictОценка по АмдалуРешение работать с этим hotspot или нет
5. FixПрименить подходящую техникуИзменённый код / конфиг
6. VerifyПовторно профилировать под той же нагрузкойПодтверждение или откат
7. EnforceCI gate / алерт / runbookДеплой, защищённый от регрессий
8. Move onНайти следующий bottleneckСледующая итерация шага 1

Метафора с кухней

Performance похожа на уборку кухни, а не на покраску комнаты. Покрасить один раз — достаточно. Кухня, убранная однажды, снова загрязняется по мере приготовления еды; её убирают непрерывно.

Каждый из семи фрагментов этой главы — инструмент: профилировщик, классификатор горячих путей, средство исправления GC, детектор N+1, бэтчер, анализатор бандла. Ни один не удержит кухню чистой сам по себе; это делает цикл.

Почему это работает

Команды без цикла получают совещания “почему сайт снова медленный?” каждые шесть месяцев, каждое из которых потребляет 5–20 инженерных дней. Команды с циклом поддерживают стабильные метрики год за годом. Разница в общих инженерных затратах невелика — дисциплина просто переносит инвестиции с пожаротушения на CI gates и observability.

Квартал Беа и Свена

Беа приходит в команду, где год назад сервис был быстрым. Теперь p99 — 1,2 с вместо 200 мс. Свен объясняет ей цикл: профиль показывает GC pressure на 18%, N+1 в /orders добавляет 50 запросов на запрос, бандл /dashboard вырос на 800 КБ за шесть месяцев. Никакого единственного кризиса — три отдельных медленных накопления.

Они запускают цикл для каждого bottleneck поочерёдно: исправление аллокации логгера (неделя 1), дедупликация запросов (недели 2–3), code-split бандла (неделя 4). Через месяц p99 — 280 мс. CI gates удерживают работу живой в следующем квартале при поставке фич.

Викторина

Команда применила исправление производительности и выпустила релиз. Через шесть месяцев производительность хуже, чем до исправления. Наиболее вероятная причина?

Расставь шаги по порядку

Упорядочите восемь шагов цикла performance, которые senior-инженер выполняет каждый раз:

  1. 1 Заметить симптом — SLO burn, RUM-регрессия, алерт профиля
  2. 2 Открыть профиль — определить горячий путь с конкретными числами
  3. 3 Классифицировать hotspot: CPU, аллокация, кеш, lock, I/O, syscall, JIT, бандл
  4. 4 Спрогнозировать влияние на headline-метрику по закону Амдала
  5. 5 Применить только предсказанное изменение; никакого scope creep
  6. 6 Повторно профилировать под той же нагрузкой; подтвердить улучшение и локального фрейма, и headline-метрики
  7. 7 Добавить CI gate или алерт, чтобы регрессия не могла вернуться незаметно
  8. 8 Задокументировать и перейти к следующему bottleneck
Закончи аналогию

Заполните пропуск: performance — это _______ кодовой базы, измеряемая непрерывно, применяемая при каждом коммите, принадлежащая каждому инженеру.

Викторина

Что значит воспринимать performance как 'цикл', а не как 'проект'?

Вспомните перед уходом
  1. 01
    Почему разовое исправление производительности имеет период полураспада три-шесть месяцев?
  2. 02
    Какова роль шага 'enforce', и почему он самый важный из восьми?
  3. 03
    В сценарии Беа и Свена три отдельных bottleneck накапливались шесть месяцев. Что помешало команде заметить каждый из них по мере появления?
Итог

Performance деградирует по умолчанию. Каждая новая фича, зависимость и деплой добавляют байты, запросы или аллокации незаметно. Разовая оптимизация имеет период полураспада три-шесть месяцев до того, как накопленные изменения отменят улучшения. Цикл performance — observe, profile, classify, predict, fix, verify, enforce, repeat — превращает разовое исправление в устойчивое свойство. Критический шаг — enforcement: CI gates, которые не пропускают PR, вводящие тот же класс регрессии. Команды без цикла получают кризис производительности каждые шесть–восемнадцать месяцев и перестраивают всё с нуля; команды с ним поддерживают стабильные метрики год за годом при затратах пяти–десяти процентов инженерного времени против двадцати–сорока процентов в кризисном режиме.

Связанные уроки
встречается в260
Продолжить восхождение ↑Классификация и исправление: сопоставление family bottleneck с методами
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.