Перейти к основному содержанию

Типы профилировщиков

В LLVM уже есть инструмент, который добавляет в код инструментацию и позволяет выполнять инструментальное профилирование. В отличие от сэмплирования или статистического профилирования, оно очень точно и не пропускает ни одного вызова, но требует инструментировать код и потребляет больше ресурсов. Если кратко, профилировщик с инструментированием добавляет в код новый код для отслеживания вызовов всех функций. Статистические профилировщики позволяют запускать код без каких-либо изменений, периодически создавая снимки, чтобы видеть состояние приложения. Поэтому учитываются только те функции, которые выполняются в момент создания снимка. perf — очень известный статистический профилировщик.

Профилирование ClickHouse с помощью интеграции XRay

В ClickHouse 25.12 XRay интегрирован так, чтобы можно было без проблем добавлять новые точки инструментирования в функции. Поэтому в любом официальном релизе эта возможность уже доступна и ее можно включать по мере необходимости, не влияя на общую производительность, когда она не включена. Идея в том, чтобы задействовать минимальное количество точек инструментирования и при этом получать ценную информацию. Мы можем добавить новую точку инструментирования для профилирования с помощью оператора SYSTEM INSTRUMENT ADD PROFILE. Функции, которые нужно инструментировать, можно получить из системной таблицы system.symbols. Допустим, мы хотим профилировать функцию sleepForNanoseconds — это удобная функция, чтобы проверить, сколько времени занимает ее выполнение.
Затем оставляем его работать на нужный нам период профилирования и останавливаем.
Мы преобразуем данные, собранные в system.trace_log, в формат Chrome, чтобы визуализировать их в Perfetto. Обратите внимание на query_id, cpu_id и трассировку стека для каждой записи.

Профилирование нативного приложения с помощью XRay

Следующий раздел оставлен в качестве справочного материала, чтобы показать, как XRay работает на низком уровне и как его можно использовать из коробки для профилирования нативного приложения.

Добавьте инструментацию в код

Представьте себе следующий исходный код:
Чтобы включить инструментирование с помощью XRay, нужно добавить несколько флагов, например:
  • -fxray-instrument нужен, чтобы инструментировать код.
  • -fxray-instruction-threshold=1 используется, чтобы инструментировать все функции, даже если они очень маленькие, как в нашем примере. По умолчанию инструментируются функции, содержащие не менее 200 инструкций.
Проверить, что код был инструментирован правильно, можно по появлению нового раздела в бинарном файле:

Запустите процесс с корректными значениями переменных окружения, чтобы собрать трассировку

По умолчанию сбор данных профилирования не выполняется, если он не запрошен явно. Иными словами, если профилирование не включено, накладные расходы пренебрежимо малы. Можно задать разные значения XRAY_OPTIONS, чтобы настроить, когда профилировщик начинает сбор данных и как именно он это делает.

Преобразование трассировки

Трассировки XRay можно преобразовать в несколько форматов. Формат trace_event очень полезен, потому что его легко разобрать, и уже есть ряд инструментов, которые его поддерживают, поэтому мы будем использовать именно его:

Визуализируйте трассировку

Можно использовать веб-интерфейсы, такие как speedscope.app или Perfetto. Хотя Perfetto упрощает визуализацию нескольких потоков и выполнение запросов к данным, speedscope лучше подходит для построения флеймграфа и представления данных в режиме «сэндвич».

Хронологический порядок

Перекос влево

Сэндвич

Ознакомьтесь с документацией

  • SYSTEM INSTRUMENT — Добавьте или удалите точки инструментирования.
  • system.instrumentation — Просматривайте инструментированные точки.
  • system.symbols — Просматривайте символы, чтобы добавлять точки инструментирования.
  • system.trace_log — Просматривайте данные, собранные с помощью точек инструментирования.
  • XRay Instrumentation
  • Документация Debugging with XRay с дополнительными сведениями.
Последнее изменение 19 июня 2026 г.