Перейти к основному содержанию
ClickHouse использует jemalloc в качестве глобального аллокатора. Jemalloc включает инструменты для сэмплирования выделений памяти и профилирования. ClickHouse и Keeper позволяют управлять сэмплированием с помощью конфигурационных файлов, настроек запроса, команд SYSTEM и команд four letter word (4LW) в Keeper. Просматривать результаты можно несколькими способами:
  • Собирать образцы в system.trace_log с типом JemallocSample для анализа отдельных запросов.
  • Просматривать статистику памяти в реальном времени и получать профили кучи через встроенный веб-интерфейс jemalloc (26.2+).
  • Запрашивать текущий профиль кучи напрямую из SQL с помощью system.jemalloc_profile_text (26.2+).
  • Сбрасывать профили кучи на диск и анализировать их с помощью jeprof.
Это руководство применимо к версиям 25.9+. Для более старых версий см. профилирование выделения памяти для версий до 25.9.

Сэмплирование выделений памяти

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

Хранение образцов jemalloc в system.trace_log

Вы можете сохранять образцы jemalloc в system.trace_log с типом JemallocSample. Чтобы включить это глобально, используйте параметр конфигурации jemalloc_collect_global_profile_samples_in_trace_log:
ПредупреждениеПоскольку ClickHouse — приложение с интенсивным выделением памяти, сбор всех образцов в system.trace_log может приводить к высокой нагрузке.
Вы также можете включать это для отдельных запросов с помощью настройки jemalloc_collect_profile_samples_in_trace_log.

Пример: анализ использования памяти запросом

Сначала выполните запрос с включенным профилировщиком jemalloc и соберите образцы в system.trace_log:
Если ClickHouse был запущен с jemalloc_enable_global_profiler, включать jemalloc_enable_profiler не нужно. То же самое относится к jemalloc_collect_global_profile_samples_in_trace_log и jemalloc_collect_profile_samples_in_trace_log.
Сбросьте system.trace_log:
Затем выполните запрос к ней, чтобы получить накопленное использование памяти во времени:
Найдите момент времени, когда использование памяти было максимальным:
Используя этот результат, посмотрите, какие стеки аллокаций были наиболее активны в пиковый момент:

Веб-интерфейс jemalloc

Этот раздел актуален для версий 26.2+.
ClickHouse предоставляет встроенный веб-интерфейс для просмотра статистики памяти jemalloc по HTTP-конечной точке /jemalloc. Он показывает метрики памяти в реальном времени в виде графиков, включая allocated, active, resident и mapped memory, а также статистику по arena и bin. Вы также можете получать глобальные профили кучи и профили кучи отдельных запросов напрямую из интерфейса.
Интерфейс сервера включает все вкладки: Summary, Allocations, Arenas, Operations, Global Profiler, Query Profiler и Raw Output.

Получение профилей кучи через SQL

Этот раздел относится к версиям 26.2+.
Системная таблица system.jemalloc_profile_text позволяет получать и просматривать текущий профиль кучи jemalloc прямо из SQL, без использования внешних инструментов и без предварительной записи на диск. Таблица содержит один столбец: К таблице можно обращаться напрямую — предварительно записывать профиль кучи на диск не требуется:

Формат вывода

Формат вывода задаётся настройкой jemalloc_profile_text_output_format, которая поддерживает три значения:
  • raw — необработанный профиль кучи, созданный jemalloc.
  • symbolized — формат, совместимый с jeprof, со встроенными символами функций. Поскольку символы уже встроены, jeprof может анализировать вывод без бинарного файла ClickHouse.
  • collapsed (по умолчанию) — свёрнутый стек в формате, совместимом с FlameGraph: по одному стеку на строку с количеством байтов.
Например, чтобы получить необработанный профиль:
Чтобы получить символизированный вывод:

