Perforator: система непрерывного профилирования от Яндекса
Perforator — это система непрерывного профилирования (continuous profiling), разработанная в Яндексе. Она помогает отслеживать, какие участки кода потребляют ресурсы в продакшене, с минимальной нагрузкой на сервисы. Система уже используется на сотнях сервисов внутри компании, а с недавнего времени доступна как проект с открытым исходным кодом.
Проект опубликован под лицензией Apache 2.0, и его можно свободно использовать и адаптировать под собственные нужды.
📦 Репозиторий: github.com/yandex/perforator
📘 Документация: perforator.tech
Зачем нужен continuous profiling
Профилирование в продакшене позволяет:
Находить «горячие» участки кода;
Понимать, как реально используется CPU;
Делать обоснованные архитектурные и оптимизационные решения;
Уменьшать расходы на инфраструктуру;
Ускорять приложения с помощью SamplePGO / AutoFDO.
Без инструментов профилирования часто приходится опираться на догадки — и почти всегда они ошибочные. Даже опытные разработчики не могут точно предсказать, где и почему расходуются ресурсы. Непрерывное профилирование даёт объективную картину.
Архитектура и как это работает
Perforator состоит из трёх основных компонентов:
Агент — устанавливается на каждую машину и собирает сэмплы стека с помощью eBPF, бинарные образы, метаданные. Отправляет всё это в хранилище.
Хранилище — сочетание S3 и ClickHouse. В S3 сохраняются трассы и бинарные образы, в ClickHouse — метаданные и агрегаты.
Сервер и интерфейс — обрабатывает запросы и отображает flamegraph, таблицы, группировки, сравнения.
Сбор происходит с помощью perf_event_open, а раскрутка (unwinding) — через DWARF-CFI. Символизация работает по формату GSYM, разработанному в рамках LLVM-проекта.
Система поддерживает масштабирование до тысяч машин и миллионов сэмплов в сутки.
Возможности Perforator
📌 1. Высокоточная раскрутка стеков
Perforator поддерживает профилирование даже в сборках:
Без отладочной информации;
Без фрейм-пойнтеров (frame pointers);
С включённой оптимизацией компилятора.
Для этого используется:
DWARF-CFI (если есть);
Регистровая раскрутка;
В крайнем случае — heuristics или fallback.
Также можно использовать --frame-pointer=all на этапе компиляции, чтобы упростить анализ.
🚀 2. Интеграция с SamplePGO / AutoFDO
Собранные профили можно экспортировать в формат, пригодный для использования в компиляции с флагами -fprofile-sample-use (для Clang) или -fauto-profile (для GCC). Это позволяет ускорить приложение на 5–15% без изменений в исходном коде — за счёт переупорядочивания кода, inlining и других оптимизаций.
Подробнее: SamplePGO в LLVM
🧪 3. A/B-профилирование
Perforator позволяет собирать профили по сегментам: например, включить сбор только для группы пользователей с новым фичефлагом или новой версией сервиса. Это даёт возможность объективно сравнить поведение и нагрузку между версиями.
Сегментация настраивается через метки и фильтры в конфиге агента или через Kubernetes-метки.
💥 4. Minicores (стэки при падениях)
Perforator умеет собирать стек вызовов при падении процесса (например, при SIGSEGV, SIGABRT и других авариях), без создания полноценного core dump. Это полезно, если full core dump запрещён или слишком тяжёлый.
Minicores сохраняются в S3 и отображаются в интерфейсе почти мгновенно. Для каждой аварии видно:
Причину;
Стек вызовов;
Имя потока;
Участок кода, где произошла ошибка.
📊 5. Интерфейс и визуализация
Интерфейс Perforator позволяет:
строить flamegraph за миллисекунды;
группировать по бинарнику, версии, треду, функции;
сравнивать профили A/B или до/после;
выделять «горячие» функции по проценту использования CPU.
Ниже — примеры flamegraph, которые можно получить с помощью Perforator.
Они помогают сразу увидеть, где «горит» CPU, и понять, чем реально заняты потоки.



1 Flamegraph MySQL под нагрузкой
На графике видно активное использование CPU в MySQL.
Широкие красные блоки показывают функции, в которых «сгорает» больше всего процессорного времени.
2 Flamegraph ClickHouse (MergeTree, активная нагрузка)
Здесь хорошо видно активную работу движка ClickHouse:
MergeTreeBackgroundExecutor, PipelineExecutor и MergeTask.
Такие графики помогают локализовать узкие места и оптимизировать обработку данных.
3 Flamegraph ClickHouse (ожидание futex)
Этот пример показывает ситуацию, когда большая часть потоков ждёт на futex_wait.
Perforator помогает не только найти горячие функции, но и выявить, где сервис тратит время в ожидании.
Каждый прямоугольник на flamegraph — это функция.
Чем шире блок, тем больше ресурсов она потребляет.
Цвета помогают быстро находить «горячие» зоны и понимать, куда уходит CPU.
Установка и запуск
🔧 Системные требования
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, профилировании сервисов или оптимизации высоконагруженной инфраструктуры?
Мы поможем внедрить непрерывное профилирование, выявить узкие места и повысить производительность ваших систем — без остановки сервисов и с реальным эффектом на ресурсоёмкость.