Ответ
pprof — это стандартный пакет и инструмент в Go для визуализации и анализа данных профилирования. Он незаменим для поиска узких мест в производительности (bottlenecks) и утечек памяти.
Основные виды профилей:
- CPU Profile (
/debug/pprof/profile): Показывает, какие функции потребляют больше всего процессорного времени. Помогает оптимизировать ресурсоёмкие операции. - Memory Profile (Heap) (
/debug/pprof/heap): Отображает распределение объектов в куче. Используется для поиска утечек памяти и оптимизации её использования. - Goroutine Profile (
/debug/pprof/goroutine): Показывает стектрейсы всех активных горутин. Помогает в отладке дедлоков или обнаружении "зависших" горутин. - Block Profile (
/debug/pprof/block): Сообщает, где горутины тратят время на ожидание синхронизации (например, на мьютексах или каналах).
Как подключить и использовать:
-
Импортируйте пакет
net/http/pprof. Он автоматически регистрирует свои обработчики вDefaultServeMux.import ( "log" "net/http" _ "net/http/pprof" // Важно: анонимный импорт ) func main() { go func() { // Запускаем HTTP-сервер для pprof на отдельном порту log.Println(http.ListenAndServe("localhost:6060", nil)) }() // ... ваш основной код приложения ... } -
Запустите анализ с помощью консольной утилиты
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). Сообщает, где твои горутины простаивают, упёршись лбом в мьютекс или канал. Чтоб знать, кто всех тормозит, этот пидарас шерстяной.
Как эту магию прикрутить и запустить:
-
Тыкаешь в код анонимный импорт
net/http/pprof. Он сам, хитрая жопа, всё зарегистрирует в стандартном роутере.import ( "log" "net/http" _ "net/http/pprof" // Смотри, вот этот подлый анонимный импорт, ёпта! ) func main() { go func() { // Поднимаем отдельный сервачок для отладки, чтоб не мешал основному log.Println(http.ListenAndServe("localhost:6060", nil)) }() // ... а тут твой основной код, который, возможно, сосёт ... } -
Запускаешь анализ через консольную команду
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 и прочие графики. Там сразу видно, кто главный пожиратель ресурсов — хоть пальцем тычь, блядь.