linux2025. 12. 28. 18:39
#!/bin/bash


echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log

 

 

setter

#!/bin/bash


echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1

echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"

#echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filter
#sleep 1
#echo "set_ftrace_filter init"


echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"

#echo rpi_get_interrupt_info > /sys/kernel/debug/tracing/set_ftrace_filter
#echo show_interrupts > /sys/kernel/debug/tracing/set_ftrace_filter
echo zoneinfo_show > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"

#echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
#echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable

echo "event enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo "function stack trace enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 > /sys/kernel/debug/tracing/options/sym-offset
echo "function stack trace enabled"


echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing on"

getter

 

 

Posted by easy16
linux2025. 12. 28. 16:53

/proc/meminfo의 값들을 계산할 때도 zoneinfo에서 사용되는 page 정보들을 이용해 계산되는가

 
 
 
 

네, 정확히 맞습니다!

/proc/meminfo의 값들은 /proc/zoneinfo의 페이지 정보들을 집계해서 계산됩니다.

/proc/meminfo의 주요 항목 계산

 
 
c
// linux/mm/page_alloc.c에서
si_meminfo() 함수가 zoneinfo를 읽어서 meminfo 계산

MemTotal = Σ(모든 zone의 managed)
MemFree = Σ(모든 zone의 free)
MemAvailable = MemFree + 회수 가능한 페이지들
MemUsed = MemTotal - MemFree
```

## 당신의 RPi4 데이터로 검증
```
/proc/zoneinfo에서:
Node 0, DMA:      managed = 220735,  free = 215866
Node 0, DMA32:    managed = 253815,  free = 133994
Node 1, DMA32:    managed = 497449,  free = 380141
                  ──────────────────  ──────────────
                  합계 = 971999       합계 = 730001

↓ 이를 /proc/meminfo로 변환 ↓

MemTotal = 971999 × 4 = 3,887,996 KB
MemFree = 730001 × 4 = 2,920,004 KB

/proc/meminfo의 다른 항목들도 zoneinfo 기반

 
 
bash
MemTotal       = Σ managed
MemFree        = Σ free
MemAvailable   = MemFree + (회수 가능한 파일 캐시)
Buffers        = 버퍼 캐시 (zoneinfo의 nr_file_pages 관련)
Cached         = 파일 캐시 (zoneinfo의 nr_active_file + nr_inactive_file)
Active         = Σ nr_active_anon + nr_active_file
Inactive       = Σ nr_inactive_anon + nr_inactive_file
AnonPages      = Σ nr_anon_pages
Slab           = Σ (nr_slab_reclaimable + nr_slab_unreclaimable)

커널 소스코드

 
 
c
// mm/page_alloc.c
void si_meminfo(struct sysinfo *val)
{
    unsigned long pages = 0;
    
    // 모든 zone 순회
    for_each_zone(zone) {
        pages += zone->managed_pages;      // MemTotal 계산
    }
    val->totalram = pages;
    
    // MemFree 계산
    val->freeram = global_node_page_state(NR_FREE_PAGES);
    
    // 기타 항목들...
}

실제 확인 방법

 
 
bash
# zoneinfo의 managed 합계
awk '/managed/{sum+=$2} END {print "MemTotal = " sum*4 " KB"}' /proc/zoneinfo

# zoneinfo의 free 합계
awk '/pages free/{sum+=$3} END {print "MemFree = " sum*4 " KB"}' /proc/zoneinfo

# /proc/meminfo 값과 비교
grep "MemTotal\|MemFree" /proc/meminfo
```

## 더 상세한 대응관계
```
/proc/meminfo 항목          zoneinfo 출처
─────────────────────────────────────────────
MemTotal                    Σ managed
MemFree                     Σ free
MemAvailable                MemFree + 회수 가능
Buffers                     (버퍼 캐시)
Cached                      Σ nr_file_pages
Active(anon)                Σ nr_active_anon
Inactive(anon)              Σ nr_inactive_anon
Active(file)                Σ nr_active_file
Inactive(file)              Σ nr_inactive_file
AnonPages                   Σ nr_anon_pages
Slab                        Σ nr_slab_reclaimable + 
                              nr_slab_unreclaimable
KernelStack                 Σ nr_kernel_stack
PageTables                  Σ nr_page_table_pages
```

## 계층 관계
```
/proc/zoneinfo (세부 정보)
        ↑
        │ (커널이 집계)
        ↓
/proc/meminfo (통합 정보)
        ↑
        │ (사용자가 조회)
        ↓
free, top 등의 도구

결론:

  • ✅ /proc/meminfo는 /proc/zoneinfo 정보를 실시간으로 집계해서 만들어짐
  • ✅ zoneinfo의 managed/free 합계 × 4K = meminfo의 MemTotal/MemFree
  • ✅ 둘 다 같은 커널 메모리 관리 데이터 구조에서 나옴

'linux' 카테고리의 다른 글

ftrace script  (0) 2025.12.28
/proc/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
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