SYSTEM и команд four letter word (4LW) в Keeper. Просматривать результаты можно несколькими способами:
- Собирать образцы в
system.trace_logс типомJemallocSampleдля анализа отдельных запросов. - Просматривать статистику памяти в реальном времени и получать профили кучи через встроенный веб-интерфейс jemalloc (26.2+).
- Запрашивать текущий профиль кучи напрямую из SQL с помощью
system.jemalloc_profile_text(26.2+). - Анализировать фрагментацию памяти из SQL с помощью
system.jemalloc_sampled_allocations(26.9+). - Сбрасывать профили кучи на диск и анализировать их с помощью
jeprof.
Это руководство применимо к версиям 25.9+.
Для более старых версий см. профилирование выделения памяти для версий до 25.9.
Сэмплирование выделений памяти
Для сэмплирования и профилирования выделений памяти запустите ClickHouse/Keeper с включенной настройкойjemalloc_enable_global_profiler:
jemalloc будет выполнять сэмплирование аллокаций и хранить эту информацию во внутреннем хранилище.
Вы также можете включить сэмплирование для каждого запроса с помощью настройки jemalloc_enable_profiler.
Хранение образцов jemalloc в system.trace_log
Вы можете сохранять образцы jemalloc в system.trace_log с типом JemallocSample.
Чтобы включить это глобально, используйте параметр конфигурации jemalloc_collect_global_profile_samples_in_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+.
/jemalloc.
Он показывает метрики памяти в реальном времени в виде графиков, включая allocated, active, resident и mapped memory, а также статистику по arena и bin.
Вы также можете получать глобальные профили кучи и профили кучи отдельных запросов напрямую из интерфейса.
- ClickHouse
- Keeper
Получение профилей кучи через 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:
Анализ фрагментации из SQL
Этот раздел применим к версиям 26.9+.
system.jemalloc_arena_binsпоказывает, сколько памяти расходуется впустую каждым size class в каждой arena.waste— это байты, удерживаемые в слэбах, но не используемые живыми выделениями.purposeпомечает выделенные arenas (mergetree,jit,cache); они по своему назначению хранят долгоживущие данные, поэтому при поиске непредвиденной фрагментации отфильтруйте их условиемpurpose = ''.system.jemalloc_binsсодержит те же данные, просуммированные по arenas.system.jemalloc_sampled_allocationsперечисляет попавшие в выборку выделения, которые в данный момент живы, по одной строке на образец: стек вызовов (trace), время жизни (age_ns), размер и size class, а также arena. Чтение таблицы вызывает сброс нового профиля кучи.
- Образцы создают только потоки с включённым профилировщиком (
jemalloc_enable_global_profilerв конфигурации или настройкаjemalloc_enable_profiler). - Каждая строка соответствует примерно
weightреальных выделений, а мелкие выделения попадают в выборку редко. Скорректируйтеjemalloc_profiler_sampling_rate, если для интересующих вас size classes нет образцов. - Попавшие в выборку выделения не хранятся в слэбах, поэтому сами по себе они не увеличивают
waste. Они лишь показывают, какой код выделяет память в этом size class. - Каждый живой образец обходится в две дополнительные страницы (128 КиБ в сборках со страницами по 64 КиБ), пока выделение не будет освобождено. Отключение профилировщика останавливает создание новых образцов, но не освобождает уже существующие.
Пример: построение флеймграфа фрагментации
Тот же запрос может распределить потери каждого size class между его стеками вызовов пропорционально количеству старых выделений и вывести результат в форматеcollapsed для flamegraph.pl. Те size class, у которых есть потери, но нет достаточно старых образцов, попадают во фрейм [unattributed], так что итог флеймграфа равен суммарным потерям. Обращайтесь к system.jemalloc_sampled_allocations только один раз за запрос: при каждом чтении сбрасывается новый profile, поэтому два подзапроса увидят разные данные.
Сброс профилей кучи на диск
Если вам нужно сохранить профили кучи в виде файлов для офлайн-анализа с помощьюjeprof, их можно сбросить на диск.
По умолчанию файл профиля кучи создаётся в /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, где _pid_ — PID процесса ClickHouse, а _seqnum_ — глобальный порядковый номер текущего профиля кучи.
Для Keeper файлом по умолчанию будет /tmp/jemalloc_keeper._pid_._seqnum_.heap; для него действуют те же правила.
Чтобы сбросить текущий профиль:
- ClickHouse
- Keeper
MALLOC_CONF параметр prof_prefix.
Например, если вы хотите создавать профили в каталоге /data, где префиксом имени файла будет my_current_profile, можно запустить ClickHouse/Keeper со следующей переменной окружения:
Анализ файлов профиля кучи с помощью jeprof
После записи профилей кучи на диск их можно анализировать с помощью инструмента jeprof, входящего в jemalloc. Установить его можно несколькими способами:
- С помощью системного менеджера пакетов
- Клонировать репозиторий jemalloc и запустить
autogen.shиз корневой директории. После этого скриптjeprofпоявится в папкеbin
jeprof --help.
Символизированные профили кучи
Начиная с версии 26.1+, ClickHouse автоматически создает символизированные профили кучи при выполненииSYSTEM JEMALLOC FLUSH PROFILE.
Символизированный профиль (с расширением .symbolized) содержит встроенные символьные имена функций, поэтому его можно анализировать с помощью jeprof без бинарного файла ClickHouse.
Например, если вы выполните:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
Затем его можно проанализировать напрямую с помощью jeprof:
Бинарный файл не требуется: При использовании символизированных профилей (файлов
.symbolized) вам не нужно указывать для jeprof путь к бинарному файлу 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.pl:
Дополнительные параметры профилировщика
У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.
Справочник
Команда jmst 4LW в Keeper
Keeper поддерживает команду jmst 4LW, которая возвращает основную статистику аллокатора: