Материал проходит вычитку — возможны неточности.
Урок 29 из 118

Читаем профиль

Профили лежали на диске, и Миша открыл их в pprof. top и list показали горячие функции и строки, flame graph — картину целиком, а на heap нашлись два среза, которые легко перепутать.

Главная мысль

профиль читают в go tool pprof: top — функции по весу, list — время по строкам кода, flame graph — где программа проводит время целиком; у heap два среза — inusespace и allocspace.

CPU-профиль

$ go tool pprof cpu.prof

CPU-профиль отвечает на вопрос «где горит процессорное время». Это сэмплы с фиксированной частотой (по умолчанию 100 Гц): чем больше сэмплов попало в функцию, тем больше она ела CPU. Точное время не восстанавливается, но пропорции — надёжно. Ожиданий такой профиль не видит: горутина, заблокированная на мьютексе или канале, процессорное время не тратит — сколько горутины стоят в блокировках, показывают block- и mutex-профили.

Команды pprof

  • top — функции, отсортированные по удельному весу.
  • list <функция> — исходный код функции с процентом времени на каждой строке.
  • web — граф вызовов, требует graphviz.

Есть режим с веб-интерфейсом: go tool pprof -http=:8080 cpu.prof — граф, список и flame graph, где по оси X — стек вызовов, по ширине — доля времени. Flame graph — самый быстрый способ увидеть, где программа реально проводит время.

Два среза heap

Heap-профиль отвечает «что занимает память», и у него два среза, которые легко перепутать:

  • inuse_space (по умолчанию) — память живых объектов прямо сейчас. Отвечает на вопрос про раздувшуюся кучу.
  • alloc_space — суммарный объём всех аллокаций за время жизни, включая собранные. Отвечает на вопрос про аллокационную мельницу: функция может выделять терабайты и сразу отпускать, inuse_space этого не покажет, а alloc_space покажет.

Переключаются они флагом -sample_index=alloc_space. Для поиска GC-давления чаще нужен именно alloc_space.

Heap-профиль сэмплируется: по умолчанию одна запись на каждые 512 КБ выделений (MemProfileRate). Поэтому числа inuse_space и alloc_space — статистические оценки пропорций, а не точный учёт каждой аллокации: срезы показывают лидеров, а не бухгалтерию.

В следующем уроке

Вы узнаете:

  • как сэмплы 100 Гц работают
  • как -diff_base сравнивает профили «до» и «после»
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Что показывают top и list в go tool pprof?

Вопрос 2 из 3

Чем inuse_space отличается от alloc_space в heap-профиле?

Вопрос 3 из 3

Видит ли CPU-профиль заблокированную на канале горутину?

Итоги

top — кто больше всех; list — какая строка; flame graph — общая картина. Heap: inuse — что сейчас живо, alloc — что аллоцировалось всего; числа — оценки по сэмплам, а не точный учёт.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки