Что такое pprof и как его использовать для профилирования Go-приложений?

Ответ

pprof — это стандартный пакет и инструмент в Go для визуализации и анализа данных профилирования. Он незаменим для поиска узких мест в производительности (bottlenecks) и утечек памяти.

Основные виды профилей:

  • CPU Profile (/debug/pprof/profile): Показывает, какие функции потребляют больше всего процессорного времени. Помогает оптимизировать ресурсоёмкие операции.
  • Memory Profile (Heap) (/debug/pprof/heap): Отображает распределение объектов в куче. Используется для поиска утечек памяти и оптимизации её использования.
  • Goroutine Profile (/debug/pprof/goroutine): Показывает стектрейсы всех активных горутин. Помогает в отладке дедлоков или обнаружении "зависших" горутин.
  • Block Profile (/debug/pprof/block): Сообщает, где горутины тратят время на ожидание синхронизации (например, на мьютексах или каналах).

Как подключить и использовать:

  1. Импортируйте пакет net/http/pprof. Он автоматически регистрирует свои обработчики в DefaultServeMux.

    import (
        "log"
        "net/http"
        _ "net/http/pprof" // Важно: анонимный импорт
    )
    
    func main() {
        go func() {
            // Запускаем HTTP-сервер для pprof на отдельном порту
            log.Println(http.ListenAndServe("localhost:6060", nil))
        }()
        // ... ваш основной код приложения ...
    }
  2. Запустите анализ с помощью консольной утилиты go tool pprof. Для анализа можно запустить интерактивную консоль или сразу веб-интерфейс.

    # Анализ использования памяти (heap)
    go tool pprof http://localhost:6060/debug/pprof/heap
    
    # Анализ CPU в течение 30 секунд и запуск веб-интерфейса
    go tool pprof -http=:8081 http://localhost:6060/debug/pprof/profile?seconds=30

После выполнения последней команды в браузере откроется UI, где можно наглядно увидеть граф вызовов (flame graph) и другие метрики.