Яндекс открыл Perforator, инструментарий для профилирования приложений в датацентрах

Компания Яндекс объявила об открытии исходного кода инструментария Perforator, предназначенного для непрерывного сбора детальных метрик с информацией о работе приложений и рассчитанного на использование в крупных кластерах и датацентрах. Инструментарий позволяет анализировать работу приложений в реальном времени, оценивать распределение ресурсов на Linux-серверах и выявлять наиболее ресурсоёмкие приложения. Код написан на языке С++ и распространяется под лицензией MIT (eBPF-программы под GPLv2).

В Яндекс Perforator развёрнут в кластере, насчитывающем более 10 тысяч узлов, и применяется для выявления и исправления проблем с производительностью в различных сервисах. Отмечается, что благодаря устранению узких мест и оптимизации вычислений компании Яндекс удалось на 20% снизить расходы на серверы.

Заявленные возможности:

  • Использование подсистемы ядра eBPF для сборка сведений о работе компонентов ядра и пространства пользователя. Накладные расходы при сборе метрик оцениваются примерно в снижение производительности на 0.1%.
  • Масштабируемое хранилище для хранения профилей производительности. Для хранения метаданных профилей используется СУБД
    ClickHouse, для хранения бинарных метаданных – PostgreSQL, а для хранения raw-профилей и бинарных данных – любые хранилища, совместимые с Amazon S3.
  • Возможность раскрутки стека вызовов (unwinding) в системных окружениях без необходимости включения при сборке отладочных символов и опции “-fno-omit-frame-pointer” (сохраняет указатель на кадр стека, содержащий адреса возврата и переменные функции).
  • Наличие языка запросов и web-интерфейса для инспектирования нагрузки на CPU при работе приложений.

  • Для наглядной оценки узких мест применяется визуализация в стиле FlameGraph.

  • Возможность профилирования проектов, использующих различные языки и runtime, без внесения изменений в сборочные процессы и без перекомпиляции программ. Поддержка языков программирования C++, Go, Rust, Java, Python, JavaScript/Node.js.
  • Возможность генерации профилей sPGO для сборки приложений с оптимизации на основе результатов профилирования кода (PGO – Profile-guided optimization), позволяющей генерировать более оптимальный код на основе анализа особенностей выполнения программы.
  • Поддержка использования в качестве замены инструментария perf в Linux.
  • Автоматизация развёртывания в кластерах на базе Kubernetes. На каждом узле запускается специальный агент, собирающий (используется обработчик на базе eBPF и API perf_events), агрегирующий, сжимающий и передающий данные о производительности. Данные передаются агентами через gRPC в микросервисы, отвечающие за сбор, хранение, анализ, символизацию (преобразование адресов в имена функций и позиции в коде) и обработку профилей и исполняемых файлов (необходимы при раскрутке стека).



Release. Ссылка here.