Перейти к содержимому
Последнее обновление

Ошибка запроса Process Memory Not Enough

Если в сообщении об ошибке запроса встречается MEM_LIMIT_EXCEEDED и содержится Process memory not enough, это означает, что выполнение процесса отменено из-за недостатка доступной памяти.

Сначала разберите сообщение об ошибке, чтобы определить причину отмены, объём памяти, который занимал сам запрос на момент отмены, и состояние памяти процесса. Как правило, запрос отменяется по одной из трёх причин:

  1. Сам отменённый запрос использует слишком много памяти.

  2. Сам отменённый запрос использует мало памяти, но есть другие запросы с большим потреблением памяти.

  3. Общий кэш, метаданные и т. п. занимают слишком много памяти, либо слишком много памяти используют задачи, не связанные с запросами и загрузкой данных.

Разбор сообщения об ошибке​

Недостаток доступной процессу памяти возможен в двух случаях: текущее потребление памяти процесса превышает настроенный лимит или оставшийся объём доступной системной памяти опускается ниже порогового значения. Задачи, в том числе запросы, могут отменяться тремя способами:

  • Если сообщение об ошибке содержит cancel top memory used, задача отменена во время Full GC памяти.

  • Если сообщение об ошибке содержит cancel top memory overcommit, задача отменена во время Minor GC памяти.

  • Если сообщение об ошибке содержит Allocator sys memory check failed, задача отменена после неудачной попытки выделить память через Doris Allocator.

Разобрав сообщение об ошибке по приведённым ниже примерам, выполните следующие действия:

  • Если память, используемая самими запросами и задачами загрузки, составляет значительную долю памяти процесса, обратитесь к разделу [Сам запрос использует слишком много памяти], чтобы проанализировать потребление памяти запросами и задачами загрузки. Попробуйте изменить параметры или оптимизировать SQL, чтобы уменьшить объём памяти, необходимый для выполнения.

  • Если сама задача использует мало памяти, обратитесь к разделу [Слишком большое потребление памяти процесса вне задач запросов и загрузки] и попробуйте сократить потребление памяти другими частями процесса, чтобы освободить больше памяти для выполнения запросов и других задач.

Подробнее о лимитах памяти, способах расчёта пороговых значений и GC памяти см. в разделе Стратегия управления памятью.

1 Отмена во время Full GC памяти​

Если потребление памяти процесса BE превышает верхний лимит памяти процесса (MemLimit) или оставшийся объём доступной системной памяти опускается ниже нижнего порога (LowWaterMark), запускается Full GC. В этом случае первой отменяется задача с наибольшим потреблением памяти.

ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.8)[MEM_LIMIT_EXCEEDED]Process memory not enough, cancel top memory used query: <Query#Id=e862471398b14e71-9361a1ab8153cb29> consumption 866.97 MB, backend 10.16.10.8, process memory used 3.12 GB exceed limit 3.01 GB or sys available memory 191.25 GB less than low water mark 3.20 GB. Execute again after enough memory, details see be.INFO.

Разбор сообщения об ошибке:

  1. (10.16.10.8): узел BE, на котором во время выполнения запроса не хватило памяти.

  2. query: <Query#Id=e862471398b14e71-9361a1ab8153cb29> consumption 866.97 MB: queryID отменяемого запроса; сам запрос использует 866.97 MB памяти.

  3. process memory used 3.12 GB exceed limit 3.01 GB or sys available memory 191.25 GB less than low water mark 3.20 GB Причина превышения лимита памяти процесса заключается в том, что объём физической памяти, используемой процессом BE, равный 3.12 GB, превышает MemLimit, равный 3.01 GB. В данный момент операционная система может предоставить BE 191.25 GB памяти, что по-прежнему выше порога LowWaterMark, равного 3.20 GB.

2 Отмена во время Minor GC памяти​

Если потребление памяти процесса Doris BE превышает мягкий лимит памяти процесса (SoftMemLimit) или оставшийся объём доступной системной памяти опускается ниже предупредительного порога (WarningWaterMark), запускается Minor GC. В этом случае первым отменяется запрос с наибольшим отношением потребления памяти к лимиту.

ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.8)[MEM_LIMIT_EXCEEDED]Process memory not enough, cancel top memory overcommit query: <Query#Id=e862471398b14e71-9361a1ab8153cb29> consumption 866.97 MB, backend 10.16.10.8, process memory used 2.12 GB exceed soft limit 2.71 GB or sys available memory 3.25 GB less than warning water mark 6.40 GB. Execute again after enough memory, details see be.INFO.

Разбор сообщения об ошибке: process memory used 3.12 GB exceed soft limit 6.02 GB or sys available memory 3.25 GB less than warning water mark 6.40 GB Причина превышения лимита памяти процесса заключается в том, что оставшийся объём памяти, доступной BE в текущей операционной системе, составляет 3.25 GB, что ниже порога WarningWaterMark, равного 6.40 GB. При этом процесс BE использует 2.12 GB физической памяти, что не превышает SoftMemLimit, равный 2.71 GB.

