Перейти к основному содержанию
ClickHouse использует jemalloc в качестве глобального аллокатора. В jemalloc есть инструменты для сэмплирования выделений памяти и профилирования. Чтобы упростить профилирование выделения памяти, доступны команды SYSTEM, а также четырёхбуквенные команды (4LW) в Keeper.

Сэмплирование выделений памяти и сброс профилей кучи

Если вы хотите включить сэмплирование и профилирование выделений памяти в jemalloc, необходимо запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF:
MALLOC_CONF=background_thread:true,prof:true,prof_active:true
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 со следующей переменной окружения:
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile
К имени сгенерированного файла будут добавлены префикс PID и порядковый номер.

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

После создания профили кучи необходимо проанализировать. Для этого можно использовать инструмент jemalloc под названием jeprof. Установить его можно несколькими способами:
  • С помощью системного менеджера пакетов
  • Клонировать репозиторий jemalloc и запустить autogen.sh из корневого каталога. В результате в каталоге bin появится скрипт jeprof
jeprof использует addr2line для генерации трассировок стека, что может быть довольно медленно. В этом случае рекомендуется установить альтернативную реализацию этого инструмента.
git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0
cd addr2line
cargo build --features bin --release
cp ./target/release/addr2line path/to/current/addr2line
С помощью jeprof из профиля кучи можно получить данные во многих разных форматах. Чтобы узнать о способе использования и доступных параметрах, рекомендуется выполнить jeprof --help. В общем случае команда jeprof выглядит так:
jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]
Если вы хотите сравнить, какие выделения памяти произошли между двумя профилями, можно задать аргумент base:
jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]

Примеры

  • если вы хотите создать текстовый файл, где каждая процедура записана в отдельной строке:
jeprof path/to/binary path/to/heap/profile --text > result.txt
  • если вы хотите сгенерировать PDF-файл с графом вызовов:
jeprof path/to/binary path/to/heap/profile --pdf > result.pdf

Создание флеймграфа

jeprof позволяет генерировать свёрнутые стеки для построения флеймграфов. Для этого нужно использовать аргумент --collapsed:
jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed
После этого можно использовать множество различных инструментов для визуализации свёрнутых стеков. Самый популярный из них — FlameGraph, в состав которого входит скрипт flamegraph.pl:
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg
Ещё один интересный инструмент — speedscope, который позволяет анализировать собранные стеки в более интерактивном режиме.

Управление профилировщиком выделения памяти во время выполнения

Если ClickHouse/Keeper запущен с включенным профилировщиком, во время выполнения доступны дополнительные команды для включения и отключения профилирования выделения памяти. С их помощью проще профилировать только определенные интервалы. Чтобы отключить профилировщик:
SYSTEM JEMALLOC DISABLE PROFILE
Чтобы включить профилировщик:
SYSTEM JEMALLOC ENABLE PROFILE
Начальным состоянием профилировщика также можно управлять с помощью параметра prof_active, который по умолчанию включен. Например, если вы не хотите выполнять выборку выделений памяти во время запуска, а только после него, можно включить профилировщик позже. Вы можете запустить ClickHouse/Keeper со следующей переменной окружения:
MALLOC_CONF=background_thread:true,prof:true,prof_active:false
Профилировщик можно включить позже.

Дополнительные параметры для профилировщика

У jemalloc есть множество параметров, относящихся к профилировщику. Ими можно управлять, изменяя переменную окружения MALLOC_CONF. Например, интервал между выборками выделения памяти можно задать с помощью lg_prof_sample. Если вы хотите выгружать профиль кучи каждые N байт, включите это с помощью lg_prof_interval. Чтобы получить полный список параметров, рекомендуется обратиться к странице справки jemalloc.

Другие ресурсы

ClickHouse/Keeper предоставляют метрики, связанные с jemalloc, различными способами.
ПредупреждениеВажно помнить, что эти метрики не синхронизированы друг с другом, и их значения могут расходиться.

Системная таблица asynchronous_metrics

SELECT *
FROM system.asynchronous_metrics
WHERE metric LIKE '%jemalloc%'
FORMAT Vertical
Справочник

Системная таблица jemalloc_bins

Содержит информацию о выделении памяти через аллокатор jemalloc в различных классах размеров (bins), собранную по всем аренам. Справочник

Prometheus

Все метрики, связанные с jemalloc, из asynchronous_metrics также экспортируются через конечную точку Prometheus как в ClickHouse, так и в Keeper. Справочник

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

Keeper поддерживает команду 4LW jmst, которая возвращает базовую статистику аллокатора памяти:
echo jmst | nc localhost 9181
Последнее изменение 10 июня 2026 г.