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

Профилирование аллокаций

ClickHouse использует jemalloc в качестве своего глобального аллокатора, который поставляется с некоторыми инструментами для выборки и профилирования аллокаций.
Чтобы сделать профилирование аллокаций более удобным, предоставляются команды SYSTEM вместе с командами 4LW в Keeper.

Выборка аллокаций и сброс профилей кучи

Если мы хотим выбрать и профилировать аллокации в jemalloc, нам нужно запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF.

jemalloc будет выбирать аллокации и хранить информацию внутренне.

Мы можем заставить jemalloc сбросить текущий профиль, выполнив:

SYSTEM JEMALLOC FLUSH PROFILE

По умолчанию файл профиля кучи будет сгенерирован в /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, где _pid_ - это PID ClickHouse, а _seqnum_ - это глобальный последовательный номер для текущего профиля кучи.
Для Keeper файл по умолчанию - /tmp/jemalloc_keeper._pid_._seqnum_.heap, следуя тем же правилам.

Другую локацию можно определить, добавив к переменной окружения MALLOC_CONF опцию prof_prefix.
Например, если мы хотим генерировать профили в папке /data, где префиксом для имени файла будет my_current_profile, мы можем запустить ClickHouse/Keeper с следующей переменной окружения:

Сгенерированный файл будет дополняться префиксом PID и номером последовательности.

Анализ профилей кучи

После того как мы сгенерировали профили кучи, нам нужно их проанализировать.
Для этого нам нужно использовать инструмент jemalloc, называемый jeprof, который можно установить несколькими способами:

  • установив jemalloc с помощью менеджера пакетов системы
  • clone jemalloc repo и запустив autogen.sh из корневой папки, что обеспечит вас скриптом jeprof внутри папки bin
примечание

jeprof использует addr2line для генерации трассировок стека, что может быть действительно медленным.
Если это так, мы рекомендуем установить альтернативную реализацию инструмента.

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

В общем, команда jeprof будет выглядеть так:

Если мы хотим сравнить, какие аллокации произошли между 2 профилями, мы можем установить базовый аргумент:

Например:

  • если мы хотим сгенерировать текстовый файл с каждой процедурой, записанной по строкам:
  • если мы хотим сгенерировать PDF файл с графом вызовов:

Генерация огненной графики

jeprof позволяет нам генерировать сжатые стеки для построения огненных графиков.

Нам нужно использовать аргумент --collapsed:

После этого мы можем использовать множество различных инструментов для визуализации сжатых стеков.

Наиболее популярным является FlameGraph, который содержит скрипт под названием flamegraph.pl:

Еще одним интересным инструментом является speedscope, который позволяет вам более интерактивно анализировать собранные стеки.

Управление профайлером аллокаций во время выполнения

Если ClickHouse/Keeper были запущены с включенным профайлером, они поддерживают дополнительные команды для отключения / включения профилирования аллокаций во время выполнения. С помощью этих команд легче профилировать только определенные интервалы.

Отключить профайлер:

SYSTEM JEMALLOC DISABLE PROFILE

Включить профайлер:

SYSTEM JEMALLOC ENABLE PROFILE

Также возможно управлять начальным состоянием профайлера, устанавливая опцию prof_active, которая по умолчанию включена.
Например, если мы не хотим выбирать аллокации во время запуска, а только после того, как мы активируем профайлер, мы можем запустить ClickHouse/Keeper с следующей переменной окружения:

и включить профайлер позже.

Дополнительные параметры для профайлера

jemalloc имеет много различных опций, доступных, связанных с профилером, которые можно контролировать, изменяя переменную окружения MALLOC_CONF. Например, интервал между выборками аллокаций можно контролировать с помощью lg_prof_sample.
Если вы хотите сбрасывать профиль кучи каждые N байт, вы можете включить это с помощью lg_prof_interval.

Мы рекомендуем проверить справочную страницу jemalloc для таких опций.

Другие ресурсы

ClickHouse/Keeper отображают метрики, связанные с jemalloc, во многих разных форматах.

Warning

Важно понимать, что ни одна из этих метрик не синхронизирована друг с другом, и значения могут колебаться.

Системная таблица asynchronous_metrics

Ссылка

Системная таблица jemalloc_bins

Содержит информацию о аллокациях памяти, выполненных через аллокатор jemalloc в разных классах размеров (бин, bins), агрегированных из всех арен.

Ссылка

Prometheus

Все метрики, связанные с jemalloc, из asynchronous_metrics также доступны через конечную точку Prometheus как в ClickHouse, так и в Keeper.

Ссылка

Команда jmst 4LW в Keeper

Keeper поддерживает команду jmst 4LW, которая возвращает основную статистику аллокатора.

Пример: