pprof

Тема дорожной карты · Observability

pprof — инструмент профилирования среды выполнения Go и формат профиля, ставший де-факто стандартом для данных профилирования в нескольких языках и средах выполнения. В Go-приложениях включение net/http/pprof открывает HTTP-эндпоинты по адресу /debug/pprof/, которые предоставляют профили CPU (/debug/pprof/profile), профили выделения памяти в куче (/debug/pprof/heap), профили горутин и данные о конкуренции мьютексов. Инструмент командной строки go tool pprof или веб-интерфейс pprof позволяют визуализировать эти профили в виде флейм-графов, графов вызовов и списков top-N функций, что упрощает выявление горячих путей в продакшен-коде. Многие платформы непрерывного профилирования — в том числе Grafana Pyroscope — по расписанию извлекают профили из эндпоинтов pprof, сохраняя их для долгосрочной наблюдаемости и анализа тенденций. Формат профиля pprof также поддерживается для Java (через async-profiler), Node.js, Python и Rust, что делает его переносимым форматом профилирования, выходящим за рамки экосистемы Go.

Как это работает

pprof — 4-й столп observability: always-on профилирование CPU, памяти, lock contention, goroutines/threads. Инструменты: Pyroscope (теперь часть Grafana, поддерживает много языков), Polar Signals Parca, datadog-profiler, async-profiler (JVM), pprof (Go встроен). Найдите медленную функцию в production без повторного запуска с прицепленным профайлером. Flame graphs — каноническая визуализация. Overhead sampling обычно < 5%.

Когда применять

Включите continuous profiling для любого сервиса с performance-sensitive кодом (latency-sensitive API, batch-jobs). Pyroscope/Parca — open-source выбор; включите per-language профайлеры (net/http/pprof для Go, pyflame / py-spy для Python, async-profiler для JVM). Профайлите в production — staging показывает другие паттерны. Комбинируйте с traces для "какой span = какая функция".

Типичные ошибки

Ловушки pprof: overhead профайлинга не трекается (иногда > 10% — sampling rate важен); профили без service-контекста (какая версия? какая env?); профайлят всё, но никогда не читают данные ("они у нас есть" != "мы их используем"); flame graphs без фильтрации (одна гигантская башня прячет всё остальное).

Связанные понятия

Полезные ресурсы