3 Не удалось запросить память у Allocator​

Крупные запросы на выделение памяти в Doris BE обрабатываются через Doris Allocator, при этом во время выделения проверяется объём памяти. Если доступной процессу памяти недостаточно, выбрасывается исключение и выполняется попытка отменить текущий запрос.

ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.8)[MEM_LIMIT_EXCEEDED]PreCatch error code:11, [E11] Allocator sys memory check failed: Cannot alloc:4294967296, consuming tracker:<Query#Id=457efb1fdae74d3 b-b4fffdcfd4baaf32>, peak used 405956032, current used 386704704, exec node:<>, process memory used 2.23 GB exceed limit 3.01 GB or sys available memory 181.67 GB less than low water mark 3.20 GB.

Разбор сообщения об ошибке:

  1. consuming tracker:<Query#Id=457efb1fdae74d3b-b4fffdcfd4baaf32>, peak used 405956032, current used 386704704, exec node:VAGGREGATION_NODE (id=7)>: queryID отменяемого запроса. Сейчас запрос использует 386704704 Bytes памяти, пиковое потребление памяти запроса составляет 405956032 Bytes, выполняется оператор VAGGREGATION_NODE (id=7)>.

  2. Cannot alloc:4294967296: запрос на выделение 4 GB памяти не выполнен, поскольку сумма текущего потребления памяти процесса, равного 2.23 GB, и запрошенных 4 GB превысит MemLimit, равный 3.01 GB.

Отменённый запрос использует слишком много памяти​

Обратитесь к разделу Анализ памяти запросов или Анализ памяти загрузки, чтобы проанализировать потребление памяти запросами и задачами загрузки. Попробуйте изменить параметры или оптимизировать SQL, чтобы уменьшить объём памяти, необходимый для выполнения.

Если задача отменена из-за того, что не удалось запросить память у Allocator, сообщения Cannot alloc или try alloc покажут, что запрос пытается выделить слишком большой объём памяти. В этом случае проверьте, обоснован ли такой объём выделения. Найдите Allocator sys memory check failed в be/log/be.INFO, чтобы получить стек вызовов, связанных с выделением памяти.

Сам отменённый запрос использует мало памяти, но есть другие запросы с большим потреблением памяти​

Обычно это происходит потому, что запрос с большим потреблением памяти завис на этапе отмены и не может своевременно освободить память. Во время Full GC сначала отменяются запросы в порядке потребления памяти, затем в том же порядке отменяются задачи загрузки. Если запрос отменяется во время Full GC памяти, но в процессе BE есть другие запросы, использующие больше памяти, чем отменяемый запрос, проверьте, не зависли ли они в процессе отмены.

Сначала выполните grep {queryID} be/log/be.INFO, чтобы определить время отмены запроса, затем найдите Memory Tracker Summary в соседних строках, чтобы найти журнал статистики памяти процесса. Если в Memory Tracker Summary есть запрос, использующий больше памяти, выполните grep {queryID with larger memory} be/log/be.INFO и проверьте, есть ли запись с ключевым словом Cancel. Соответствующая временная отметка указывает время отмены запроса. Если этот запрос также отменён, а время его отмены отличается от времени отмены текущего запроса, обратитесь к разделу [Зависание процесса отмены запроса] в Часто задаваемые вопросы о проблемах с памятью, чтобы выяснить, не завис ли запрос с большим потреблением памяти при работе с кэшем. О разборе Memory Tracker Summary см. в разделе Анализ журналов памяти.

Слишком большое потребление памяти процесса вне задач запросов и загрузки​

Определите, какие компоненты занимают память, и рассмотрите возможность сократить её потребление, чтобы освободить больше памяти для выполнения запросов и загрузки данных.

Время отмены задачи из-за недостатка доступной памяти можно найти в журнале статистики памяти процесса в be/log/be.INFO. Выполните grep queryID be/log/be.INFO, чтобы определить время отмены запроса, затем найдите Memory Tracker Summary в соседних строках, чтобы найти журнал статистики памяти процесса. Для дальнейшего анализа обратитесь к разделу [Разбор журнала статистики памяти процесса] в Анализ журналов памяти. Перед анализом обратитесь к разделу [Неполная статистика Memory Tracker] в Memory Tracker, чтобы выяснить, есть ли пропуски в статистике Memory Tracker.

Если статистика Memory Tracker неполна, обратитесь к разделу [Неполная статистика Memory Tracker] для дальнейшего анализа. В противном случае Memory Tracker учитывает большую часть памяти и пропусков в статистике нет. Обратитесь к разделу Обзор, чтобы разобраться, почему различные части процесса Doris BE занимают слишком много памяти и как сократить её потребление.