Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Профилирование выделения памяти для версий до 25.9

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 из профиля кучи можно получить данные во многих разных форматах. Чтобы узнать о способе использования и доступных параметрах, рекомендуется выполнить 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
Navigation