Что такое 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) и другие метрики.

Ответ 18+ 🔞

А, ну вот, поговорим про этот ваш pprof, блядь. Инструмент, который показывает, где твоя программа сосёт как последняя дыра, а где память утекает, как вода из дырявого таза.

Короче, это такая стандартная штука в Go, которая рисует тебе красивые картинки, где твой код тормозит, как черепаха в патруле. Незаменимая вещь, когда нужно найти, где же эта сука, блядь, узкое место сидит.

Какие бывают эти самые профили, на которые можно посмотреть:

  • Профиль процессора (/debug/pprof/profile). Этот тебе покажет, какие функции твои так усердно жрут CPU, что он плавится. Чтобы понять, что оптимизировать в первую очередь, а не гадать на кофейной гуще.
  • Профиль памяти, она же куча (/debug/pprof/heap). Вот тут видно, кто твою оперативку разворовывает. Идеально, чтобы поймать утечку памяти с поличным, этакую мартышку-воришку.
  • Профиль горутин (/debug/pprof/goroutine). Показывает все твои горутины — и те, что работают, и те, что зависли, как идиот, в вечном ожидании. Для поиска дедлоков — самое то.
  • Профиль блокировок (/debug/pprof/block). Сообщает, где твои горутины простаивают, упёршись лбом в мьютекс или канал. Чтоб знать, кто всех тормозит, этот пидарас шерстяной.

Как эту магию прикрутить и запустить:

  1. Тыкаешь в код анонимный импорт net/http/pprof. Он сам, хитрая жопа, всё зарегистрирует в стандартном роутере.

    import (
        "log"
        "net/http"
        _ "net/http/pprof" // Смотри, вот этот подлый анонимный импорт, ёпта!
    )
    
    func main() {
        go func() {
            // Поднимаем отдельный сервачок для отладки, чтоб не мешал основному
            log.Println(http.ListenAndServe("localhost:6060", nil))
        }()
        // ... а тут твой основной код, который, возможно, сосёт ...
    }
  2. Запускаешь анализ через консольную команду go tool pprof. Можно в текстовом режиме ковыряться, а можно сразу веб-морду открыть — красота, в рот меня чих-пых!

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

После второй команды у тебя в браузере выскочит интерфейс, где можно глазеть на flame graph и прочие графики. Там сразу видно, кто главный пожиратель ресурсов — хоть пальцем тычь, блядь.