Профилирование выделения памяти
ClickHouse использует jemalloc в качестве своего глобального аллокатора. Jemalloc предоставляет некоторые инструменты для выборки и профилирования выделений памяти.
Для упрощения профилирования выделения памяти, ClickHouse и Keeper позволяют вам управлять выборкой с использованием конфигураций, настроек запросов, команд SYSTEM
и команд из четырех букв (4LW) в Keeper.
Кроме того, выборки могут быть собраны в таблицу system.trace_log
под типом JemallocSample
.
Этот справочник применим для версий 25.9 и выше.
Для более ранних версий смотрите профилирование выделения для версий до 25.9.
Выборка выделений
Если вы хотите выполнять выборку и профилирование выделений в jemalloc
, вам необходимо запустить 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
.
Пример анализа использования памяти запроса с использованием system.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
:
и выполним запрос, чтобы получить использование памяти запроса в каждой точке времени:
Мы также можем найти момент, когда использование памяти было максимальным:
Мы можем использовать этот результат, чтобы увидеть, откуда произошло наибольшее количество активных выделений в этот момент времени:
Сброс профилей кучи
По умолчанию файл профиля кучи будет генерироваться в /tmp/jemalloc_clickhouse._pid_._seqnum_.heap
, где _pid_
— это PID ClickHouse, а _seqnum_
— глобальный номер последовательности для текущего профиля кучи.
Для Keeper файл по умолчанию — /tmp/jemalloc_keeper._pid_._seqnum_.heap
и следует тем же правилам.
Вы можете указать jemalloc
, чтобы сбросить текущий профиль, выполнив:
- ClickHouse
- Keeper
Он вернет расположение сброшенного профиля.
Другое местоположение можно определить, добавив переменную среды MALLOC_CONF
с опцией prof_prefix
.
Например, если вы хотите генерировать профили в папке /data
, где префикс имени файла будет my_current_profile
, вы можете запустить ClickHouse/Keeper с следующей переменной среды:
Сгенерированный файл будет добавлен к префиксу PID и номеру последовательности.
Анализ профилей кучи
После генерации профилей кучи их необходимо проанализировать.
Для этого можно использовать инструмент jemalloc
, называемый jeprof. Установить его можно несколькими способами:
- С использованием пакетного менеджера системы
- Клонировав репозиторий jemalloc и запустив
autogen.sh
из корневой папки. Это обеспечит вас скриптомjeprof
внутри папкиbin
jeprof
использует addr2line
для генерации стековых трассировок, что может быть довольно медленно.
Если это так, рекомендуется установить альтернативную реализацию этого инструмента.
Кроме того, llvm-addr2line
работает не хуже.
Существует много разных форматов, которые можно сгенерировать из профиля кучи с помощью jeprof
.
Рекомендуется запустить jeprof --help
для получения информации о том, как использовать инструмент и о различных доступных параметрах.
В общем, команда jeprof
используется следующим образом:
Если вы хотите сравнить, какие выделения произошли между двумя профилями, вы можете установить аргумент base
:
Примеры
- если вы хотите сгенерировать текстовый файл с каждой процедурой, записанной в строку:
- если вы хотите сгенерировать 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 в разных размерах классов (бинов), агрегированных из всех арен.
Prometheus
Все метрики, связанные с jemalloc
, из asynchronous_metrics
также доступны через эндпоинт Prometheus как в ClickHouse, так и в Keeper.
Команда jmst
4LW в Keeper
Keeper поддерживает команду jmst
4LW, которая возвращает основные статистические данные аллокатора: