Perforator: система непрерывного профилирования от Яндекса
Зачем нужен continuous profiling
Perforator — это система непрерывного профилирования (continuous profiling), разработанная в Яндексе. Она помогает отслеживать, какие участки кода потребляют ресурсы в продакшене, с минимальной нагрузкой на сервисы. Система уже используется на сотнях сервисов внутри компании, а с недавнего времени доступна как проект с открытым исходным кодом.
Проект опубликован под лицензией Apache 2.0, и его можно свободно использовать и адаптировать под собственные нужды.
📦 Репозиторий
📘 Документация
Профилирование в продакшене позволяет:
- Находить «горячие» участки кода
- Понимать, как реально используется CPU
- Делать обоснованные архитектурные и оптимизационные решения
- Ускорять приложения с помощью SamplePGO / AutoFDO
Без инструментов профилирования часто приходится опираться на догадки — и почти всегда они ошибочные. Даже опытные разработчики не могут точно предсказать, где и почему расходуются ресурсы. Непрерывное профилирование даёт объективную картину.
Архитектура и как это работает
Агент — устанавливается на каждую машину и собирает сэмплы стека с помощью eBPF, бинарные образы, метаданные. Отправляет всё это в хранилище.
Хранилище — сочетание S3 и ClickHouse. В S3 сохраняются трассы и бинарные образы, в ClickHouse — метаданные и агрегаты.
Сервер и интерфейс — обрабатывает запросы и отображает flamegraph, таблицы, группировки, сравнения.
Возможности Perforator
Высокоточная раскрутка стеков
Perforator поддерживает профилирование даже в сборках:
- Без отладочной информации
- Без фрейм-пойнтеров (frame pointers)
- С включённой оптимизацией компилятор
Для этого используется:
- DWARF-CFI (если есть)
- Регистровая раскрутка
- В крайнем случае — heuristics или fallback
Также можно использовать –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 за миллисекунды;
- группировать по бинарнику, версии, треду, функции;
- сравнивать профили A/B или до/после;
- выделять «горячие» функции по проценту использования CPU.
Ниже — примеры flamegraph, которые можно получить с помощью Perforator. Они помогают сразу увидеть, где «горит» CPU, и понять, чем реально заняты потоки.
Flamegraph MySQL под нагрузкой

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

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

Этот пример показывает ситуацию, когда большая часть потоков ждёт на futex_wait.
Perforator помогает не только найти горячие функции, но и выявить, где сервис тратит время в ожидании.
Установка и запуск
Системные требования
- Linux x86_64, ядро 5.4+ (поддержка eBPF);
- Права root (или CAP_PERF_EVENT, CAP_SYS_ADMIN);
- Доступ к perf и ftrace (часто уже есть в облачных ядрах).
Простой запуск на локальной машине:
sudo perforator record -a --duration=60s
Через минуту откроется flamegraph с результатами. Можно профилировать любой запущенный процесс, а не весь хост.
Kubernetes
Perforator поддерживает полноценную установку в Kubernetes-кластере. Доступен официальный Helm-чарт. В нём можно развернуть:
- Агентов на каждый узел;
- Центральное хранилище и сервер;
- Интерфейс и авторизацию.
Производительность и масштабирование
На практике Perforator потребляет:
- CPU: ~1% на хост при дефолтной частоте сэмплирования;
- RAM: от 0.5 до 2 ГБ (зависит от кол-ва процессов);
- Сеть: минимальная, данные сжимаются;
- Хранилище: трассы собираются раз в N минут и заливаются в S3 (или MinIO).
Внутри Яндекса система масштабируется на тысячи машин и обрабатывает миллионы сэмплов в день. Хранилище работает на ClickHouse, что позволяет быстро делать агрегации и сравнения.
Заключение
Perforator — это зрелый инструмент, проверенный в продакшене Яндекса. Он обеспечивает:
- стабильную раскрутку стеков,
- поддержку AutoFDO,
- лёгкую установку в Kubernetes,
- быструю визуализацию,
- минимальную нагрузку на сервисы.
Если вам нужно понять, где реально расходуется CPU, и сделать это в продакшене — Perforator даёт такую возможность.
💡Нужна помощь в настройке Perforator, профилировании сервисов или оптимизации высоконагруженной инфраструктуры?
Мы поможем внедрить непрерывное профилирование, выявить узкие места и повысить производительность ваших систем — без остановки сервисов и с реальным эффектом на ресурсоёмкость.
📩 Свяжитесь с нами — разберёмся, настроим и дадим результат.