Профилирование аллокации
ClickHouse использует jemalloc в качестве своего глобального аллокатора, который предоставляет некоторые инструменты для выборки и профилирования аллокации.
Для удобства профилирования аллокации предоставляются команды SYSTEM
наряду с командами 4LW в Keeper.
Выборка аллокаций и сброс профилей кучи
Если мы хотим выбрать и профилировать аллокации в jemalloc
, нам нужно запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF
.
jemalloc
будет выборочно фиксировать аллокации и хранить информацию внутри.
Мы можем сказать jemalloc
сбросить текущий профиль, выполнив:
- ClickHouse
- Keeper
SYSTEM JEMALLOC FLUSH PROFILE
echo jmfp | nc localhost 9181
По умолчанию файл профиля кучи будет сгенерирован в /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 были запущены с включенным профайлером, они поддерживают дополнительные команды для отключения/включения профилирования аллокации во время выполнения.
Используя эти команды, проще профилировать только конкретные интервалы.
Отключить профайлер:
- ClickHouse
- Keeper
SYSTEM JEMALLOC DISABLE PROFILE
echo jmdp | nc localhost 9181
Включить профайлер:
- ClickHouse
- Keeper
SYSTEM JEMALLOC ENABLE PROFILE
echo jmep | nc localhost 9181
Также возможно контролировать начальное состояние профайлера, установив опцию prof_active
, которая по умолчанию включена.
Например, если мы не хотим выбирать аллокации во время запуска, а только после того, как включим профайлер, мы можем запустить ClickHouse/Keeper с следующей переменной окружения:
и включить профайлер позже.
Дополнительные параметры для профайлера
jemalloc
имеет множество различных доступных опций, связанных с профайлером, которые можно контролировать, изменяя переменную окружения MALLOC_CONF
.
Например, интервал между выборками аллокаций можно контролировать с помощью lg_prof_sample
.
Если вы хотите сбрасывать профиль кучи каждые N байт, вы можете включить это с помощью lg_prof_interval
.
Рекомендуем проверить страницу справки jemalloc
для таких опций.
Другие ресурсы
ClickHouse/Keeper предоставляют метрики, связанные с jemalloc
, различными способами.
Важно понимать, что ни одна из этих метрик не синхронизирована между собой, и значения могут изменяться.
Системная таблица asynchronous_metrics
Системная таблица jemalloc_bins
Содержит информацию о аллокациях памяти, выполненных через аллокатор jemalloc в различных классах размеров (bins), агрегированных из всех арен.
Prometheus
Все метрики, связанные с jemalloc
из asynchronous_metrics
, также доступны через Prometheus endpoint как в ClickHouse, так и в Keeper.
Команда jmst
4LW в Keeper
Keeper поддерживает команду jmst
4LW, которая возвращает основную статистику аллокатора.
Пример: