ClickHouse использует jemalloc в качестве глобального аллокатора. В jemalloc есть инструменты для сэмплирования выделений памяти и профилирования.
Чтобы упростить профилирование выделения памяти, доступны команды SYSTEM, а также четырёхбуквенные команды (4LW) в Keeper.
Сэмплирование выделений памяти и сброс профилей кучи
Если вы хотите включить сэмплирование и профилирование выделений памяти в jemalloc, необходимо запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF:
MALLOC_CONF=background_thread:true,prof:true,prof_active:truejemalloc будет выборочно сэмплировать выделения памяти и хранить эту информацию внутри.
Вы можете указать jemalloc сбросить текущий профиль, выполнив:
SYSTEM JEMALLOC FLUSH PROFILEecho jmfp | nc localhost 9181По умолчанию файл профиля кучи будет создан в /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 PROFILEecho jmdp | nc localhost 9181Чтобы включить профилировщик:
SYSTEM JEMALLOC ENABLE PROFILEecho jmep | nc localhost 9181Начальным состоянием профилировщика также можно управлять с помощью параметра 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