CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용
#한 줄 요약
“CXL 성능 도구는 서로 다른 층을 본다.” — cxl-cli는 토폴로지와 디바이스 상태, DAMON은 page 단위 access 빈도, perf-mem은 CPU의 메모리 접근 분포, numastat은 NUMA 노드별 통계를 봅니다. 한 가지로 다 해결 안 되며 조합이 핵심입니다.
Ch 54에서 측정 결과를 봤습니다. 이 장은 그 측정에 쓴 도구들을 Part 5 (프로파일링 도구) 톤으로 정리합니다.
#어떤 문제를 푸는가
CXL 성능 분석은 기존 메모리 분석과 다른 층이 추가됩니다.
| 층 | 도구 | 본질 |
|---|---|---|
| 디바이스·토폴로지 | cxl-cli | 어떤 디바이스가 어디 붙어 있나, region/decoder 구성 |
| Page 활동 | DAMON·DAMOS | 어느 페이지가 hot/cold, 자동 promotion/demotion |
| CPU access | perf mem·perf c2c | load/store 분포, cache miss source |
| NUMA 통계 | numastat·numactl | 노드별 메모리·트래픽 |
| Kernel 트레이싱 | bpftrace·ftrace | CXL 드라이버 내부 호출 |
각 도구가 서로 다른 질문에 답합니다. 한 가지로 다 보려고 하면 실패합니다.
#cxl-cli — 토폴로지와 region 관리
cxl-cli는 Linux 6.0+에서 CXL 서브시스템 표준 CLI입니다.
# 전체 토폴로지$ cxl list -RT[ { "host":"acpi0017:00", "ports": [ { "port":"port1", "host":"0000:00:01.0", "decoders": [...], "endpoints": [ { "memdev":"mem0", "ram_size":274877906944, "host":"0000:5e:00.0" } ] } ] }]
# Decoder 매핑 확인$ cxl list -DT[ { "decoder":"decoder3.0", "resource":0x80000000, "size":0x80000000, "interleave_ways":2, "interleave_granularity":64 }]
# Region 생성$ cxl create-region -d decoder0.0 -t ram -s 128G{ "region":"region0", "resource":0x80000000, "size":137438953472, "interleave_ways":2, "interleave_granularity":64, "decoder":"decoder0.0", "mappings": [ {"position":0, "memdev":"mem0"}, {"position":1, "memdev":"mem1"} ]}
# DAX 또는 System RAM 모드 전환$ daxctl reconfigure-device dax0.0 -m system-ram핵심 명령은 list·create-region·set-partition·set-event-irq 5가지입니다.
#DAMON — Page 단위 access 추적
DAMON은 *kernel 5.15+*에서 page 활동을 적은 오버헤드로 측정합니다.
# 1. DAMON 활성화$ echo on > /sys/kernel/mm/damon/admin/kdamonds/0/state
# 2. 결과 확인$ damo report accesstarget_id region(KB) access(%) node0 0-32M 82.3 00 32M-128M 45.1 00 128M-1G 8.2 2 # CXL — cool0 1G-256G 1.1 2 # CXL — cold
# 3. DAMOS scheme — 자동 promotion/demotion$ cat /sys/kernel/mm/damon/admin/kdamonds/0/contexts/0/schemes/0/access_pattern/min_nr_accesses1$ cat /sys/kernel/mm/damon/admin/kdamonds/0/contexts/0/schemes/0/actionmigrate_hot # hot page를 빠른 tier로 이동DAMON의 핵심 파라미터:
| 파라미터 | 의미 | 권장 |
|---|---|---|
| sample_interval | 한 region을 얼마나 자주 sample | 5ms (default) |
| aggr_interval | aggregation 주기 | 100ms |
| min_nr_regions | 최소 region 분할 | 10 |
| max_nr_regions | 최대 region 분할 | 1000 |
aggr_interval이 크면 DAMON 오버헤드가 작아지지만 반응이 느림. 작으면 정확도 높아지지만 오버헤드 증가. tradeoff입니다.
#perf-mem — CPU의 메모리 접근 분포
perf mem은 CPU PMU의 메모리 이벤트를 캡처합니다.
# Load latency 분포 측정$ perf mem record -- ./workload$ perf mem report
# Sample 출력 Local Weight Memory Access Symbol DSO ── 12.45% cxl-mem (node 2) workload::process workload ── 35.20% L3 hit workload::cache workload ── 8.10% L1 hit workload::hot workload
# CXL 노드 access만 필터$ perf mem report --sort=mem,symbol | grep "node 2"
# Snoop 트래픽$ perf c2c record -- ./workload$ perf c2c reportLocal Weight는 각 access의 latency 비중입니다. cxl-mem (node 2)가 큰 비중이면 CXL.mem이 hot path에 있는 신호.
#numastat — NUMA 노드별 통계
CXL은 별도 NUMA 노드로 등록되어 numastat이 자연스럽게 통합 분석을 제공합니다.
# 전체 노드 통계$ numastat -m Node 0 Node 1 Node 2 (CXL)MemTotal 262144000 262144000 274877906944MemFree 5120000 6291000 8589934592Active(anon) 198976000 201342000 198945792000Inactive 2048000 1532000 1073741824
# 프로세스별 노드 사용$ numastat -p <pid>Per-node process memory usage (in MBs) Node 0 Node 1 Node 2 TotalHuge 0 0 0 0Heap 1234 2345 98765 102344Stack 0 0 0 0Private 1098 1872 87654 90624
# Memory miss·hit 통계$ numastat node0 node1 node2numa_hit 103294827 85928301 29384720numa_miss 382910 482910 1834820 # CXL — miss 많음numa_foreign 482910 382910 0local_node 102911917 85445391 29384720other_node 382910 482910 1834820numa_miss가 CXL 노드에 집중이면 application이 자기 노드 외 메모리를 자주 접근하는 신호.
#bpftrace — CXL 드라이버 동적 트레이싱
CXL 드라이버 내부 호출을 동적으로 캡처:
# CXL mailbox 명령 추적$ bpftrace -e ' kprobe:cxl_mbox_send_cmd { @cmds[arg1] = count(); } interval:s:5 { print(@cmds); clear(@cmds); }'
# 출력 예@cmds[0x4400]: 1234 # Get Health Info@cmds[0x4300]: 567 # Get LSA@cmds[0x4302]: 89 # Set LSA
# Page migration 추적 (DAMON 동작 검증)$ bpftrace -e ' tracepoint:migrate:mm_migrate_pages_start { @migrations[args->from_node, args->to_node] = sum(args->nr_pages); }'
# CXL 인터럽트 빈도$ bpftrace -e ' kprobe:cxl_event_irq_handler { @[probe] = count(); }'bpftrace는 문제가 의심되는 좁은 영역을 수정 없이 깊이 추적할 때 강력합니다.
#도구 조합 — 실전 워크플로
CXL 환경 디버깅의 일반 흐름:
| 단계 | 도구 | 묻는 질문 |
|---|---|---|
| 1. 토폴로지 확인 | cxl list -RT | 어떤 디바이스가 어디 붙어 있나 |
| 2. NUMA 등록 | numactl --hardware | 노드 분리 잘 되어 있나 |
| 3. 워크로드 시작 | perf mem record | CPU가 어느 노드 자주 접근 |
| 4. Access 분포 | damo report access | hot/cold 분류 잘 되어 있나 |
| 5. Tier 동작 | bpftrace migrate | promotion/demotion 자동 실행되나 |
| 6. RAS 이벤트 | cxl monitor | 디바이스에 이상 신호 없나 |
#자주 보는 함정과 안티패턴
⚠️
cxl list만 보고 토폴로지 단정
cxl list 출력은 현재 활성 디바이스만. hot-plug 가능 슬롯은 별도 옵션 (-i)으로 봐야 합니다. 구성 가능한 슬롯과 활성 디바이스를 혼동하면 용량 계획이 틀려집니다.
⚠️ DAMON
sample_interval너무 작게 설정
5ms 이하면 DAMON 자체 오버헤드가 워크로드의 5% 이상. 측정 결과가 측정 행위로 왜곡됩니다. 100ms 단위가 일반 권장.
⚠️
perf mem로 throughput 측정
perf mem은 sampling입니다. 실제 throughput은 못 봅니다. throughput은 STREAM·mlc가 맞고, perf mem은 어디서 latency가 나오는지 분포 분석에 씁니다.
⚠️ numastat의
numa_foreign항목 무시
numa_foreign은 자기 노드 메모리가 다른 노드 프로세스에 할당된 경우. 큰 값은 자원 공유 충돌. CXL pool 환경에서는 항상 모니터링해야 할 지표.
#정리
- CXL 성능 분석은 cxl-cli·DAMON·perf-mem·numastat·bpftrace 5개 도구가 서로 다른 층을 봅니다.
- cxl-cli는 토폴로지와 region 관리, DAMON은 page 활동, perf-mem은 CPU access 분포, numastat은 NUMA 통계, bpftrace는 드라이버 동적 추적입니다.
- 워크플로 권장: 토폴로지 → NUMA → 워크로드 시작 → access 분포 → tier 동작 → RAS의 6단계 순.
- DAMON sample_interval 5ms 이하는 위험, 100ms가 일반적입니다.
perf mem은 분포 분석 전용, throughput은 STREAM·mlc가 정답입니다.
다음 편은 Ch 56: 실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복 — Ch 8(HBM)에서 본 LLaMA 70B 메모리 문제의 해결편 case study입니다.
#관련 항목
Embedded Performance Engineering · 56 of 57
- 1Embedded Performance Engineering — 임베디드 성능 엔지니어링 시리즈 소개
- 2임베디드 성능 분석 방법론 — Measure → Analyze → Optimize 사이클
- 3성능 지표 정의 — Latency·Throughput·Utilization 분석
- 4성능 측정의 기본 — Wall-Clock·CPU Cycle·Instruction Count
- 5성능 데이터 통계적 분석 — Percentile·Histogram·평균의 함정
- 6실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정
- 7임베디드 벤치마킹 기초 — 재현성·Warmup·노이즈 제거
- 8성능 모델링 — Amdahl·Gustafson·Roofline Model 적용
- 9프로파일링 기법 개요 — Sampling vs Instrumentation·PGO·LTO
- 10CPU 파이프라인 분석 — 5-stage·Cortex-M·Cortex-A 비교
- 11Pipeline Stall 분석 — Data·Structural·Control Hazard·Forwarding
- 12Branch Prediction 분석 — Static·2-bit·BTB·BHT·Mispredict 비용
- 13Speculative Execution 분석 — OoO·Reorder Buffer·Register Renaming
- 14CPU Cache 기초 — L1·L2·L3·Set Associative·Replacement Policy
- 15Cache Miss 3C Model 분석 — Compulsory·Capacity·Conflict
- 16Cache Line 최적화 — Alignment·Prefetch·False Sharing 처리
- 17메모리 대역폭 분석 — STREAM·Roofline·Bus Saturation 측정
- 18SIMD·NEON 활용 — 128-bit Vector·Auto-Vectorization·SVE/SVE2
- 19PMU·HPM 하드웨어 카운터 분석 — 정밀 성능 진단
- 20임베디드 Bus Architecture — AHB·AXI·CHI 진화와 5-Channel
- 21Bus Contention 진단 — Arbitration·QoS·Starvation 측정
- 22DMA 성능 최적화 — Burst·Scatter-Gather·Chain·Cache 일관성
- 23DMA vs CPU Copy 성능 비교 — Break-even·Setup Overhead 실측
- 24Interrupt Latency 분석 — 진입·종료·Tail-Chaining·Late Arrival
- 25Interrupt Storm 처리 — NAPI·Rate-Limit·Polling 전환
- 26MMIO 접근 성능 — Cache Policy·Write-Combining·Volatile·Barrier
- 27Peripheral Clock 분석 — PLL·Divider·Gating·DVFS
- 28Power vs Performance 트레이드오프 — DVFS·Race-to-Idle·Big.LITTLE
- 29Thermal Throttling 분석 — Junction Temp·Trip Point·냉각
- 30CXL Interconnect 분석 — AI 시대 메모리 대역폭 확장
- 31Concurrency 기초 — Concurrency vs Parallelism·Race·Memory Model
- 32False Sharing 진단 — Cache Line Ping-Pong·Padding·측정
- 33Lock Contention 분석 — Wait·Hold·Convoy·측정 기법
- 34Spinlock 성능 분석 — Spin-Wait vs Context Switch·Ticket·MCS
- 35Mutex 성능 분석 — Futex·Adaptive·Priority Inheritance
- 36Reader-Writer Lock 성능 — Reader/Writer Priority·RCU·Seqlock
- 37Lock-Free 자료구조 성능 — CAS·ABA·Hazard Pointer·Epoch Reclamation
- 38Memory Ordering 분석 — Acquire·Release·Seq-Cst·ARM Relaxed Model
- 39Cache Coherency 프로토콜 — MESI·MOESI·Snoop·Directory
- 40SMP 성능 분석 — Per-Core·Affinity·Load Balance·Scalability
- 41Linux perf 기초 — stat·record·report 활용
- 42Linux perf 고급 — Raw Event·Tracepoint·perf script
- 43ftrace 활용 — function·function_graph·latency tracer
- 44eBPF·bpftrace 동적 트레이싱 — 커널 무수정 관측
- 45Flamegraph 분석 — On-CPU·Off-CPU·Differential
- 46ARM DS·Lauterbach 분석 — Hardware Trace 전문 도구
- 47Bare-metal 프로파일링 — GPIO·DWT·SysTick·ITM 활용
- 48NVIDIA Nsight Systems — GPU·NPU 포함 시스템 분석
- 49모던 프로파일러 비교 — Tracy·Hotspot·uftrace·Coz
- 50연속 프로파일링 — Parca·Pixie·Pyroscope·Tetragon
- 51실전 사례 — ISR Latency 100µs Deadline Miss 추적
- 52실전 사례 — Matrix Multiply가 예상의 10배 느린 이유
- 53실전 사례 — 8-core가 4-core를 넘으면 throughput이 떨어지는 이유
- 54실전 사례 — 카메라 1080p 60fps가 30fps로 떨어지는 이유
- 55CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
- 56CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용
- 57실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복
관련 글
실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복
70B 모델 KV cache가 HBM 한계를 넘어 throughput이 무너졌을 때, CXL.mem 256 GB pool 추가로 회복한 실전 케이스.
CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
CXL.mem 토폴로지별 실측 — Direct attach·Single switch·Multi-host pool의 지연·대역폭 비용 측정.
연속 프로파일링 — Parca·Pixie·Pyroscope·Tetragon
eBPF 기반 continuous profiling. Parca, Pixie, Pyroscope, Cilium Tetragon으로 24/7 분석.