Мониторинг загрузки ЦП для приложений Apache Flink с Flame Graph

Flame Graph Разработка и отладка Flink-приложений, Apache Flink для разработчиков и дата-инженеров примеры курсы обучение, потоковая обработка данных Flink, обучение дата-инженеров и разработчиков курсы примеры, Школа Больших Данных Учебный Центр Коммерсант

Мы уже писали о важности отслеживания системных метрик приложений Apache Flink и RocksDB, используемой этим фреймворком для хранения состояния stateful-заданий. Сегодня рассмотрим, как отследить потребление ресурсов ЦП средствами встроенной визуализации Flame Graphs.

Что такое Flame Graph и зачем это нужно?

Помимо мониторинга длительности выполнения задач и заданий, дата-инженерам и разработчикам распределенных Flink-приложений также полезно знать о потреблении ресурсов ЦП и оперативной памяти. В Apache Flink версии 1.17 это можно наглядно увидеть с помощью Flame Graph – интерактивной SVG-визуализации, которая детализирована до уровня задач.

Flame Graph – это визуализация иерархических данных трассировки стека профилированного ПО, которая была разработана инженером Netflix Бренданом Греггом для решения проблем с производительностью MySQL. Чтобы быстро и подробно понять потребление ресурсов ЦП вместо изучения большого количества текстовой информации, генерируемой обычными средствами профилирования и трассировки ПО, Брендан Грегг проследил вызовы функций ЦП и визуализировал их. Получившиеся графики были похожи на пламя с отслеживанием времени по оси Х. Чтобы снизить накладные расходы на трассировку функций, Брендан сделал выборку (профилирование) синхронизированным и изменил порядок выборки, чтобы максимизировать слияние кадров. Для повышения наглядности потребления ресурсов ЦП Брендан решил использовать только теплые цвета, чтобы показать занятость CPU.

Flame-график сортирует и агрегирует трассировки на каждом уровне стека, чтобы их количество отражало процент от общего времени, затраченного ЦП в этой части кода. По оси X отображается заполнение профиля стека, отсортированное в алфавитном порядке, а по оси Y показана глубина стека, считая снизу от нуля. Каждый прямоугольник представляет кадр стека. Чем шире рамка, тем чаще она встречается на графике. Flame-графики строятся путем многократной выборки трассировки стека. Каждый вызов метода представлен полосой, длина которой пропорциональна тому, сколько раз она присутствует в выборке. Верхний край показывает, что находится на ЦП, а под ним — его происхождение. Flame-графики представляют как статическую, так и динамическую (интерактивную) визуализацию.

Использование Flame-графиков в Apache Flink

В Apache Flink эти графики позволяют ответить на следующие вопросы:

  • Какие методы в настоящее время потребляют ресурсы ЦП?
  • Как потребление одним методом по сравнению с другими?
  • Какая серия вызовов в стеке привела к выполнению определенного метода?

Flame-графики поддерживаются в Apache Flink, начиная с версии 1.13. Чтобы создать эту визуализацию, надо в веб-GUI приложения Apache Flink перейти к графу выполняемого задания, выбрать интересующий оператор и в меню выбрать соответствующую вкладку.

Flame-график в Apache Flink
Flame-график в Apache Flink

При этом стоит помнить, что любой процесс измерения сам по себе неизбежно влияет на предмет измерения. Чтобы предотвратить непреднамеренное воздействие на производственную среду, Flame Graphs в Apache Flink доступны в качестве дополнительной функции. Чтобы включить ее, нужно установить параметр rest.flamegraph.enabled в значение true в конфигурационном файле conf/flink-conf.yaml. Это желательно делать в средах разработки, тестирования и предварительной эксплуатации, но не в производственном развертывании.

Помимо Flame-графиков ЦП, можно посмотреть и визуализацию вне ЦП, а также включить смешанный режим. Off-CPU Flame Graph визуализирует блокирующие вызовы, обнаруженные в выборках. Состояние потоков отслеживается следующим образом:

  • On-CPU: Thread.State в [RUNNABLE, NEW]
  • Off-CPU: Thread.State в [TIMED_WAITING, WAITING, BLOCKED]
Flame Graph Flink
Разные режимы Flame-графиков

Сбор трассировки стека выполняется исключительно внутри JVM, поэтому видны только вызовы методов в среде выполнения Java без системных вызовов. По умолчанию построение Flame Graph выполняется на уровне отдельного оператора, т. е. все потоки задач этого оператора отбираются параллельно, а их трассировки стека объединяются. Если вызов метода потребляет 100% ресурсов в одной из параллельных задач, но не потребляет в других, узкое место может быть скрыто за счет усреднения.

Как уже было отмечено выше, начиная с версии 1.17, Flame Graph в Apache Flink обеспечивает визуализацию до уровня задач и подзадач. Это удобно при тестировании и отладке распределенных Flink-приложений в высоконагруженных системах аналитики больших данных.

Flink Flame Graph subtask level
Детализация на подзадачи

О других профилировщиках Flink-приложений читайте в нашей новой статье.

Потоковая обработка данных с помощью Apache Flink

Код курса
FLINK
Ближайшая дата курса
28 октября, 2024
Продолжительность
16 ак.часов
Стоимость обучения
48 000 руб.

Узнайте больше про применение Apache Flink для потоковой обработки событий в распределенных приложениях аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/ops/debugging/flame_graphs/
  2. https://habr.com/ru/companies/otus/articles/523148/
  3. https://www.brendangregg.com/flamegraphs.html
Поиск по сайту