26Y06o2

Young-Kyoo Kim·2026년 7월 6일

좋습니다.

현재 상황에서는 일반적인 메모리 확인 스크립트보다 Linux Memory Forensics Tool 수준으로 만드는 것이 좋습니다.

특히 AIStor + DirectPV + Cilium 환경에서는 단순히 /proc/meminfo만 보면 안 되고 아래 계층을 모두 합쳐야 합니다.

                 Used Memory

        ┌──────────────────────────────┐
        │ User Process                 │
        │   RSS / PSS                  │
        ├──────────────────────────────┤
        │ cgroup                       │
        │ memory.current/stat          │
        ├──────────────────────────────┤
        │ Page Cache                   │
        │ Active(file)                 │
        │ Inactive(file)               │
        ├──────────────────────────────┤
        │ Slab                         │
        │ dentry inode xfs kmalloc     │
        ├──────────────────────────────┤
        │ Socket Memory                │
        ├──────────────────────────────┤
        │ BPF Memory                   │
        ├──────────────────────────────┤
        │ HugePage                     │
        ├──────────────────────────────┤
        │ Kernel Stack                 │
        │ PageTables                   │
        │ Percpu                       │
        ├──────────────────────────────┤
        │ Unknown                      │
        └──────────────────────────────┘

제가 추천하는 것은 mem-spectrum.sh v1.0이 아니라 실제 운영용 v2입니다.


출력 예시

====================================================================================
                             Memory Spectrum Report
====================================================================================

Memory
------

Total             : 1007.2 GB
Used              : 725.3 GB (72.0%)
Available         : 281.5 GB
Free              : 115.0 GB

Breakdown
----------

Anon RSS          : 203.1 GB (20.2%)
PSS               : 187.6 GB

Page Cache        : 170.8 GB
 Active(file)     : 96.4 GB
 Inactive(file)   : 73.1 GB
 Dirty            : 8 MB
 Writeback        : 0 MB

Slab              : 69.4 GB
 SReclaimable     : 42.8 GB
 SUnreclaim       : 26.6 GB

Kernel
-------

PageTables        : 2.8 GB
KernelStack       : 1.4 GB
Percpu            : 512 MB
Vmalloc           : 310 MB
Unevictable       : 0
Mlocked           : 0

Socket Memory
-------------

TCP               : 4.3 GB
UDP               : 180 MB
FRAG              : 2 MB

BPF
---

Total Map Memory  : 31.8 GB
Total Programs    : 425

Largest Maps

cilium_ct4_global        8.4 GB
cilium_lb4_backends      4.1 GB
cilium_policy            3.9 GB
...

Top Slab
---------

dentry               18.4 GB
xfs_inode            11.2 GB
kmalloc-512           8.3 GB
inode_cache           5.2 GB
...

cgroup
-------

memory.current      410 GB

anon                190 GB
file                170 GB
slab                 38 GB
sock                  3 GB

Summary
--------

Used 725 GB

= RSS          203 GB
+ Cache        171 GB
+ Slab          69 GB
+ BPF           32 GB
+ Sock           4 GB
+ PageTable      3 GB
+ KernelStack    1 GB
--------------------------------
Known           483 GB

Unknown         242 GB   <==

이 Unknown이 바로 조사 대상입니다.


기능

1. Linux Memory

/proc/meminfo

에서

  • Active(file)
  • Inactive(file)
  • Active(anon)
  • Inactive(anon)
  • Cached
  • Dirty
  • Writeback
  • KernelStack
  • PageTables
  • Percpu
  • Bounce
  • Commit
  • Vmalloc
  • AnonHugePages
  • FileHugePages

전부 표시


2. RSS / PSS

가능하면

smem

사용

없으면

/proc/*/smaps_rollup

사용

둘 다 없으면

ps rss

fallback


3. cgroup

v2

memory.current

memory.stat

memory.events

memory.swap.current

모든 cgroup 합산

anon

file

kernel

sock

slab

file_mapped

file_dirty

inactive_file

active_file

4. BPF

bpftool map show

자동 분석

bytes_memlock

max_entries

value_size

합산

그리고

Top 20 Map

출력

cilium_ct4_global

15 GB

5. Cilium

자동 탐지

cilium status

cilium version

cilium-dbg bpf map list

cilium bpf metrics

있으면 추가 출력


6. Socket

/proc/net/sockstat

/proc/net/sockstat6

에서

TCP mem

UDP mem

FRAG

RAW

합산


7. Slab

slabtop -o

또는

/proc/slabinfo

에서

Top20

dentry

inode_cache

kmalloc

xfs_inode

ext4_inode_cache

buffer_head

skbuff_head_cache

radix_tree_node

출력


8. HugePage

AnonHugePages

ShmemHugePages

FileHugePages

9. Unknown 계산

가장 중요한 부분입니다.

Known =
RSS
+ Cache
+ Slab
+ BPF
+ Sock
+ KernelStack
+ PageTables
+ Hugepage
+ Percpu
+ Vmalloc
Unknown =

Used - Known

Unknown이

10%

이상

이면

WARNING

Large Unknown Memory

출력


Leak Detection도 추가

AIStor 운영에서 매우 유용합니다.

Cilium Leak

if cilium_ct4_global > 10GB

WARNING

Possible CT leak

Slab Leak

SUnreclaim

증가율

추적


Dentry Leak

dentry > 20GB

Inode Leak

inode_cache

xfs_inode

Page Cache Leak

Dirty 증가

Inactive(file)

증가

Kernel Memory Leak

Percpu 증가

KernelStack 증가

PageTables 증가

제가 추가하고 싶은 기능

운영 환경에서는 여기서 끝내지 않고 시간에 따른 변화를 보는 것이 중요합니다. 그래서 mem-spectrum.sh를 다음과 같이 확장하는 것을 권장합니다.

  • mem-spectrum.sh : 현재 상태 분석
  • mem-spectrum.sh -w 60 : 60초 간격으로 수집
  • mem-spectrum.sh -d : 이전 스냅샷과 비교하여 증가량 표시
  • mem-spectrum.sh --html : HTML 리포트 생성
  • mem-spectrum.sh --json : JSON 출력(ELK/Grafana 연동용)
  • mem-spectrum.sh --prometheus : Prometheus textfile exporter 형식 출력

이렇게 하면 단순 진단 스크립트가 아니라 AIStor + Kubernetes + DirectPV + Cilium 환경에서 메모리 누수와 이상 징후를 자동 탐지하는 운영 도구로 사용할 수 있습니다. 개인적으로는 이 수준까지 구현하는 것이 실제 운영 환경에서 가장 활용도가 높다고 봅니다.

0개의 댓글