Как запустить профилировщик в Go
Что проверяют
Работали ли вы с pprof на практике или знаете о нём по статьям. Важно, что вы различаете способы запуска и типы профилей. Следом обычно дают вывод top и просят найти проблему или спрашивают, как профилировать сервис в проде.
Как отвечать
Способов три, каждый для своей ситуации:
- бенчмарки:
go test -bench=. -cpuprofile cpu.out -memprofile mem.out. Самый воспроизводимый вариант для отдельной функции; runtime/pprof:pprof.StartCPUProfile(f)иdefer pprof.StopCPUProfile()для утилит и пакетных задач,pprof.WriteHeapProfile(f)для памяти;net/http/pprof: пустой импорт регистрирует обработчики/debug/pprof/вhttp.DefaultServeMux. Со своим роутером их подключают вручную и держат на внутреннем порту, напримерlocalhost:6060.
Анализ: go tool pprof -http=:8080 cpu.out открывает веб-интерфейс с графом вызовов и flame graph, в консоли помогают top и list. С сервиса CPU-профиль снимают командой go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30.
Типы профилей:
- heap: по умолчанию живая память (
inuse_space), лишние аллокации ищут через-sample_index=alloc_space; - goroutine: стеки всех горутин, первый шаг при подозрении на их утечку;
- block и mutex: ожидание на каналах и блокировках. Пустые, пока не включены
runtime.SetBlockProfileRateиruntime.SetMutexProfileFraction; - trace:
go tool traceпоказывает планировщик, GC и задержки во времени, а не агрегаты.
CPU-профиль с прода можно положить как default.pgo в каталог пакета main, и компилятор использует его для оптимизации (PGO).
Где спотыкаются
Открывают /debug/pprof/ на публичном порту. Эндпоинты раскрывают внутренности и позволяют нагрузить сервис сбором профиля.
Профилируют на ноутбуке без нагрузки и оптимизируют то, что в проде не горячее.
Смотрят только inuse_space и не видят проблему, когда память быстро освобождается, но частые аллокации нагружают GC.