1

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

Perforator: система непрерывного профилирования от Яндекса IT, Перформанс, DevOps, Linux, Optimization, Яндекс, Длиннопост

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

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

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

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

  • Находить «горячие» участки кода;

  • Понимать, как реально используется CPU;

  • Делать обоснованные архитектурные и оптимизационные решения;

  • Уменьшать расходы на инфраструктуру;

  • Ускорять приложения с помощью SamplePGO / AutoFDO.

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

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

Perforator состоит из трёх основных компонентов:

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

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

  3. Сервер и интерфейс — обрабатывает запросы и отображает 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, профилировании сервисов или оптимизации высоконагруженной инфраструктуры?
Мы поможем внедрить непрерывное профилирование, выявить узкие места и повысить производительность ваших систем — без остановки сервисов и с реальным эффектом на ресурсоёмкость.