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

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

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 — это функция. Чем шире блок, тем больше ресурсов она потребляет. Цвета помогают быстро находить «горячие» зоны и понимать, куда уходит 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, профилировании сервисов или оптимизации высоконагруженной инфраструктуры?
Мы поможем внедрить непрерывное профилирование, выявить узкие места и повысить производительность ваших систем — без остановки сервисов и с реальным эффектом на ресурсоёмкость.
#itforprof #profiling #observability #perforator #performance #devops #ebpf #linux #infrastructure #optimization #cloudnative #systemdesign #autofdo #samplepgo #clickhouse #yandex #opensourcetools

Начать дискуссию