Что такое pprof и как его использовать?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Профилирование с помощью pprof в Go
pprof — это встроенный в Go инструмент для профилирования и анализа производительности приложений. Это часть стандартного пакета runtime/pprof и net/http/pprof, предоставляющая мощные средства для сбора и визуализации данных о CPU, памяти, горутинах, блокировках и других метриках.
Основные возможности prof
pprof поддерживает несколько типов профилей:
- CPU профиль: показывает, какие функции потребляют больше всего процессорного времени.
- Heap (память) профиль: анализирует распределение и использование памяти.
- Goroutine профиль: отображает стектрейсы всех запущенных горутин.
- Block профиль: помогает найти источники блокировок.
- Mutex профиль: показывает конкуренцию за мьютексы.
- Threadcreate профиль: отслеживает создание системных потоков.
Способы использования pprof
1. Встроенный HTTP-сервер (наиболее удобный способ)
Для веб-приложений добавьте импорт net/http/pprof — он автоматически регистрирует обработчики по пути /debug/pprof/:
import (
_ "net/http/pprof"
"net/http"
)
func main() {
// Обработчики будут доступны по адресу localhost:6060/debug/pprof/
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
// ... ваш основной код ...
}
Теперь вы можете получить различные профили через HTTP:
/debug/pprof/— сводная страница/debug/pprof/heap— дамп памяти/debug/pprof/profile?seconds=30— CPU профиль за 30 секунд/debug/pprof/goroutine?debug=1— стектрейсы горутин/debug/pprof/trace?seconds=5— сбор трассировки
2. Ручное создание профилей
Для CLI-приложений используйте прямое API:
import (
"os"
"runtime/pprof"
)
func main() {
// Профилирование CPU
f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// Профилирование памяти
defer func() {
f, _ := os.Create("heap.prof")
pprof.WriteHeapProfile(f)
f.Close()
}()
// ... ваш код ...
}
Анализ профилей с помощью go tool pprof
Собранные профили анализируются утилитой командной строки:
# Интерактивный режим для CPU профиля
go tool pprof http://localhost:6060/debug/pprof/profile
# Анализ heap профиля с веб-интерфейсом
go tool pprof -http=:8080 heap.prof
# Сравнение двух профилей
go tool pprof -base old.prof new.prof
Ключевые команды в интерактивном режиме pprof:
(pprof) top 10 # Топ-10 самых ресурсоемких функций
(pprof) list FuncName # Показать код функции с аннотацией
(pprof) web # Визуализация в браузере (требуется graphviz)
(pprof) svg # Экспорт в SVG
(pprof) peek regexp # Поиск по функциям
(pprof) disasm FuncName # Дизассемблирование (для низкоуровневого анализа)
Практический пример диагностики
Допустим, у вас есть утечка памяти. Вы можете:
- Собрать heap профиль:
curl -o heap.prof http://localhost:6060/debug/pprof/heap
- Проанализировать в веб-режиме:
go tool pprof -http=:8080 heap.prof
- В веб-интерфейсе перейти на вкладку "Flame Graph" или "Source" чтобы найти функции, которые аллоцируют больше всего памяти.
Расширенные возможности
-
Трассировка (trace):
/debug/pprof/traceпозволяет анализировать временные линии выполнения, планирование горутин, системные вызовы. -
Кастомные профили: Вы можете создавать свои собственные профили для бизнес-логики:
var myProf = pprof.NewProfile("myapp.custom")
func someFunc() {
myProf.Add("operation", 1)
defer myProf.Remove("operation")
// ... операция ...
}
Лучшие практики
- Не включайте pprof в продакшене без защиты (аутентификации, отдельного порта)
- Используйте разные имена файлов для каждого запуска профилирования
- Собирайте профили достаточно долго (обычно 30+ секунд) для репрезентативных данных
- Анализируйте diff между профилями до и после оптимизаций
- Интегрируйте pprof в тесты через
testing.SetProfileRate()
pprof является критически важным инструментом для любого Go-разработчика, позволяя не только находить узкие места производительности, но и понимать внутреннее поведение рантайма Go, что особенно важно для диагностики сложных проблем в конкурентных и распределенных системах.