linux2025. 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 펌웨어용 메모리

'linux' 카테고리의 다른 글

ftrace script  (0) 2025.12.28
/proc/meminfo와 zoneinfo의 관계  (0) 2025.12.28
zone, free_area, list_head[MIGRATE_TYPES] 관련  (0) 2025.12.28
raspberry pi 4 커널 빌드 및 교체 시 주의 사항  (0) 2025.12.26
gst와 omx IL의 관계  (0) 2022.11.03
Posted by easy16