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