Профилирование аллокаций
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 с следующей переменной окружения:
Сгенерированный файл будет дополняться префиксом 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 были запущены с включенным профайлером, они поддерживают дополнительные команды для отключения / включения профилирования аллокаций во время выполнения. С помощью этих команд легче профилировать только определенные интервалы.
Отключить профайлер:
- 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 как в ClickHouse, так и в Keeper.
Команда jmst
4LW в Keeper
Keeper поддерживает команду jmst
4LW, которая возвращает основную статистику аллокатора.
Пример: