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

Наблюдаемость

Profiling: чтение профилей и конфигов

Суть Читай реальный вывод pprof, схлопнутый flame graph, allocation profile и конфиг профайлера — предскажи поведение и выбери диагноз с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Профили и конфиги — это место, где проблемы профайлинга реально диагностируются. Прочитай вывод и настройку, затем выбери прочтение, на котором остановится senior-инженер, прежде чем трогать что-либо ещё.

Цель

Отработай петлю, которую запускаешь в каждом инциденте профайлинга: читаешь профиль или конфиг, выводишь, что делает рантайм, и приходишь к верному диагнозу, а не к правдоподобному-но-неверному.

Сниппет 1 — схлопнутый список стеков flame graph

Многие инструменты (stackcollapse Брендана Грегга, импорт в speedscope) представляют flame graph как строки stack;frames count. Вот верхние строки 30-секундного CPU-профиля HTTP-сервиса:

main;http.Serve;handler;serializeResponse;json.Marshal       2180
main;http.Serve;handler;serializeResponse;reflect.Value.Field  640
main;http.Serve;handler;queryDB;pq.(*conn).Query              210
main;http.Serve;handler;validateInput                          95
Викторина

Всего сэмплов ~3125. Что говорит этот CPU-профиль и где фикс?

Сниппет 2 — CPU против wall-clock для одного медленного спана

trace span: GET /report  wall = 612 ms
  cpu profile (this span, by trace-id):  on-CPU = 38 ms
  off-cpu profile (this span):           waiting = 561 ms
    -> sql.(*DB).QueryContext            540 ms
    -> sync.(*Mutex).Lock                 18 ms
Викторина

Читая эти два профиля вместе, какой верный диагноз и следующий шаг?

Сниппет 3 — diff allocation (heap) профиля

go tool pprof -base baseline.heap current.heap   (45 min apart, same load)
  flat  flat%   cum   cum%
  410MB 61.2%  410MB 61.2%  (*logEntry).format  -> strings.Join in hot log path
   95MB 14.1%   95MB 14.1%  json.Marshal
   42MB  6.3%   42MB  6.3%  bytes.growSlice
Викторина

Это base-diff heap-профиля под стабильной нагрузкой. На что это вероятнее всего указывает и какой фикс с наибольшим рычагом?

Сниппет 4 — конфиг агента continuous profiler

profiler:
  cpu:
    enabled: true
    sample_rate_hz: 1000        # default for this service is 100
  symbolize: synchronous        # resolve symbols on the sampling thread
  max_stack_depth: 256
  upload_interval: 1s
Викторина

Команда сообщает, что этот агент добавляет ~12% CPU вместо ожидаемых 2-5%. Читая конфиг, какие две правки вернут его в бюджет?

Итог

Каждый инцидент профайлинга читается в профилях и конфигах: доминирующее поддерево CPU flame graph (здесь — JSON через reflection) — это on-CPU hotspot; отношение CPU/wall решает, гнаться ли за on-CPU кодом или off-CPU ожиданием; base-diff heap-профиля под стабильной нагрузкой локализует утечку до функции, чья живая память выросла; а агент сверх бюджета — почти всегда завышенный sample rate плюс синхронная символизация в потоке. Диагностируй по профилю, чини доминирующую причину, затем перепрофилируй для подтверждения.

Продолжить восхождение ↑Profiling: от SLO до flame graph
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.