Pyroscope: непрерывное профилирование¶
Профилирование раньше было уделом небольшой группы разработчиков: после тестов под нагрузкой они запускали анализатор на несколько минут, собирали данные. Но в распределённой системе проблемы возникают спорадически и не на тестовых стендах. Continuous Profiling решает эту дилемму.
Pyroscope — проект для непрерывного профилирования. Он всегда включен и работает на production с минимальным overhead (~1%). Постоянно собирает flame graphs for CPU, Memory allocations, Mutex contention, I/O, block.
Flame graph в Grafana¶
Flame graph — основной тип визуализации в Pyroscope. Горизонтальные полосы, снизу вверх стек вызовов, ширина полосы — время выполнения метода.
Grafana показывает flame graph через свой Pyroscope-плагин (встроенный с 13.x). Вы можете наложить на тот же временной промежуток панель с Time Series — метрику CPU Prometheus и профиль Pyroscope.
Пример: метрика CPU показала всплеск на application: "user-api". Вы переключаетесь в Pyroscope тому же времени, открываете профиль и видите, что 90% времени потрачено на bcrypt.VerifyPassword(). Проблема — не сеть, не база данных, а алгоритм хэширования в авторизации. Тут же и решение найдено.
Типы профилей¶
- CPU: где процессор проводит время. Самая популярная.
- Memory: аллокация памяти; где создаётся больше всего объектов.
- Mutex: ожидание внутренних блокировок из потока в поток.
- IO: операции ввода/вывода диска — причины тормозов.
Pyroscope и метрики Prometheus¶
Pyroscope умеет transcode профиля в Prometheus-метрику pyroscope_something и выдавать через /metrics. Так можно строить стандартные дашборды с Time Series из данных Pyroscope — прямо sparklines— а потом проваливаться в детальный flame graph.