Какие инструменты для профилирования сервисов на Go существуют и как их использовать
Что проверяют
Умеете ли вы искать узкое место по данным, а не наугад, и знаете ли, какой профиль отвечает на какой вопрос. Следом спрашивают, как вы профилировали сервис на проде и безопасно ли держать pprof включённым.
Как отвечать
Основа встроена в стандартную библиотеку:
net/http/pprof: пустой импорт регистрирует/debug/pprof/наhttp.DefaultServeMux. Снимают так:go tool pprof -http=:8080 http://host:6060/debug/pprof/profile?seconds=30, в веб-интерфейсе естьtop, граф вызовов и flame graph;- виды профилей:
profileдля CPU,heapс выборомinuse_space(текущая память) илиalloc_space(все аллокации),goroutineдля утечек горутин,blockиmutexдля ожиданий. Последние два выключены по умолчанию, их включаютruntime.SetBlockProfileRateиruntime.SetMutexProfileFraction; - бенчмарки:
go test -bench=. -benchmem -cpuprofile cpu.out, с Go 1.24 цикл пишут какfor b.Loop(). Результаты до и после сравниваютbenchstatна нескольких прогонах; - трассировка:
go tool traceпоказывает планировщик, паузы GC и блокировки, которых не видно в CPU-профиле. В Go 1.25 появилсяtrace.FlightRecorder: держит последние секунды трассы в памяти и сбрасывает по событию; - непрерывное профилирование: Pyroscope или Parca собирают профили со всех инстансов, и профиль до релиза сравнивается с профилем после.
Хорошо упомянуть PGO: CPU-профиль с прода, положенный в пакет main как default.pgo, компилятор использует для оптимизаций при сборке.
Где спотыкаются
Открывают pprof наружу. Если основной сервер работает на DefaultServeMux, пустой импорт отдаёт профили всем. Обработчики вешают на отдельный порт, доступный только изнутри.
Ищут причину высокой задержки в CPU-профиле. Если сервис ждёт базу или мьютекс, процессор простаивает, и ответ дадут block, mutex или трасса.
Путают inuse_space и alloc_space. Для утечки нужна текущая память, для давления на GC нужны суммарные аллокации.