Perforator: система непрерывного профилирования от Яндекса

Perforator яндекс

Perforator: система непрерывного профилирования от Яндекса

Зачем нужен continuous profiling

Perforator — это система непрерывного профилирования (continuous profiling), разработанная в Яндексе. Она помогает отслеживать, какие участки кода потребляют ресурсы в продакшене, с минимальной нагрузкой на сервисы. Система уже используется на сотнях сервисов внутри компании, а с недавнего времени доступна как проект с открытым исходным кодом.

Проект опубликован под лицензией Apache 2.0, и его можно свободно использовать и адаптировать под собственные нужды.
📦 Репозиторий
📘 Документация

Профилирование в продакшене позволяет:

Без инструментов профилирования часто приходится опираться на догадки — и почти всегда они ошибочные. Даже опытные разработчики не могут точно предсказать, где и почему расходуются ресурсы. Непрерывное профилирование даёт объективную картину.

Архитектура и как это работает

Агент — устанавливается на каждую машину и собирает сэмплы стека с помощью eBPF, бинарные образы, метаданные. Отправляет всё это в хранилище.

Хранилище — сочетание S3 и ClickHouse. В S3 сохраняются трассы и бинарные образы, в ClickHouse — метаданные и агрегаты.

Сервер и интерфейс — обрабатывает запросы и отображает flamegraph, таблицы, группировки, сравнения.

Сбор происходит с помощью perf_event_open, а раскрутка (unwinding) — через DWARF-CFI. Символизация работает по формату GSYM, разработанному в рамках LLVM-проекта. Система поддерживает масштабирование до тысяч машин и миллионов сэмплов в сутки.

Возможности Perforator

Высокоточная раскрутка стеков

Perforator поддерживает профилирование даже в сборках:

Для этого используется:

Также можно использовать –frame-pointer=all на этапе компиляции, чтобы упростить анализ.

Интеграция с SamplePGO / AutoFDO

Собранные профили можно экспортировать в формат, пригодный для использования в компиляции с флагами -fprofile-sample-use (для Clang) или -fauto-profile (для GCC). Это позволяет ускорить приложение на 5–15% без изменений в исходном коде — за счёт переупорядочивания кода, inlining и других оптимизаций.

Подробнее: SamplePGO в LLVM

A/B-профилирование

Perforator позволяет собирать профили по сегментам: например, включить сбор только для группы пользователей с новым фичефлагом или новой версией сервиса. Это даёт возможность объективно сравнить поведение и нагрузку между версиями.

Сегментация настраивается через метки и фильтры в конфиге агента или через Kubernetes-метки.

Minicores (стэки при падениях)

Perforator умеет собирать стек вызовов при падении процесса (например, при SIGSEGV, SIGABRT и других авариях), без создания полноценного core dump. Это полезно, если full core dump запрещён или слишком тяжёлый.

Minicores сохраняются в S3 и отображаются в интерфейсе почти мгновенно. Для каждой аварии видно:

Интерфейс и визуализация

Интерфейс Perforator позволяет:

Ниже — примеры flamegraph, которые можно получить с помощью Perforator. Они помогают сразу увидеть, где «горит» CPU, и понять, чем реально заняты потоки.

Flamegraph MySQL под нагрузкой

Perforator: система непрерывного профилирования от Яндекса

На графике видно активное использование CPU в MySQL.
Широкие красные блоки показывают функции, в которых «сгорает» больше всего процессорного времени.

Flamegraph ClickHouse (MergeTree, активная нагрузка)

Perforator: система непрерывного профилирования от Яндекса
Здесь хорошо видно активную работу движка ClickHouse: MergeTreeBackgroundExecutor, PipelineExecutor и MergeTask. Такие графики помогают локализовать узкие места и оптимизировать обработку данных.

Flamegraph ClickHouse (ожидание futex)

Perforator: система непрерывного профилирования от Яндекса

Этот пример показывает ситуацию, когда большая часть потоков ждёт на futex_wait.
Perforator помогает не только найти горячие функции, но и выявить, где сервис тратит время в ожидании.

Каждый прямоугольник на flamegraph — это функция. Чем шире блок, тем больше ресурсов она потребляет. Цвета помогают быстро находить «горячие» зоны и понимать, куда уходит CPU.

Установка и запуск

Системные требования

Простой запуск на локальной машине:

				
					sudo perforator record -a --duration=60s
				
			

Через минуту откроется flamegraph с результатами. Можно профилировать любой запущенный процесс, а не весь хост.

Kubernetes

Perforator поддерживает полноценную установку в Kubernetes-кластере. Доступен официальный Helm-чарт. В нём можно развернуть:

Производительность и масштабирование

На практике Perforator потребляет:

Внутри Яндекса система масштабируется на тысячи машин и обрабатывает миллионы сэмплов в день. Хранилище работает на ClickHouse, что позволяет быстро делать агрегации и сравнения.

Заключение

Perforator — это зрелый инструмент, проверенный в продакшене Яндекса. Он обеспечивает:

Если вам нужно понять, где реально расходуется CPU, и сделать это в продакшене — Perforator даёт такую возможность.

💡Нужна помощь в настройке Perforator, профилировании сервисов или оптимизации высоконагруженной инфраструктуры?
Мы поможем внедрить непрерывное профилирование, выявить узкие места и повысить производительность ваших систем — без остановки сервисов и с реальным эффектом на ресурсоёмкость.
📩 Свяжитесь с нами — разберёмся, настроим и дадим результат.