linux
/proc/zoneinfo 해석 방법
easy16
2025. 12. 28. 16:25
/proc/zoneinfo 해석 가이드
핵심 항목만 보기
복잡해 보이지만, 실제로 중요한 항목은 몇 개입니다.
1단계: 노드(Node)와 존(Zone) 파악
Node 0, zone DMA ← NUMA Node 0의 DMA 영역
Node 0, zone DMA32 ← NUMA Node 0의 DMA32 영역
Node 1, zone DMA32 ← NUMA Node 1의 DMA32 영역
당신의 경우: 2개 노드, 각각 DMA + DMA32 영역만 사용
2단계: 각 Zone의 메모리 상태
RPi4 기준으로 중요한 항목:
Node 0, zone DMA
pages free 215866 ← 사용 가능한 페이지 수
managed 220735 ← 관리 중인 전체 페이지 수
cma 131072 ← CMA 영역 (카메라/GPU용)
nr_free_cma 126266 ← 사용 가능한 CMA 페이지
간단한 계산:
215866 pages × 4KB = 약 843MB 자유 메모리 (DMA 존)
126266 CMA pages × 4KB = 약 492MB (GPU/카메라용 예약)
3단계: 간단한 해석 패턴
bash
# 이 명령으로 깔끔하게 보기
grep -E "zone|free|managed|cma" /proc/zoneinfo
```
**출력 예:**
```
Node 0, zone DMA
pages free 215866 # ✓ 자유 메모리
managed 220735 # 관리 중
cma 131072 # GPU 예약
nr_free_cma 126266 # ✓ 사용 가능한 CMA
Node 0, zone DMA32
pages free 133994 # ✓ 자유 메모리
managed 253815 # 관리 중
```
## RPi4 당신의 상황 분석
```
Node 0 (CPU 0,1 담당):
DMA: 215,866 pages free (약 843MB) - GPU 공유
DMA32: 133,994 pages free (약 523MB)
Node 1 (CPU 2,3 담당):
DMA32: 380,141 pages free (약 1.4GB)
전체: 약 2.7GB 자유 메모리
```
## 추가 유용한 해석
**per-cpu pageset (CPU별 캐시):**
```
pagesets
cpu: 0
count: 62 ← CPU 0의 로컬 캐시 페이지 수
high: 290 ← 상한선 (초과하면 buddy로 반환)
batch: 63 ← 배치 크기
cpu: 1
count: 0 ← CPU 1은 로컬 캐시 비어있음
```
**최소/최대 임계값:**
```
min: 930 ← 이 이하면 메모리 부족
low: 1162 ← kswapd 깨우는 수준
high: 1394 ← 여유 있는 수준
한 줄로 상태 확인
bash
# 전체 자유 메모리 계산
awk '/pages free/{sum+=$3} END {print sum*4 "KB =" sum/256 "MB"}' /proc/zoneinfo
```
**당신의 시스템:**
```
약 750,000 pages × 4KB = 약 2.9GB 자유 메모리
스크립트로 간단하게 보기
bash
#!/bin/bash
echo "=== Zone 메모리 상태 ==="
awk '/^Node/ {node=$2} /^ zone/ {zone=$2} /pages free/ {free=$3} /managed/ {managed=$2} /nr_free_cma/ {cma=$2} /^$/ {if(node) printf "Node %s, %s: Free=%dMB (CMA=%dMB), Total=%dMB\n", node, zone, free*4/256, cma*4/256, managed*4/256}' /proc/zoneinfo
가장 간단한 방법
bash
# 1. 전체 자유 메모리만 보기
free -h
# 2. Zone별 상세는 이 부분만 보기
grep -A3 "^Node" /proc/zoneinfo | grep -E "free|managed"
결론:
- free = 사용 가능한 페이지 수
- managed = 관리 중인 전체 페이지 수
- cma = GPU/카메라용 예약 영역
- 나머지는 대부분 무시해도 됨
nr_은 무엇의 약자야? , managed는 어떤 의미인지 모르겠어 사용 중인거야 사용 가능한거야
오후 4:27
nr_과 managed의 의미
nr_ = "number of"의 약자
c
nr_free_pages = number of free pages (자유 페이지의 수)
nr_dirty = number of dirty pages (더티 페이지의 수)
nr_slab_reclaimable = number of slab reclaimable (회수 가능한 slab의 수)
```
**정리:**
- `nr_` = **개수/숫자**를 나타내는 접두사
- 항상 "몇 개인가"를 의미
---
## managed = 커널이 관리하는 페이지
```
물리 메모리
├─ 예약된 영역 (BIOS, 부트로더 등) - 커널이 건드리지 않음
├─ managed ← 커널이 관리할 수 있는 영역
│ ├─ free (사용 가능)
│ ├─ used (사용 중)
│ └─ ...
└─ (기타)
```
**쉽게 말하면:**
- **managed** = 커널이 할당/관리하는 페이지 풀
- **free** = managed 중에서 **지금 비어있는** 것
---
## 구체적 예시
```
Node 0, zone DMA
pages free 215866 ← 현재 비어있는 페이지
managed 220735 ← 커널이 관리할 수 있는 전체 페이지
사용 중인 페이지 = managed - free
= 220735 - 215866
= 4869 pages (약 19MB 사용 중)
다른 항목들과의 관계
c
struct zone {
// 페이지 상태 분류
managed // 커널이 관리 가능한 전체 페이지
├─ free // 사용 가능한 페이지 (할당 대기 중)
└─ used (암묵적)
├─ nr_active_anon // 활성 익명 페이지 (메모리)
├─ nr_inactive_anon // 비활성 익명 페이지
├─ nr_active_file // 활성 파일 캐시
├─ nr_inactive_file // 비활성 파일 캐시
├─ nr_kernel_stack // 커널 스택
├─ nr_page_table_pages // 페이지 테이블
└─ ... (기타 사용 중인 페이지)
};
```
## 당신의 RPi4 데이터로 분석
```
Node 0, zone DMA
managed: 220735 pages (전체 관리 페이지)
free: 215866 pages (현재 사용 가능)
사용 중: 220735 - 215866 = 4869 pages
= 약 19MB 사용 중
내역:
nr_active_anon: 0 (익명 페이지)
nr_active_file: 0 (파일 캐시)
nr_kernel_stack: ? (커널 스택)
... (합쳐서 4869)
Node 0, zone DMA32
managed: 253815 pages (전체 관리 페이지)
free: 133994 pages (현재 사용 가능)
사용 중: 253815 - 133994 = 119821 pages
= 약 467MB 사용 중
내역:
nr_zone_active_anon: 22471 (활성 메모리)
nr_zone_inactive_anon: 0
nr_zone_active_file: 32489 (파일 캐시)
nr_zone_inactive_file: 45782
... (합쳐서 119821)
```
## 메모리 상태 정리
| 항목 | 의미 | 상태 |
|------|------|------|
| **managed** | 커널이 관리 가능 | 포함된 범위 정의 |
| **free** | 현재 비어있음 | ✓ 할당 가능 |
| **used** (managed - free) | 현재 사용 중 | 이미 할당됨 |
| **nr_active_anon** | 활성 메모리 페이지 | used에 포함 |
| **nr_active_file** | 활성 캐시 페이지 | used에 포함 |
## 간단한 공식
```
managed = free + used
= free + (nr_active_anon + nr_inactive_anon +
nr_active_file + nr_inactive_file +
nr_kernel_stack + ...)
결론:
- nr_ = "개수" (number of)
- managed = 커널이 관리하는 페이지 풀의 크기
- free = managed 중 현재 비어있는 것
- used = managed 중 현재 사용 중인 것
present와 managed 차이
오후 4:29
present vs managed 차이
핵심
present = 물리적으로 실제 존재하는 페이지
managed = 커널이 실제로 관리/할당할 수 있는 페이지
구체적 차이
physical memory (물리 메모리)
│
├─ present: 242688 pages (실제 존재)
│ │
│ ├─ reserved (예약됨 - 커널이 건드리지 않음)
│ │ ├─ BIOS 영역
│ │ ├─ 부트로더
│ │ └─ 펌웨어 (RPi4의 GPU 펌웨어)
│ │
│ └─ manageable (관리 가능)
│ └─ managed: 220735 pages ← 커널이 할당/관리
│ ├─ free: 215866 (사용 가능)
│ └─ used: 4869 (사용 중)
당신의 RPi4 데이터로 보기
Node 0, zone DMA
present 242688 ← 실제 존재하는 물리 페이지
managed 220735 ← 커널이 관리하는 페이지
예약됨 = present - managed
= 242688 - 220735
= 21953 pages (약 85MB)
이 85MB는 GPU, 부트로더, BIOS 등이 사용
Node 0, zone DMA32
present 262144 ← 실제 존재
managed 253815 ← 커널이 관리
예약됨 = 262144 - 253815
= 8329 pages (약 32MB)
왜 managed < present일까?
RPi4 특성:
present = 242688 pages
├─ GPU 펌웨어 영역 (RPi4는 ARM CPU와 GPU 공유)
├─ 부트로더
├─ 디바이스 트리 (device tree)
├─ BIOS/UEFI 영역
└─ managed: 220735 pages만 Linux가 관리
일반 PC vs RPi4:
일반 PC:
present ≈ managed (대부분 예약 영역 없음)
RPi4:
present > managed (GPU가 메모리 독점, 공유 메모리 존재)
present - managed = 약 10% (GPU 펌웨어용)
메모리 계층 구조 (정확한 버전)
Physical Memory (물리적으로 존재)
│
├─ Node 0, zone DMA
│ │
│ ├─ present: 242688 pages
│ │ │
│ │ ├─ reserved (커널이 관리 안 함)
│ │ │ └─ 21953 pages (GPU, 펌웨어 등)
│ │ │
│ │ └─ managed: 220735 pages ← 커널이 관리
│ │ ├─ free: 215866 pages (할당 가능)
│ │ └─ used: 4869 pages (사용 중)
│ │ ├─ nr_kernel_stack
│ │ ├─ nr_page_table_pages
│ │ └─ ...
│ │
│ └─ cma: 131072 pages (GPU용 연속 메모리, managed에 포함)
│ ├─ nr_free_cma: 126266 (사용 가능)
│ └─ used_cma: ~5000
│
└─ Node 0, zone DMA32
├─ present: 262144
└─ managed: 253815
├─ free: 133994
└─ used: 119821
spanned vs present vs managed
Node 0, zone DMA
spanned: 262144 ← 이 zone이 담당하는 주소 범위의 페이지 수
present: 242688 ← 그 중 실제 존재하는 페이지 수
managed: 220735 ← 그 중 커널이 관리하는 페이지 수
spanned > present (어떤 주소는 비어있을 수 있음)
present > managed (일부는 예약됨)
공식
c
spanned = zone의 주소 범위로 계산한 페이지 수
present = spanned 중 실제 물리 메모리가 있는 페이지
managed = present 중 커널이 할당 가능한 페이지
free = managed 중 현재 비어있는 페이지
따라서:
spanned ≥ present ≥ managed ≥ free
요약표
항목의미예시
| spanned | 이론적 범위 | 262144 pages |
| present | 실제 존재 | 242688 pages |
| managed | 커널 관리 | 220735 pages |
| free | 현재 사용 가능 | 215866 pages |
결론:
- present = 물리적으로 "실제 있는" 페이지
- managed = 물리적으로 있으면서 "커널이 관리하는" 페이지
- RPi4에서 present - managed ≈ GPU 펌웨어용 메모리