Читаем профиль
Профили лежали на диске, и Миша открыл их в 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сравнивает профили «до» и «после»
Проверьте себя
Что показывают top и list в go tool pprof?
Чем inuse_space отличается от alloc_space в heap-профиле?
Видит ли CPU-профиль заблокированную на канале горутину?
правильных ответов
top — кто больше всех; list — какая строка; flame graph — общая картина. Heap: inuse — что сейчас живо, alloc — что аллоцировалось всего; числа — оценки по сэмплам, а не точный учёт.
10 000 ₽ · 60 минут · онлайн