← Назад к вопросам

Что такое pprof и как его использовать?

2.0 Middle🔥 181 комментариев
#Observability#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Профилирование с помощью 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    # Дизассемблирование (для низкоуровневого анализа)

Практический пример диагностики

Допустим, у вас есть утечка памяти. Вы можете:

  1. Собрать heap профиль:
curl -o heap.prof http://localhost:6060/debug/pprof/heap
  1. Проанализировать в веб-режиме:
go tool pprof -http=:8080 heap.prof
  1. В веб-интерфейсе перейти на вкладку "Flame Graph" или "Source" чтобы найти функции, которые аллоцируют больше всего памяти.

Расширенные возможности

  • Трассировка (trace): /debug/pprof/trace позволяет анализировать временные линии выполнения, планирование горутин, системные вызовы.

  • Кастомные профили: Вы можете создавать свои собственные профили для бизнес-логики:

var myProf = pprof.NewProfile("myapp.custom")

func someFunc() {
    myProf.Add("operation", 1)
    defer myProf.Remove("operation")
    // ... операция ...
}

Лучшие практики

  1. Не включайте pprof в продакшене без защиты (аутентификации, отдельного порта)
  2. Используйте разные имена файлов для каждого запуска профилирования
  3. Собирайте профили достаточно долго (обычно 30+ секунд) для репрезентативных данных
  4. Анализируйте diff между профилями до и после оптимизаций
  5. Интегрируйте pprof в тесты через testing.SetProfileRate()

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