DirectPV 기반의 MinIO AIStor와 같은 고성능·대규모(1,000노드급) 온프레미스 스토리지 환경에서 free -h 명령어의 Used 수치가 프로세스 RSS나 Slab(SReclaimable/SUnreclaim) 및 Cache의 합산보다 비정상적으로 높게 나오는 현상은 SRE 실무에서 매우 중요하게 다루어지는 '숨겨진 커널 및 시스템 자원 점유' 문제입니다.
결론부터 말씀드리면, 수식 상으로 Used 수치에는 잡히지만 일반적인 프로세스 감시 도구(ps, top)나 커널 슬랩 감시 도구(slabtop)에 명시적으로 덤프되지 않는 4대 핵심 범주가 원인일 확률이 99%입니다. Linux 커널의 메모리 회계(Memory Accounting) 구조를 바탕으로 이 미스매치의 원인과 진단 방법을 분석해 드립니다.
현대 Linux(procps-ng v3.3.10+)에서 free 명령어가 계산하는 Used 수식은 다음과 같습니다.
즉, 커널은 Free, Buffers, Cached(Shmem 포함), SReclaimable(회복 가능한 슬랩)을 제외한 모든 시스템 점유 자원을 전부 Used 하나로 뭉뚱그려 표현합니다.
따라서 프로세스들의 실효 메모리(RSS)와 slabtop에 나오는 메모리를 다 더해도 Used보다 턱없이 부족하다면, 아래의 커널 독립 영역 및 대형 가드레일 자원에 메모리가 묶여 있는 것입니다.
운영 중이신 스토리지 아키텍처 특성상, 다음과 같은 요소들이 일반 도구 몰래 메모리를 대량으로 선점하고 있을 가능성이 가장 큽니다.
고성능 분산 오브젝트 스토리지(AIStor)나 NVMe 드라이브를 다이렉트로 정밀 통제하는 CSI(DirectPV) 환경에서는 디스크 I/O 병목 및 커널 콘텍스트 스위칭을 줄이기 위해 SPDK(Storage Performance Development Kit), DPDK 또는 Go 런타임 최적화용 HugePages(2MB 또는 1GB 단위)를 시스템 레벨에서 사전 할당(sysctl -w vm.nr_hugepages)하여 가동하는 경우가 많습니다.
Used로 고정됩니다. 이 자원은 프로세스 RSS나 standard Cache, Slab 어디에도 속하지 않기 때문에 수십~수백 GB의 메모리가 증발한 것처럼 보입니다.MinIO AIStor는 대규모 Go 기반 멀티스레딩 아키텍처를 가집니다. 수천 개의 고성능 I/O 고루틴(스레드)이 수십 TB~PB급 NVMe 블록 스토리지 공간을 가상 메모리 공간과 매핑(mmap 또는 대규모 가상 주소 할당)할 때, 가상 주소를 물리 RAM 주소로 변환해 주는 페이지 테이블 구조체(PageTables) 자체의 크기가 비대해집니다.
PageTables 용량만 노드당 수십 GB에 육박할 수 있습니다. 이는 slabtop에 나오지 않습니다.1,000노드급 대규모 클러스터에서 Pod의 생성과 소멸(High Pod Churn Rate)이 빈번하게 일어날 때 발생하는 커널 릭(Leak)의 일종입니다.
slabtop이 아닌 /proc/meminfo의 Percpu 영역 메모리가 삭제되지 않고 누적 가비지로 남아 호스트의 Used를 지속적으로 상승시킵니다.DirectPV 전용 로컬 드라이버 및 NVMe 가상화 컨트롤러 드라이버가 커널 내부적으로 연속되지 않은 대형 물리 버퍼를 확보하기 위해 vmalloc() 커널 API를 호출한 경우입니다. 이 영역 역시 물리적인 Slab 할당 풀 외부에 존재하므로 slabtop으로는 추적이 불가능합니다.
이 주범들을 명확히 색출해 내기 위해 호스트 노드의 배스천(Bastion)에서 아래 명령어를 즉시 실행하십시오. Linux 메모리의 가공되지 않은 진짜 원천 데이터인 /proc/meminfo를 직접 정밀 타격하여 합산하는 방식입니다.
# 1. 커널의 숨겨진 5대 핵심 지표 즉시 추출
egrep -i "HugePages_Total|HugePages_Free|Hugepagesize|PageTables|VmallocUsed|Percpu|SUnreclaim" /proc/meminfo
위 명령어의 산출물을 받아 아래 공식으로 대조해 보면 사라진 메모리의 물리적 위치가 100% 입증됩니다.
HugePages_Total Hugepagesize 계산: 이 값이 수십 GB 규격으로 나온다면, 스토리지/네트워크 바이패스 버퍼용으로 시스템이 메모리를 미리 떼어놓은 상태입니다. (HugePages_Free 수치가 높다면 예약만 해두고 안 쓰고 있는 자원 가비지 상태임을 뜻합니다.)PageTables 수치 확인: 이 수치가 수십 GB 이상으로 높다면 MinIO의 Go 런타임/스레드 폭주 또는 과도한 파일 매핑 오버헤드가 발생하고 있는 것입니다.Percpu 수치 확인: 이 수치가 노드 스펙 대비 비상식적으로 높다면 쿠버네티스 Pod Churn에 따른 Cgroup Reap 미흡(좀비 cgroup 자산 적체) 상황으로 판단할 수 있습니다.이 진단을 통해 특정 지표가 과다 점유된 것이 확인되면, 그것은 논리적 Garbage가 아니라 고성능 대규모 스토리지를 지탱하기 위해 커널 레벨에서 필연적으로 점유하고 있는 거버넌스 비용이거나 cgroup 수명 주기 누수 둘 중 하나로 좁혀 가이드를 수립할 수 있습니다.