쿼리 오류: Memory Tracker Limit Exceeded
쿼리 또는 데이터 적재 오류 메시지에 MEM_LIMIT_EXCEEDED가 표시되고 memory tracker limit exceeded가 포함되어 있으면 작업이 단일 실행 메모리 제한을 초과했다는 의미입니다.
오류 메시지 분석
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.8)[MEM_LIMIT_EXCEEDED]PreCatch error code:11, [E11] Allocator mem tracker check failed, [MEM_LIMIT_EXCEEDED] failed alloc size 1.03 MB, memory tracker limit exceeded, tracker label :Query#Id=f78208b15e064527-a84c5c0b04c04fcf, type:query, limit 100.00 MB, peak used 99.29 MB, current used 99.25 MB. backend 10.16.10.8, process memory used 2.65 GB. exec node:<execute:<ExecNode:VHASH_JOIN _NODE (id=4)>>, can `set exec_mem_limit=8G` to change limit, details see be.INFO.
오류 메시지는 두 부분으로 나뉩니다.
-
failed alloc size 1.03 MB, memory tracker limit exceeded, tracker label:Query#Id=f78208b15e064527-a84c5c0b04c04fcf, type:query, limit 100.00 MB, peak used 99.29 MB, current used 99.25 MB: 현재 쿼리f78208b15e064527-a84c5c0b04c04fcf가 실행 중입니다. 1.03 MB의 메모리를 할당하려는 과정에서 쿼리가 단일 실행 메모리 제한을 초과한 것으로 확인되었습니다. 쿼리의 메모리 제한은 100 MB입니다(세션 변수의exec_mem_limit). 현재 메모리 사용량은 99.25 MB이고, 최대 메모리 사용량은 99.29 MB입니다. -
backend 10.16.10.8, process memory used 2.65 GB. exec node:<execute:<ExecNode:VHASH_JOIN_NODE (id=4)>>, can set exec_mem_limit=8G to change limit, details see be.INFO.: 메모리를 요청한 위치는VHASH_JOIN_NODE (id=4)이며,set exec_mem_limit으로 단일 쿼리의 메모리 제한을 늘릴 수 있다는 안내가 표시됩니다.
단일 실행 메모리 제한과 메모리 초과 할당
show variables;로 Doris 세션 변수를 확인할 수 있습니다. 이 중 exec_mem_limit 값은 개별 쿼리와 데이터 적재의 실행 메모리 제한입니다. 다만 Doris 1.2부터는 쿼리에 더 유연한 메모리 제한을 설정할 수 있도록 쿼리 메모리 초과 할당(overcommit)을 지원합니다. 메모리가 충분하면 쿼리의 메모리 사용량이 상한을 초과하더라도 취소되지 않으므로, 일반적으로 사용자는 쿼리 메모리 사용량에 신경 쓸 필요가 없습니다. 메모리가 부족해지면 쿼리는 새 메모리를 할당하려고 시도하면서 잠시 대기합니다. 이때 일정한 규칙에 따라 mem_used 대비 exec_mem_limit의 비율이 큰 쿼리가 먼저 취소됩니다. 대기하는 동안 해제된 메모리 양이 요구량을 충족하면 쿼리는 계속 실행되고, 그렇지 않으면 예외가 발생하며 쿼리가 종료됩니다.
쿼리 메모리 분석
쿼리의 메모리 사용량을 분석하려면 쿼리 메모리 분석을 참고하세요.
set enable_profile=true로 Query Profile을 활성화한 후 작업이 단일 실행 메모리 제한을 초과하면, 메모리를 요청하는 쿼리의 호출 스택이 be/log/be.INFO에 출력되며 쿼리의 각 연산자가 현재 사용하는 메모리와 최대 사용량도 확인할 수 있습니다. 메모리 로그 분석을 참고하여 Process Memory Summary와 Memory Tracker Summary를 분석하면 현재 쿼리의 메모리 사용량이 예상과 일치하는지 확인하는 데 도움이 됩니다.
Allocator mem tracker check failed, [MEM_LIMIT_EXCEEDED]failed alloc size 32.00 MB, memory tracker limit exceeded, tracker label:Query#I
d=41363cb6ba734ad5-bc8720bdf9b3090d, type:query, limit 100.00 MB, peak used 75.32 MB, current used 72.62 MB. backend 10.16.10.8, process memory used 2.33 GB. exec node:<>, can `set exec_mem_limit=8G`
to change limit, details see be.INFO.
Process Memory Summary:
os physical memory 375.81 GB. process memory used 2.33 GB(= 2.60 GB[vm/rss] - 280.53 MB[tc/jemalloc_cache] + 0[reserved] + 0B[waiting_refresh]), limit 338.23 GB, soft limit 304.41 GB. sys availab
le memory 337.33 GB(= 337.33 GB[proc/available] - 0[reserved] - 0B[waiting_refresh]), low water mark 6.40 GB, warning water mark 12.80 GB.
Memory Tracker Summary: MemTrackerLimiter Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Type=query, Limit=100.00 MB(104857600 B), Used=72.62 MB(76146688 B), Peak=75.32 MB(78981248 B)
MemTracker Label=HASH_JOIN_SINK_OPERATOR, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=122.00 B(122 B), Peak=122.00 B(122 B)
MemTracker Label=VDataStreamRecvr:41363cb6ba734ad5-bc8720bdf9b309fe, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=0(0 B), Peak=384.00 B(384 B)
MemTracker Label=local data queue mem tracker, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=0(0 B), Peak=384.00 B(384 B)
MemTracker Label=HASH_JOIN_SINK_OPERATOR, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=21.73 MB(22790276 B), Peak=21.73 MB(22790276 B)
MemTracker Label=VDataStreamRecvr:41363cb6ba734ad5-bc8720bdf9b309fe, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=0(0 B), Peak=2.23 MB(2342912 B)
MemTracker Label=local data queue mem tracker, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=0(0 B), Peak=2.23 MB(2342912 B)
MemTracker Label=HASH_JOIN_SINK_OPERATOR, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=24.03 MB(25201284 B), Peak=24.03 MB(25201284 B)
MemTracker Label=VDataStreamRecvr:41363cb6ba734ad5-bc8720bdf9b309fe, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=1.08 MB(1130496 B), Peak=7.17 MB(7520256 B)
MemTracker Label=local data queue mem tracker, Parent Label=Query#Id=41363cb6ba734ad5-bc8720bdf9b3090d, Used=1.08 MB(1130496 B), Peak=7.17 MB(7520256 B)