Дополнительные настройки

  • jemalloc_profile_text_symbolize_with_inline (Bool, по умолчанию: true) — Включать ли инлайн-фреймы при символизации. Отключение этого параметра значительно ускоряет символизацию, но снижает точность, поскольку инлайн-вызовы функций не будут отображаться в стеках. Влияет только на форматы symbolized и collapsed.
  • jemalloc_profile_text_collapsed_use_count (Bool, по умолчанию: false) — При использовании формата collapsed выполнять агрегацию по числу аллокаций, а не по байтам.

Пример: создание флеймграфа из SQL

Поскольку формат вывода по умолчанию — collapsed, вы можете сразу передать вывод в FlameGraph:
Чтобы построить флеймграф по числу аллокаций, а не по байтам:

Сброс профилей кучи на диск

Если вам нужно сохранить профили кучи в виде файлов для офлайн-анализа с помощью jeprof, их можно сбросить на диск. По умолчанию файл профиля кучи создаётся в /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 и порядковый номер.

Анализ файлов профиля кучи с помощью jeprof

После записи профилей кучи на диск их можно анализировать с помощью инструмента jeprof, входящего в jemalloc. Установить его можно несколькими способами:
  • С помощью системного менеджера пакетов
  • Клонировать репозиторий jemalloc и запустить autogen.sh из корневой директории. После этого скрипт jeprof появится в папке bin
Доступно множество различных форматов вывода. Полный список параметров можно посмотреть, выполнив jeprof --help.

Символизированные профили кучи

Начиная с версии 26.1+, ClickHouse автоматически создает символизированные профили кучи при выполнении SYSTEM JEMALLOC FLUSH PROFILE. Символизированный профиль (с расширением .symbolized) содержит встроенные символьные имена функций, поэтому его можно анализировать с помощью jeprof без бинарного файла ClickHouse. Например, если вы выполните:
ClickHouse вернёт путь к символизированному профилю кучи (например, /tmp/jemalloc_clickhouse.12345.0.heap.symbolized). Затем его можно проанализировать напрямую с помощью jeprof:
Бинарный файл не требуется: При использовании символизированных профилей (файлов .symbolized) вам не нужно указывать для jeprof путь к бинарному файлу ClickHouse. Это значительно упрощает анализ профилей на разных машинах или после обновления бинарного файла.
Если у вас есть старый несимволизированный профиль кучи и у вас по-прежнему есть доступ к бинарному файлу ClickHouse, вы можете использовать традиционный подход:
Для профилей без символов jeprof использует addr2line для построения трассировки стека, и это может работать очень медленно. В таком случае рекомендуется установить альтернативную реализацию этого инструмента.
В качестве альтернативы можно использовать llvm-addr2line — он работает не хуже (но учтите, что llvm-objdump несовместим с jeprof)Затем используйте его так: jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt
При сравнении двух профилей можно использовать аргумент --base:

Примеры

Использование символизированных профилей (рекомендуется):
  • Создайте текстовый файл, где каждая процедура указана на отдельной строке:
  • Сгенерируйте PDF-файл с графом вызовов:
Использование профилей без символьной информации (требуется бинарный файл):
  • Создайте текстовый файл, в котором каждая процедура записана на отдельной строке:
  • Сгенерируйте PDF-файл с графом вызовов:

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

jeprof позволяет формировать свёрнутые стеки для построения флеймграфов. Нужно использовать аргумент --collapsed:
Или с профилем без символизации:
После этого вы можете использовать множество различных инструментов для визуализации свёрнутых стеков. Самый популярный — FlameGraph, в состав которого входит скрипт flamegraph.pl:
Ещё один интересный инструмент — speedscope, который позволяет более интерактивно анализировать собранные стеки.

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

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

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

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

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

Справочник

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

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

Системная таблица jemalloc_stats (26.2+)

Возвращает полный вывод malloc_stats_print() в виде одной текстовой строки. Эквивалентна команде SYSTEM JEMALLOC STATS.

Prometheus

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

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

Keeper поддерживает команду jmst 4LW, которая возвращает основную статистику аллокатора:
Последнее изменение 2 июля 2026 г.