Как профилировать Go-сервис
Вопрос
Сервис стал отвечать медленнее, CPU вырос. Как вы будете искать причину с помощью инструментов Go?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Метрики и трейсы: какой эндпоинт, с какого релиза
CPU-профиль под нагрузкой: /debug/pprof/profile?seconds=30
go tool pprof: top, list, флеймграф в -http
Проверить GC: heap alloc_space, gctrace, доля CPU на GC
block и mutex профили при ожиданиях, goroutine при утечках, go tool trace для задержек
Бенчмарк проблемного участка, исправление, сравнение benchstat, PGO
Что могут спросить следом
- Как профилировать в проде безопасно?
- Что такое PGO в Go?
Разбор
Сначала сужаю область по метрикам: какой эндпоинт, с какого релиза, что изменилось в задержках и RPS. Затем снимаю CPU-профиль на работающем инстансе, go tool pprof -http=:8080 http://host:6060/debug/pprof/profile?seconds=30, pprof доступен только на внутреннем порту. Смотрю top по cum и флеймграф, list на подозрительную функцию. Если много времени в runtime.mallocgc и gcBgMarkWorker, проблема в аллокациях: heap-профиль alloc_space покажет, кто выделяет. Если CPU не загружен, а запросы медленные, нужны block и mutex профили или go tool trace, где видно ожидание на блокировках и планировщике. Нашёл место: пишу бенчмарк, исправляю, сравниваю через benchstat. Ещё можно включить PGO: положить CPU-профиль из прода как default.pgo в пакет main, и компилятор (с Go 1.21) использует его для инлайнинга горячих путей, обычно это несколько процентов CPU.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память, GC и pprof»
- Пул объектов как sync.Pool: симуляция на Go
- Статистика потока чисел без хранения на Go
- Escape analysis: что попадёт в кучу
- Как работает сборщик мусора Go
- Какой сборщик мусора в Go
- Как посмотреть решения escape analysis
- Что значит GOGC=100
- GOMEMLIMIT в контейнере