메모리 로그 분석
be/log/be.INFO의 프로세스 메모리 로그는 크게 두 가지로 나뉩니다. 하나는 프로세스 메모리 크기와 시스템의 남은 가용 메모리 크기를 포함하는 프로세스 메모리 상태 로그입니다. 다른 하나는 Memory Tracker가 집계한 메모리 크기 등 더 자세한 정보를 포함하는 프로세스 메모리 통계 로그입니다.
프로세스 메모리 상태 로그 분석
Doris BE의 프로세스 메모리가 256 MB 증가하거나 감소할 때마다 프로세스 메모리 상태가 log/be.INFO 로그에 출력됩니다. 또한 프로세스 메모리가 부족할 때도 다른 로그와 함께 프로세스 메모리 상태가 출력됩니다.
os physical memory 375.81 GB. process memory used 4.09 GB(= 3.49 GB[vm/rss] - 410.44 MB[tc/jemalloc_cache] + 1 GB[reserved] + 0B[waiting_refresh]), limit 3.01 GB, soft limit 2.71 GB. sys available memory 134.41 GB(= 1 35.41 GB[proc/available] - 1 GB[reserved] - 0B[waiting_refresh]), low water mark 3.20 GB, warning water mark 6.40 GB.
-
os physical memory 375.81 GB는 시스템의 물리 메모리가 375.81 GB임을 나타냅니다. -
process memory used 4.09 GB (= 3.49 GB [vm/rss] - 410.44 MB [tc/jemalloc_cache] + 1 GB [reserved] + 0B [waiting_refresh])
- 현재 BE 프로세스가 사용하는 메모리는 4.09 GB로 간주하며, BE 프로세스가 실제로 사용하는 물리 메모리인
vm/rss는 3.49 GB입니다. - 이 중 410.44 MB는
tc/jemalloc_cache입니다. 이 캐시는 이후 실행 과정에서 우선적으로 재사용되므로 여기서는 BE 프로세스 메모리에 포함하지 않습니다. reserved는 실행 과정에서 예약한 메모리입니다. 일반적으로 HashTable 구축처럼 메모리를 많이 사용하는 작업을 수행하기 전에 HashTable에 필요한 메모리를 미리 예약하여 메모리 부족으로 HashTable 구축 과정이 종료되지 않도록 합니다. 이 예약 메모리는 실제로 할당되지 않았더라도 BE 프로세스 메모리에 포함됩니다.waiting_refresh는 두 번의 메모리 상태 갱신 사이에 요청된 대용량 메모리입니다. Doris의 기본 메모리 상태 갱신 간격은 100ms입니다. 두 번의 메모리 상태 갱신 사이에 메모리 요청이 대량으로 발생하면, 메모리가 제한을 초과해도 이를 제때 감지하지 못해 메모리 GC가 실행되지 않을 수 있습니다. 이를 방지하기 위해 해당 간격에 요청된 대용량 메모리를 BE 프로세스 메모리에 포함합니다.waiting_refresh는 메모리 상태가 갱신될 때마다 0으로 초기화됩니다.
sys available memory 134.41 GB (= 135.41 GB [proc/available] - 1 GB [reserved] - 0B [waiting_refresh])
- 현재 BE 프로세스의 남은 가용 메모리는 134.41 GB이며, 시스템에서 BE 프로세스가 실제로 사용할 수 있는 메모리인
proc/available은 135.41 GB입니다. - 메모리 중 1GB가 예약되어 있으므로 BE 프로세스의 남은 가용 메모리를 계산할 때
reserved를 뺍니다.reserved와waiting_refresh,limit 3.01 GB, soft limit 2.71 GB및low water mark 3.20 GB, warning water mark 6.40 GB에 대한 설명과 MemLimit 및 WaterMark에 대한 자세한 내용은 [메모리 제한 및 워터마크 계산 방법]을 참고하세요.
프로세스 메모리 통계 로그 분석
프로세스의 가용 메모리가 부족하면 BE에서 발생하는 대부분의 메모리 요청이 이를 감지하고, 메모리 GC 실행이나 쿼리 취소 등 미리 지정된 콜백 메서드의 실행을 시도하며 프로세스 메모리 통계 로그를 출력합니다. 기본 출력 간격은 1s입니다. 로그는 Process Memory Summary와 Memory Tracker Summary의 두 부분으로 나뉩니다. be/log/be.INFO에서 이 로그를 찾아 현재 프로세스 메모리 사용량이 예상과 일치하는지 확인할 수 있습니다.
Process Memory Summary:
os physical memory 375.81 GB. process memory used 4.09 GB(= 3.49 GB[vm/rss] - 410.44 MB[tc/jemalloc_cache] + 1 GB[reserved] + 0B[waiting_refresh]), limit 3.01 GB, soft limit 2.71 GB. sys available memory 134.41 GB(= 135.41 GB[proc/available] - 1 GB[reserved] - 0B[waiting_refresh]), low water mark 3.20 GB, warning water mark 6.40 GB.
Memory Tracker Summary:
MemTrackerLimiter Label=other, Type=overview, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=schema_change, Type=overview, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=compaction, Type=overview, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=load, Type=overview, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=query, Type=overview, Limit=-1.00 B(-1 B), Used=83.32 MB(87369024 B), Peak=88.33 MB(92616000 B)
MemTrackerLimiter Label=global, Type=overview, Limit=-1.00 B(-1 B), Used=199.37 MB(209053204 B), Peak=199.37 MB(209053204 B)
MemTrackerLimiter Label=tc/jemalloc_cache, Type=overview, Limit=-1.00 B(-1 B), Used=410.44 MB(430376896 B), Peak=-1.00 B(-1 B)
MemTrackerLimiter Label=tc/jemalloc_metadata, Type=overview, Limit=-1.00 B(-1 B), Used=144 MB(151759440 B), Peak=-1.00 B(-1 B)
MemTrackerLimiter Label=sum of all trackers, Type=overview, Limit=-1.00 B(-1 B), Used=693.14 MB(726799124 B), Peak=-1.00 B(-1 B)
MemTrackerLimiter Label=process resident memory, Type=overview, Limit=-1.00 B(-1 B), Used=3.49 GB(3743289344 B), Peak=3.49 GB(3743289344 B)
MemTrackerLimiter Label=reserved_memory, Type=overview, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=-1.00 B(-1 B)
MemTrackerLimiter Label=process virtual memory, Type=overview, Limit=-1.00 B(-1 B), Used=44.25 GB(47512956928 B), Peak=44.25 GB(47512956928 B)
MemTrackerLimiter Label=Orphan, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=DetailsTrackerSet, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTracker Label=IOBufBlockMemory, Parent Label=DetailsTrackerSet, Used=1.41 MB(1474560 B), Peak=1.41 MB(1474560 B)
MemTracker Label=SegmentCache[size], Parent Label=DetailsTrackerSet, Used=1.64 MB(1720543 B), Peak=18.78 MB(19691997 B)
MemTracker Label=SchemaCache[number], Parent Label=DetailsTrackerSet, Used=9.21 KB(9428 B), Peak=9.21 KB(9428 B)
MemTracker Label=TabletSchemaCache[number], Parent Label=DetailsTrackerSet, Used=9.29 MB(9738798 B), Peak=9.29 MB(9738798 B)
MemTracker Label=TabletMeta(experimental), Parent Label=DetailsTrackerSet, Used=25.08 MB(26303456 B), Peak=25.08 MB(26303456 B)
MemTracker Label=RuntimeFilterMergeControllerEntity(experimental), Parent Label=DetailsTrackerSet, Used=32.00 B(32 B), Peak=32.00 B(32 B)
MemTrackerLimiter Label=SegCompaction, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=PointQueryExecutor, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=BlockCompression, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=RowIdStorageReader, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=SubcolumnsTree, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=S3FileBuffer, Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=DataPageCache[size](AllocByAllocator), Type=global, Limit=-1.00 B(-1 B), Used=198.70 MB(208357157 B), Peak=198.73 MB(208381892 B)
MemTrackerLimiter Label=IndexPageCache[size](AllocByAllocator), Type=global, Limit=-1.00 B(-1 B), Used=679.73 KB(696047 B), Peak=679.73 KB(696047 B)
MemTrackerLimiter Label=PKIndexPageCache[size](AllocByAllocator), Type=global, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=Query#Id=529e3cb37dff464c-93bd9eafa8944ea6, Type=query, Limit=2.00 GB(2147483648 B), Used=83.32 MB(87369024 B), Peak=88.33 MB(92616000 B)
MemTrackerLimiter Label=MemTableTrackerSet, Type=load, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTrackerLimiter Label=SnapshotManager, Type=other, Limit=-1.00 B(-1 B), Used=0(0 B), Peak=0(0 B)
MemTracker Label=AllMemTableMemory, Parent Label=DetailsTrackerSet, Used=0(0 B), Peak=0(0 B)
Process Memory Summary는 프로세스 메모리 상태를 나타냅니다. 위의 [프로세스 메모리 상태 로그 분석]을 참고하세요.
Memory Tracker Summary는 프로세스의 Memory Tracker 요약으로, 현재 메모리 상태를 분석할 수 있도록 Type=overview와 Type=global의 모든 Memory Tracker를 포함합니다. 각 메모리 부분의 의미는 개요를 참고하세요.