Профилирование выделения
ClickHouse использует jemalloc в качестве своего глобального диспетчера памяти, который включает инструменты для выборки и профилирования выделений.
Чтобы сделать профилирование выделения более удобным, в ClickHouse/Keeper доступны команды SYSTEM наряду с командами 4LW.
Выборка выделений и сброс профилей кучи
Если мы хотим выбрать и профилировать выделения в jemalloc, нам нужно запустить ClickHouse/Keeper с включенным профилированием, используя переменную окружения MALLOC_CONF.
jemalloc будет выборочно выполнять выделения и хранить информацию внутри.
Мы можем сказать jemalloc, чтобы он сбросил текущий профиль, выполнив:
- ClickHouse
- Keeper
SYSTEM JEMALLOC FLUSH PROFILE
echo 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 со следующей переменной окружения:
Сгенерированный файл будет дополнен PID и номером последовательности.
Анализ профилей кучи
После того как мы создали профили кучи, нам нужно их проанализировать.
Для этого необходимо использовать инструмент jemalloc, называемый jeprof, который можно установить несколькими способами:
- установив
jemallocс помощью менеджера пакетов системы - клонируя репозиторий jemalloc и запустив autogen.sh из корневой папки, что обеспечит вам скрипт
jeprofв папкеbin
jeprof использует addr2line для генерации стек-трейсов, что может быть довольно медленным.
Если это так, мы рекомендуем установить альтернативную реализацию этого инструмента.
Существует множество различных форматов для генерации из профиля кучи с использованием jeprof.
Рекомендуем запустить jeprof --help, чтобы проверить использование и множество различных опций, которые предоставляет этот инструмент.
В целом, команда jeprof будет выглядеть так:
Если мы хотим сравнить, какие выделения произошли между 2 профилями, мы можем установить базовый аргумент:
Например:
- если мы хотим создать текстовый файл, где каждая процедура будет написана на отдельной строке:
- если мы хотим создать PDF-файл с графом вызовов:
Генерация графика пламени
jeprof позволяет нам генерировать сжатые стеки для создания графиков пламени.
Нам нужно использовать аргумент --collapsed:
После этого можно использовать множество различных инструментов для визуализации сжатых стеков.
Наиболее популярным будет FlameGraph, который содержит скрипт под названием flamegraph.pl:
Еще одним интересным инструментом является speedscope, который позволяет вам анализировать собранные стеки более интерактивно.
Управление профилировщиком выделений во время выполнения
Если ClickHouse/Keeper были запущены с включенным профилировщиком, они поддерживают дополнительные команды для отключения/включения профилирования выделений во время выполнения.
С помощью этих команд проще профилировать только определенные интервалы.
Отключить профилировщик:
- ClickHouse
- Keeper
SYSTEM JEMALLOC DISABLE PROFILE
echo jmdp | nc localhost 9181
Включить профилировщик:
- ClickHouse
- Keeper
SYSTEM JEMALLOC ENABLE PROFILE
echo jmep | nc localhost 9181
Также возможно контролировать начальное состояние профилировщика, установив опцию prof_active, которая включена по умолчанию.
Например, если мы не хотим выборочно выполнять выделения во время запуска, а только после включения профилировщика, мы можем запустить ClickHouse/Keeper со следующей переменной окружения:
и включить профилировщик позже.
Дополнительные опции для профилировщика
jemalloc имеет множество различных опций, связанных с профилировщиком, которые можно контролировать, изменяя переменную окружения MALLOC_CONF.
Например, интервал между выборками выделений можно контролировать с помощью lg_prof_sample.
Если вы хотите сбрасывать профиль кучи каждые N байт, вы можете включить это с помощью lg_prof_interval.
Рекомендуем проверить справочную страницу jemalloc для таких опций.
Другие ресурсы
ClickHouse/Keeper предоставляют метрики, связанные с jemalloc, множеством различных способов.
Важно быть в курсе того, что ни одна из этих метрик не синхронизирована между собой и значения могут изменяться.
Системная таблица asynchronous_metrics
Системная таблица jemalloc_bins
Содержит информацию о выделениях памяти, выполненных через диспетчер памяти jemalloc в различных классах размеров (bins), агрегированную со всех арен.
Prometheus
Все метрики, связанные с jemalloc, из asynchronous_metrics, также доступны через конечную точку Prometheus как в ClickHouse, так и в Keeper.
Команда jmst 4LW в Keeper
Keeper поддерживает команду jmst 4LW, которая возвращает базовые статистические данные по выделителю.
Пример: