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
- 1 Embedded 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
- 10 CPU 파이프라인 분석 — 5-stage·Cortex-M·Cortex-A 비교
- 11 Pipeline Stall 분석 — Data·Structural·Control Hazard·Forwarding
- 12 Branch Prediction 분석 — Static·2-bit·BTB·BHT·Mispredict 비용
- 13 Speculative Execution 분석 — OoO·Reorder Buffer·Register Renaming
- 14 CPU Cache 기초 — L1·L2·L3·Set Associative·Replacement Policy
- 15 Cache Miss 3C Model 분석 — Compulsory·Capacity·Conflict
- 16 Cache Line 최적화 — Alignment·Prefetch·False Sharing 처리
- 17 메모리 대역폭 분석 — STREAM·Roofline·Bus Saturation 측정
- 18 SIMD·NEON 활용 — 128-bit Vector·Auto-Vectorization·SVE/SVE2
- 19 PMU·HPM 하드웨어 카운터 분석 — 정밀 성능 진단
- 20 임베디드 Bus Architecture — AHB·AXI·CHI 진화와 5-Channel
- 21 Bus Contention 진단 — Arbitration·QoS·Starvation 측정
- 22 DMA 성능 최적화 — Burst·Scatter-Gather·Chain·Cache 일관성
- 23 DMA vs CPU Copy 성능 비교 — Break-even·Setup Overhead 실측
- 24 Interrupt Latency 분석 — 진입·종료·Tail-Chaining·Late Arrival
- 25 Interrupt Storm 처리 — NAPI·Rate-Limit·Polling 전환
- 26 MMIO 접근 성능 — Cache Policy·Write-Combining·Volatile·Barrier
- 27 Peripheral Clock 분석 — PLL·Divider·Gating·DVFS
- 28 Power vs Performance 트레이드오프 — DVFS·Race-to-Idle·Big.LITTLE
- 29 Thermal Throttling 분석 — Junction Temp·Trip Point·냉각
- 30 CXL Interconnect 분석 — AI 시대 메모리 대역폭 확장
- 31 Concurrency 기초 — Concurrency vs Parallelism·Race·Memory Model
- 32 False Sharing 진단 — Cache Line Ping-Pong·Padding·측정
- 33 Lock Contention 분석 — Wait·Hold·Convoy·측정 기법
- 34 Spinlock 성능 분석 — Spin-Wait vs Context Switch·Ticket·MCS
- 35 Mutex 성능 분석 — Futex·Adaptive·Priority Inheritance
- 36 Reader-Writer Lock 성능 — Reader/Writer Priority·RCU·Seqlock
- 37 Lock-Free 자료구조 성능 — CAS·ABA·Hazard Pointer·Epoch Reclamation
- 38 Memory Ordering 분석 — Acquire·Release·Seq-Cst·ARM Relaxed Model
- 39 Cache Coherency 프로토콜 — MESI·MOESI·Snoop·Directory
- 40 SMP 성능 분석 — Per-Core·Affinity·Load Balance·Scalability
- 41 Linux perf 기초 — stat·record·report 활용
- 42 Linux perf 고급 — Raw Event·Tracepoint·perf script
- 43 ftrace 활용 — function·function_graph·latency tracer
- 44 eBPF·bpftrace 동적 트레이싱 — 커널 무수정 관측
- 45 Flamegraph 분석 — On-CPU·Off-CPU·Differential
- 46 ARM DS·Lauterbach 분석 — Hardware Trace 전문 도구
- 47 Bare-metal 프로파일링 — GPIO·DWT·SysTick·ITM 활용
- 48 NVIDIA 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로 떨어지는 이유
- 55 CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
- 56 CXL 성능 프로파일링 도구 — 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 분석.
같은 시리즈에서 이어 읽기