> Какие методы профилирования и поиска утечек памяти существуют (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: amoCRM, Wildberries
Стек: Go
> Пример ответа
В Go для профилирования и поиска утечек памяти используются встроенные инструменты из пакета runtime/pprof и net/http/pprof. Основные методы:
-
CPU-профилирование - записывает, на что тратится процессорное время. Запускается через
pprof.StartCPUProfile()или эндпоинт/debug/pprof/profile. Помогает выявить "горячие" участки кода. -
Heap-профилирование - показывает текущее выделение памяти и объекты в куче. Доступно через
/debug/pprof/heap. Позволяет обнаружить утечки, сравнивая снимки памяти черезgo tool pprof -base. -
Goroutine-профилирование - отображает стек вызовов всех горутин. Утечки часто связаны с "зависшими" горутинами, которые не завершаются. Эндпоинт
/debug/pprof/goroutine. -
Allocs-профилирование - показывает все выделения памяти с момента старта программы, полезно для поиска избыточных аллокаций.
-
Mutex-профилирование - помогает найти блокировки, которые могут приводить к накоплению горутин.
Инструменты анализа:
go tool pprof- интерактивный анализатор профилей (командыtop,list,web).pprofс опцией-diff_baseдля сравнения двух снимков кучи.pprofс-httpдля визуализации в браузере (графы, flame graph).
Специфические методы для Go:
- Использование
runtime.ReadMemStatsдля логирования метрик памяти в production. - Применение
go test -benchmemдля бенчмарков. - Анализ утечек через
runtime.SetFinalizerили кастомные трекеры объектов.
Пример подхода:
- Запустить приложение с
/debug/pprof. - Сделать снимок кучи (
curl .../debug/pprof/heap > heap1.out). - Выполнить нагрузочный тест.
- Сделать второй снимок (
heap2.out). - Сравнить:
go tool pprof -base heap1.out heap2.out. - В интерактивном режиме выполнить
top10- увидеть объекты, которые не освобождаются.
Для production-систем рекомендуется использовать net/http/pprof с ограничением доступа и автоматический сбор профилей через pprof в CI/CD.
> Похожие задачи по backend
Что делать если EXPLAIN показывает sequential scan вместо индексного сканирования
Что будет если не использовать указатель при возврате структуры в Go
В чем разница асинхронности, многопоточности и многопроцессорности в Python
Что такое метаклассы в Python и для чего они используются
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью