Пакет 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
}
Go тесты поддерживают встроенное профилирование:
go test -bench=. -benchmem -memprofile=mem.prof
Флаги:
-benchmem
: показывает аллокации памяти на операцию-memprofile
: сохраняет профиль памятиНаиболее мощный способ анализа памяти.
pprof — это инструмент профилирования Go, входящий в стандартную библиотеку (net/http/pprof
). Он позволяет анализировать:
import _ "net/http/pprof"
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// Ваш код приложения...
}
Сбор heap-профиля:
go tool pprof http://localhost:6060/debug/pprof/heap
Сбор alloc-профиля:
go tool pprof http://localhost:6060/debug/pprof/allocs
После запуска 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
# Базовый снимок
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
go tool pprof -web http://localhost:6060/debug/pprof/heap
go tool pprof -http=:8080 -sample_index=inuse_space mem.prof
runtime.MemStats
для мониторингаbytes.makeSlice
— частый источник проблемGo предоставляет мощные встроенные инструменты для анализа памяти через runtime и pprof. pprof особенно полезен для детального анализа использования памяти, поиска утечек и оптимизации аллокаций. Комбинация runtime.MemStats для мониторинга и pprof для глубокого анализа дает полную картину использования памяти в приложении.