Профилирование выделения памяти для версий до 25.9
ClickHouse использует jemalloc в качестве глобального драйвера памяти. Jemalloc предоставляет инструменты для выборки и профилирования выделения памяти.
Чтобы сделать профилирование выделения памяти более удобным, предоставляются команды SYSTEM
, а также команды четырехбуквенных слов (4LW) в Keeper.
Выборка выделений и сброс профилей кучи
Если вы хотите осуществить выборку и профилирование выделений в jemalloc
, вам нужно запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF
:
jemalloc
будет выборочно фиксировать выделения и хранить информацию внутри себя.
Вы можете указать jemalloc
сбросить текущий профиль, выполнив:
- ClickHouse
- Keeper
По умолчанию файл профиля кучи будет сгенерирован в /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 и запустив
autogen.sh
из корневой папки. Это предоставит вам скриптjeprof
в папкеbin
jeprof
использует addr2line
для генерации стек-трассировок, что может быть довольно медленно.
В таком случае рекомендуется установить альтернативную реализацию инструмента.
Существует множество различных форматов, которые можно сгенерировать из профиля кучи с помощью jeprof
.
Рекомендуется запустить jeprof --help
для получения информации об использовании и различных опциях, предоставляемых инструментом.
В общем, команда jeprof
используется следующим образом:
Если вы хотите сравнить, какие выделения произошли между двумя профилями, вы можете установить аргумент base
:
Примеры
- если вы хотите сгенерировать текстовый файл с каждой процедурой, записанной на отдельной строке:
- если вы хотите сгенерировать PDF файл с графом вызовов:
Генерация графика пламен
jeprof
позволяет вам генерировать сжатые стеки для построения графиков пламен.
Вам нужно использовать аргумент --collapsed
:
После этого вы можете использовать множество различных инструментов для визуализации сжатых стеков.
Самым популярным является FlameGraph, который содержит скрипт под названием flamegraph.pl
:
Другим интересным инструментом является speedscope, который позволяет вам более интерактивно анализировать собранные стеки.
Управление профилировщиком выделения во время выполнения
Если ClickHouse/Keeper запущен с включенным профилировщиком, поддерживаются дополнительные команды для отключения/включения профилирования выделения во время выполнения. Используя эти команды, легче профилировать только определенные интервалы.
Чтобы отключить профилировщик:
- ClickHouse
- Keeper
Чтобы включить профилировщик:
- ClickHouse
- Keeper
Также возможно контролировать начальное состояние профилировщика, установив опцию 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, которая возвращает основные статистические данные аллокатора: