좋습니다.
현재 상황에서는 일반적인 메모리 확인 스크립트보다 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이 바로 조사 대상입니다.
/proc/meminfo
에서
전부 표시
가능하면
smem
사용
없으면
/proc/*/smaps_rollup
사용
둘 다 없으면
ps rss
fallback
v2
memory.current
memory.stat
memory.events
memory.swap.current
모든 cgroup 합산
예
anon
file
kernel
sock
slab
file_mapped
file_dirty
inactive_file
active_file
bpftool map show
자동 분석
bytes_memlock
max_entries
value_size
합산
그리고
Top 20 Map
출력
예
cilium_ct4_global
15 GB
자동 탐지
cilium status
cilium version
cilium-dbg bpf map list
cilium bpf metrics
있으면 추가 출력
/proc/net/sockstat
/proc/net/sockstat6
에서
TCP mem
UDP mem
FRAG
RAW
합산
slabtop -o
또는
/proc/slabinfo
에서
Top20
dentry
inode_cache
kmalloc
xfs_inode
ext4_inode_cache
buffer_head
skbuff_head_cache
radix_tree_node
출력
AnonHugePages
ShmemHugePages
FileHugePages
가장 중요한 부분입니다.
Known =
RSS
+ Cache
+ Slab
+ BPF
+ Sock
+ KernelStack
+ PageTables
+ Hugepage
+ Percpu
+ Vmalloc
Unknown =
Used - Known
Unknown이
10%
이상
이면
WARNING
Large Unknown Memory
출력
AIStor 운영에서 매우 유용합니다.
if cilium_ct4_global > 10GB
WARNING
Possible CT leak
SUnreclaim
증가율
추적
dentry > 20GB
inode_cache
xfs_inode
Dirty 증가
Inactive(file)
증가
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 환경에서 메모리 누수와 이상 징후를 자동 탐지하는 운영 도구로 사용할 수 있습니다. 개인적으로는 이 수준까지 구현하는 것이 실제 운영 환경에서 가장 활용도가 높다고 봅니다.