Ответ вслух Middle Память, GC и pprof обновлено

Как профилировать Go-сервис

Вопрос

Сервис стал отвечать медленнее, CPU вырос. Как вы будете искать причину с помощью инструментов Go?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала сужаю область по метрикам: какой эндпоинт, с какого релиза, что изменилось в задержках и RPS. Затем снимаю CPU-профиль на работающем инстансе, go tool pprof -http=:8080 http://host:6060/debug/pprof/profile?seconds=30, pprof доступен только на внутреннем порту.

Что должно прозвучать в ответе

  • Метрики и трейсы: какой эндпоинт, с какого релиза

  • 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 ошибок.