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

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

Классификация и исправление: сопоставление family bottleneck с методами

Суть Каждый bottleneck принадлежит одной из восьми family. Назвать family — 30 секунд по профилю; выбрать неправильную — потерять дни. Амдал устанавливает потолок любого исправления до написания строки кода.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 12 min

Два инженера смотрят на один и тот же flame graph. Один видит “GC горячий” и переписывает аллокатор. Другой видит “GC горячий из-за объёмного upstream-payload” и откатывает один деплой. Первый тратит неделю; второй — 35 минут. Разница — в классификации: назвать family bottleneck до прикосновения к коду.

Восемь family bottleneck

Семь фрагментов этой главы отображаются на небольшой словарь family bottleneck. Если правильно классифицировать hotspot, набор исправлений следует немедленно.

FamilyСигнал в профилеФрагмент главыОсновное исправление
CPU-algorithmicВысокий self-time, низкий off-CPU02 hot-pathsЛучший алгоритм или структура данных
Allocation-boundmallocgc / scanobject высокие04 GCСнизить аллокации, переиспользование, пулы
Cache-boundВысокие LLC-miss perf counters03 cache-vs-bigoСтруктура данных, паттерн доступа
Lock-boundВысокий off-CPU на sync wait02 hot-pathsLock-free структуры, шардирование
I/O-bound (N+1)Много коротких span в трейсе05 N+1Batch-запросы, eager-load
Syscall-boundВысокий syscall overhead в профиле06 batchingBatch-запись, vectorised I/O
JIT-deoptDeopt-фреймы в JS/JVM профиле02 hot-pathsMonomorfные формы, typed arrays
Bundle-boundRUM показывает parse/compile time07 bundle-budgetsCode-split, lazy-load, tree-shake

Амдал до написания кода

Закон Амдала: если доля f времени выполнения приходится на hotspot, максимальное ускорение от его устранения — 1 / (1 - f).

Если hotspot — 40% CPU (f = 0,4), максимально возможное ускорение — 1 / 0,6 = 1,67x. Если SLO требует 3x улучшения, это не тот hotspot. Вернитесь к шагу 2 и снова профилируйте.

Этот расчёт занимает 30 секунд. Он предотвращает недели работы над неправильной целью.

Пример: Сервис checkout имеет p99 = 800 мс и цель менее 200 мс. Профиль показывает:

  • json.Marshal: 28% CPU
  • runtime.scanobject: 22% CPU
  • pgx.Query: 18% CPU (через trace spans — фактически I/O)

Амдал только по Marshal: 1 / (1 - 0,28) = 1,39x. Это снижает 800 мс до ~575 мс — всё ещё выше цели. Амдал по Marshal + scanobject вместе (50%): 1 / 0,5 = 2x. Это даёт ~400 мс — всё ещё выше цели. Добавляя I/O-путь (68% всего): 1 / 0,32 = 3,1x. Это даёт ~258 мс — близко.

Настоящая первопричина: все три горячих фрейма разделяют один upstream, который вдруг начал возвращать в 10 раз больше данных. Устранить upstream — и все три фрейма уменьшатся вместе. Общий выигрыш: 6x. Расчёт по Амдалу наглядно показал, что исправление любой одной family по отдельности было недостаточным.

Кросс-слойное компаундирование

Реальные bottleneck редко сидят в одном слое. Медленная checkout-страница может состоять из 30% parse JS-бандла на клиенте, 20% N+1-запросов в бэкенде, 15% GC allocation pressure и 35% compute бэкенда. Исправление любого одного слоя изолированно даёт только Amdahl-ограниченный выигрыш на итоговой метрике.

Составной эффект — настоящий выигрыш. Два инженера, работающих параллельно — один над бандлом, другой над запросами и GC — каждый добивается 2x улучшения, дают совокупный 4x по headline-метрике. Без кросс-слойного мышления разговор стопорится: “мы уже оптимизировали свою часть.”

Словарь классификации family из главы позволяет инженерам по frontend, backend и infra описывать свой bottleneck так, чтобы другие слои понимали. Без общего словаря весь разговор сводится к “бэкенд медленный” — “нет, фронтенд медленный”.

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

Таблица fix-family выше не является рейтингом. Cache-bound bottleneck в плотных вычислительных циклах (фрагмент 03) могут давать 10x улучшения на CPU-нагрузках. Allocation-bound регрессии (фрагмент 04) часто самые коварные, потому что паузы GC добавляют tail-latency дисперсию, которую Амдал недооценивает. При классификации проверяйте, влияет ли bottleneck на p50 (средний пользователь) или p99 (худший случай); приоритет исправления отличается.

Классификация окупается
Время классификации по flame graph
30–90 секунд
Потери времени при исправлении неправильной family
1–5 дней
Потолок Амдала, если bottleneck — 25% CPU
максимум 1,33x
Потолок Амдала, если bottleneck — 80% CPU
максимум 5x
Типичный мульти-family составной выигрыш
4–8x
Типичный выигрыш от однофамильного исправления
1,3–2,5x
Викторина

Сервис allocation-bound (GC pressure 25%) И имеет бандл 800 КБ. Что исправлять первым?

Викторина

Flame graph показывает runtime.scanobject на 22% и runtime.mallocgc на 11%. Амдал для совокупных GC-фреймов даёт максимум 1,47x ускорения. SLO требует 3x. Какой следующий правильный шаг?

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

Упорядочите шаги классификации и исправления bottleneck от профиля до верифицированного результата:

  1. 1 Открыть профиль — определить горячий фрейм по self-time
  2. 2 Назвать family: CPU, аллокация, кеш, lock, I/O, syscall, JIT, бандл
  3. 3 Применить Амдал: может ли исправление этой family достичь цели SLO?
  4. 4 Если потолок Амдала недостаточен — вернуться к профилю, найти дополнительные источники
  5. 5 Выбрать технику исправления из playbook family
  6. 6 Повторно профилировать под той же нагрузкой; подтвердить улучшение локального фрейма и headline-метрики
Вспомните перед уходом
  1. 01
    Почему важно называть family bottleneck до написания исправления?
  2. 02
    Сервис checkout имеет три горячих family: аллокация 28%, I/O 22%, CPU-algorithmic 18%. Что говорит Амдал о каждом из них и что это означает?
  3. 03
    Что такое кросс-слойное компаундирование и как общий словарь классификации его обеспечивает?
Итог

Каждый bottleneck принадлежит одной из восьми family: CPU-algorithmic, allocation, cache, lock, I/O (N+1), syscall (batching), JIT-deopt или bundle. Назвать family по профилю занимает менее двух минут; это немедленно направляет к правильному playbook исправлений. Закон Амдала — максимальное ускорение равно 1, делённому на (1 минус доля hotspot) — устанавливает жёсткий потолок для любого единственного исправления до написания строки кода. Если потолок Амдала ниже цели SLO, этого hotspot недостаточно для самостоятельного исправления; вернитесь к профилю и найдите дополнительные источники. Реальные production-bottleneck обычно охватывают несколько слоёв; составной выигрыш от параллельного исправления двух-трёх family в четыре-восемь раз больше, чем от исправления любой одной family по отдельности. Общий словарь family позволяет инженерам frontend, backend и infra описывать и количественно оценивать вклад своего слоя для координации параллельной работы.

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

Trademarks belong to their respective owners. Editorial reference only.