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

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

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 с следующей переменной окружения:

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

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

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

  • установив jemalloc с помощью пакетного менеджера системы
  • клонируя репозиторий jemalloc и запустив 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 endpoint как в ClickHouse, так и в Keeper.

Ссылка

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

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

Пример: