Как можно измерить использование памяти в Go? Что такое pprof?go-77

Методы измерения памяти в Go

1. Стандартный пакет runtime

Пакет runtime предоставляет базовые метрики памяти:

import "runtime"

func printMemStats() {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)

    // Все значения в байтах
    fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))       // Текущие аллокации
    fmt.Printf("TotalAlloc = %v MiB", bToMb(m.TotalAlloc)) // Всего аллокаций
    fmt.Printf("Sys = %v MiB", bToMb(m.Sys))           // Память запрошенная у ОС
    fmt.Printf("HeapAlloc = %v MiB", bToMb(m.HeapAlloc)) // Куча
}

func bToMb(b uint64) uint64 {
    return b / 1024 / 1024
}

2. Бенчмарки с профилированием

Go тесты поддерживают встроенное профилирование:

go test -bench=. -benchmem -memprofile=mem.prof

Флаги:

  • -benchmem: показывает аллокации памяти на операцию
  • -memprofile: сохраняет профиль памяти

3. Интеграция с pprof

Наиболее мощный способ анализа памяти.

Что такое pprof?

pprof — это инструмент профилирования Go, входящий в стандартную библиотеку (net/http/pprof). Он позволяет анализировать:

  • Использование памяти (heap)
  • Аллокации (allocations)
  • Профиль ЦПУ
  • Блокировки и горутины

Основные возможности pprof для памяти:

  1. Heap profiling - текущее состояние памяти
  2. Allocation profiling - история аллокаций
  3. Memory leak detection - сравнение снимков памяти

Как использовать pprof

1. Подключение в приложении

import _ "net/http/pprof"

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    // Ваш код приложения...
}

2. Сбор профилей

Сбор heap-профиля:

go tool pprof http://localhost:6060/debug/pprof/heap

Сбор alloc-профиля:

go tool pprof http://localhost:6060/debug/pprof/allocs

3. Анализ памяти

После запуска pprof доступны команды:

  • top - топ потребителей памяти
  • list FuncName - анализ конкретной функции
  • web - визуализация графа (требуется Graphviz)

Пример вывода top:

Showing nodes accounting for 512.11MB, 98.72% of 518.72MB total
flat  flat%   sum%        cum   cum%
302.67MB 58.35% 58.35%   302.67MB 58.35%  bytes.makeSlice
209.44MB 40.37% 98.72%   209.44MB 40.37%  main.processBatch

4. Сравнение снимков

# Базовый снимок
curl -s http://localhost:6060/debug/pprof/heap > base.heap

# После нагрузки
curl -s http://localhost:6060/debug/pprof/heap > current.heap

# Сравнение
go tool pprof -base base.heap current.heap

Визуализация данных

  1. Граф вызовов:
go tool pprof -web http://localhost:6060/debug/pprof/heap
  1. Flame Graph:
go tool pprof -http=:8080 -sample_index=inuse_space mem.prof

Практические советы

  1. Для production используйте runtime.MemStats для мониторинга
  2. Для отладки утечек — сравнение heap-профилей
  3. Смотрите не только объем памяти, но и количество аллокаций
  4. Обращайте внимание на bytes.makeSlice — частый источник проблем
  5. Для сервисов используйте постоянный мониторинг через expvar

Резюмируем

Go предоставляет мощные встроенные инструменты для анализа памяти через runtime и pprof. pprof особенно полезен для детального анализа использования памяти, поиска утечек и оптимизации аллокаций. Комбинация runtime.MemStats для мониторинга и pprof для глубокого анализа дает полную картину использования памяти в приложении.