Программа курса

Модуль 04 / Урок 16 из 27

Чтение трейса: waterfall и flame graph

Теория и практика

Открыть трейс — полдела; извлечь из него диагноз — навык. Разбираем оба представления и типовые паттерны, которые видны в них мгновенно.

Waterfall (Gantt)

Вид по умолчанию: горизонтальная шкала времени, каждый спан — полоса от старта до конца. Что читать:

  • Глубина вложенности = дерево вызовов; ширина = длительность;
  • «Пустые места» между полосами — время, когда ваш сервис ничего не делал, а просто ждал: сеть, очередь, чужую систему;
  • Наложение полос на одном уровне — параллельные вызовы (fan-out);
  • Красные полосы — спаны со статусом ERROR;
  • Клик по спану — атрибуты, события, ссылки; это «открыть дело» конкретного шага.

Типовые паттерны waterfall

КартинаДиагноз
Один глубокий спан ≈ 80% трейсаузкое место — тот вызов: БД, чужой API
Серия одинаковых последовательных спанов (10 × SELECT)N+1 запрос — классика; нужен батч/join
Промежуток в корневом спане, не занятый детьмилокальная работа: сериализация, вычисления, GC-пауза, лок
Много параллельных узких полосfan-out работает; проверьте общий бюджет
Хвостовой тонкий спан в конце трейсачасто что-то «на выходе»: запись аудита, метрика, очистка

Flame graph

Переключение вида показывает свернутое дерево: ширина сегмента — доля времени, глубина — стек вызовов. Полезен, когда waterfall слишком длинный (сотни спанов):

  • сразу видно, какой «поддерево» съедает время;
  • одинаковые повторяющиеся ветки (N+1) сливаются в заметный блок;
  • отлично для докладов/скриншотов: «вот 60% запроса уходит сюда».
💡 Совет: waterfall — для понимания последовательности и ожиданий, flame graph — для пропорций. Для инцидента откройте оба: первый отвечает «что после чего», второй — «что главное».

Время и масштаб

  • Проверяйте общую длительность трейса (в шапке) — сверяйте с метрикой endpoint'а: расхождение говорит о выборке не того запроса;
  • Смотрите на start-time детей: вызовы, начавшиеся сильно позже родителя, намекают на очередь внутри приложения;
  • Спаны с нулевой длительностью — события-маркеры (например, публикация в шину): не тратят время, но фиксируют момент.

Практика

  1. Создайте в тестовом сервисе N+1: цикл из 10 запросов к БД вместо одного батча — найдите паттерн «10 одинаковых спанов» в waterfall и во flame graph.
  2. Добавьте time.sleep(0.5) вне любого дочернего вызова — найдите «пустой промежуток» в корневом спане.
  3. Сделайте параллельный fan-out (2-3 конкурентных запроса) — сравните общее время трейса с последовательным вариантом.
  4. Откройте самый длинный трейс вашего реального приложения и опишите письменно: где критичный путь, что бы вы оптимизировали первым.
Мини-квиз

1. 12 одинаковых последовательных SELECT в трейсе — что это почти наверняка? — N+1: цикл запросов; лечится батчем.

2. Когда flame graph полезнее waterfall? — При сотнях спанов и вопросе «какое поддерево доминирует».

3. Промежуток в родителе без детей — что это? — Время работы самого сервиса: сериализация, вычисления, блокировки.