Перейти к содержанию

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.



Далее: Beyla: eBPF автоинструментирование