Анализ памяти с помощью Heap Profile
Heap Profile позволяет просматривать использование памяти процессом и стеки вызовов в реальном времени, поэтому для работы с ним обычно требуется некоторое понимание кода. Heap Profile фиксирует виртуальную память. Необходимо изменить конфигурацию, перезапустить процесс Doris BE и воспроизвести наблюдаемое поведение.
В Doris по умолчанию используется Allocator Jemalloc. Для работы с Heap Profile выполните следующие действия.
-
Измените
prof_active:falseв параметреJEMALLOC_CONFфайлаbe.confнаprof_active:trueи перезапустите Doris BE. -
После выполнения
curl http://be_host:8040/jeheap/dumpсгенерированный файлprofileпоявится в каталоге${DORIS_HOME}/log. -
После выполнения
jeprof --dot ${DORIS_HOME}/lib/doris_be ${DORIS_HOME}/log/profile_fileвставьте текст из терминала на сайт для построения графов dot, чтобы получить граф распределения памяти.
Описанный выше порядок действий предназначен для анализа памяти в реальном времени в Doris версий 2.1.8 и 3.0.4 и более поздних. Если нужно наблюдать за использованием памяти в течение длительного времени или отслеживать суммарный объём выделений памяти, дополнительные сведения об использовании Jemalloc Heap Profile см. в разделе Jemalloc Heap Profile.
Если в стеке вызовов Heap Profile вы видите поля Segment, TabletSchema и ColumnReader, на которые приходится значительная доля памяти, это означает, что метаданные занимают большой объём памяти.
Если после некоторого времени работы кластера объём памяти BE не уменьшается во время простоя, в стеке вызовов Heap Profile можно увидеть такие поля, как Agg, Join, Filter, Sort и Scan, на которые приходится значительная доля памяти. Если мониторинг памяти процесса BE за соответствующий период показывает непрерывный рост, есть основания подозревать утечку памяти. Продолжите анализ кода на основе стека вызовов.
Если во время выполнения задания в кластере в стеке вызовов Heap Profile вы видите такие поля, как Agg, Join, Filter, Sort и Scan, на которые приходится значительная доля памяти, а после завершения задания память освобождается как обычно, это означает, что большая часть памяти используется выполняющимися заданиями и утечки нет. Если значение Label=query, Type=overview в Memory Tracker составляет меньшую долю общего объёма памяти, чем доля памяти, приходящаяся на стек вызовов с указанными выше полями в Heap Profile, это означает, что статистика Label=query, Type=overview в Memory Tracker неточна. Об этом можно своевременно сообщить сообществу.