본문으로 건너뛰기
Embedded Performance Engineering · 55/57

CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용

· Hawk · 5분 읽기

#한 줄 요약

“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 accessperf mem·perf c2cload/store 분포, cache miss source
NUMA 통계numastat·numactl노드별 메모리·트래픽
Kernel 트레이싱bpftrace·ftraceCXL 드라이버 내부 호출

각 도구가 서로 다른 질문에 답합니다. 한 가지로 다 보려고 하면 실패합니다.

#cxl-cli — 토폴로지와 region 관리

cxl-cli는 Linux 6.0+에서 CXL 서브시스템 표준 CLI입니다.

Terminal window
# 전체 토폴로지
$ 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 활동을 적은 오버헤드로 측정합니다.

Terminal window
# 1. DAMON 활성화
$ echo on > /sys/kernel/mm/damon/admin/kdamonds/0/state
# 2. 결과 확인
$ damo report access
target_id region(KB) access(%) node
0 0-32M 82.3 0
0 32M-128M 45.1 0
0 128M-1G 8.2 2 # CXL — cool
0 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_accesses
1
$ cat /sys/kernel/mm/damon/admin/kdamonds/0/contexts/0/schemes/0/action
migrate_hot # hot page를 빠른 tier로 이동

DAMON의 핵심 파라미터:

파라미터의미권장
sample_interval한 region을 얼마나 자주 sample5ms (default)
aggr_intervalaggregation 주기100ms
min_nr_regions최소 region 분할10
max_nr_regions최대 region 분할1000

aggr_interval이 크면 DAMON 오버헤드가 작아지지만 반응이 느림. 작으면 정확도 높아지지만 오버헤드 증가. tradeoff입니다.

#perf-mem — CPU의 메모리 접근 분포

perf memCPU PMU의 메모리 이벤트를 캡처합니다.

Terminal window
# 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 report

Local Weight각 access의 latency 비중입니다. cxl-mem (node 2)가 큰 비중이면 CXL.mem이 hot path에 있는 신호.

#numastat — NUMA 노드별 통계

CXL은 별도 NUMA 노드로 등록되어 numastat이 자연스럽게 통합 분석을 제공합니다.

Terminal window
# 전체 노드 통계
$ numastat -m
Node 0 Node 1 Node 2 (CXL)
MemTotal 262144000 262144000 274877906944
MemFree 5120000 6291000 8589934592
Active(anon) 198976000 201342000 198945792000
Inactive 2048000 1532000 1073741824
# 프로세스별 노드 사용
$ numastat -p <pid>
Per-node process memory usage (in MBs)
Node 0 Node 1 Node 2 Total
Huge 0 0 0 0
Heap 1234 2345 98765 102344
Stack 0 0 0 0
Private 1098 1872 87654 90624
# Memory miss·hit 통계
$ numastat
node0 node1 node2
numa_hit 103294827 85928301 29384720
numa_miss 382910 482910 1834820 # CXL — miss 많음
numa_foreign 482910 382910 0
local_node 102911917 85445391 29384720
other_node 382910 482910 1834820

numa_miss가 CXL 노드에 집중이면 application이 자기 노드 외 메모리를 자주 접근하는 신호.

#bpftrace — CXL 드라이버 동적 트레이싱

CXL 드라이버 내부 호출을 동적으로 캡처:

Terminal window
# 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 recordCPU가 어느 노드 자주 접근
4. Access 분포damo report accesshot/cold 분류 잘 되어 있나
5. Tier 동작bpftrace migratepromotion/demotion 자동 실행되나
6. RAS 이벤트cxl monitor디바이스에 이상 신호 없나

#자주 보는 함정과 안티패턴

⚠️ cxl list만 보고 토폴로지 단정

cxl list 출력은 현재 활성 디바이스만. hot-plug 가능 슬롯별도 옵션 (-i)으로 봐야 합니다. 구성 가능한 슬롯과 활성 디바이스를 혼동하면 용량 계획이 틀려집니다.

⚠️ DAMON sample_interval 너무 작게 설정

5ms 이하DAMON 자체 오버헤드워크로드의 5% 이상. 측정 결과가 측정 행위로 왜곡됩니다. 100ms 단위가 일반 권장.

⚠️ perf mem로 throughput 측정

perf memsampling입니다. 실제 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 관리, DAMONpage 활동, perf-memCPU access 분포, numastatNUMA 통계, 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. 1Embedded Performance Engineering — 임베디드 성능 엔지니어링 시리즈 소개
  2. 2임베디드 성능 분석 방법론 — Measure → Analyze → Optimize 사이클
  3. 3성능 지표 정의 — Latency·Throughput·Utilization 분석
  4. 4성능 측정의 기본 — Wall-Clock·CPU Cycle·Instruction Count
  5. 5성능 데이터 통계적 분석 — Percentile·Histogram·평균의 함정
  6. 6실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정
  7. 7임베디드 벤치마킹 기초 — 재현성·Warmup·노이즈 제거
  8. 8성능 모델링 — Amdahl·Gustafson·Roofline Model 적용
  9. 9프로파일링 기법 개요 — Sampling vs Instrumentation·PGO·LTO
  10. 10CPU 파이프라인 분석 — 5-stage·Cortex-M·Cortex-A 비교
  11. 11Pipeline Stall 분석 — Data·Structural·Control Hazard·Forwarding
  12. 12Branch Prediction 분석 — Static·2-bit·BTB·BHT·Mispredict 비용
  13. 13Speculative Execution 분석 — OoO·Reorder Buffer·Register Renaming
  14. 14CPU Cache 기초 — L1·L2·L3·Set Associative·Replacement Policy
  15. 15Cache Miss 3C Model 분석 — Compulsory·Capacity·Conflict
  16. 16Cache Line 최적화 — Alignment·Prefetch·False Sharing 처리
  17. 17메모리 대역폭 분석 — STREAM·Roofline·Bus Saturation 측정
  18. 18SIMD·NEON 활용 — 128-bit Vector·Auto-Vectorization·SVE/SVE2
  19. 19PMU·HPM 하드웨어 카운터 분석 — 정밀 성능 진단
  20. 20임베디드 Bus Architecture — AHB·AXI·CHI 진화와 5-Channel
  21. 21Bus Contention 진단 — Arbitration·QoS·Starvation 측정
  22. 22DMA 성능 최적화 — Burst·Scatter-Gather·Chain·Cache 일관성
  23. 23DMA vs CPU Copy 성능 비교 — Break-even·Setup Overhead 실측
  24. 24Interrupt Latency 분석 — 진입·종료·Tail-Chaining·Late Arrival
  25. 25Interrupt Storm 처리 — NAPI·Rate-Limit·Polling 전환
  26. 26MMIO 접근 성능 — Cache Policy·Write-Combining·Volatile·Barrier
  27. 27Peripheral Clock 분석 — PLL·Divider·Gating·DVFS
  28. 28Power vs Performance 트레이드오프 — DVFS·Race-to-Idle·Big.LITTLE
  29. 29Thermal Throttling 분석 — Junction Temp·Trip Point·냉각
  30. 30CXL Interconnect 분석 — AI 시대 메모리 대역폭 확장
  31. 31Concurrency 기초 — Concurrency vs Parallelism·Race·Memory Model
  32. 32False Sharing 진단 — Cache Line Ping-Pong·Padding·측정
  33. 33Lock Contention 분석 — Wait·Hold·Convoy·측정 기법
  34. 34Spinlock 성능 분석 — Spin-Wait vs Context Switch·Ticket·MCS
  35. 35Mutex 성능 분석 — Futex·Adaptive·Priority Inheritance
  36. 36Reader-Writer Lock 성능 — Reader/Writer Priority·RCU·Seqlock
  37. 37Lock-Free 자료구조 성능 — CAS·ABA·Hazard Pointer·Epoch Reclamation
  38. 38Memory Ordering 분석 — Acquire·Release·Seq-Cst·ARM Relaxed Model
  39. 39Cache Coherency 프로토콜 — MESI·MOESI·Snoop·Directory
  40. 40SMP 성능 분석 — Per-Core·Affinity·Load Balance·Scalability
  41. 41Linux perf 기초 — stat·record·report 활용
  42. 42Linux perf 고급 — Raw Event·Tracepoint·perf script
  43. 43ftrace 활용 — function·function_graph·latency tracer
  44. 44eBPF·bpftrace 동적 트레이싱 — 커널 무수정 관측
  45. 45Flamegraph 분석 — On-CPU·Off-CPU·Differential
  46. 46ARM DS·Lauterbach 분석 — Hardware Trace 전문 도구
  47. 47Bare-metal 프로파일링 — GPIO·DWT·SysTick·ITM 활용
  48. 48NVIDIA Nsight Systems — GPU·NPU 포함 시스템 분석
  49. 49모던 프로파일러 비교 — Tracy·Hotspot·uftrace·Coz
  50. 50연속 프로파일링 — Parca·Pixie·Pyroscope·Tetragon
  51. 51실전 사례 — ISR Latency 100µs Deadline Miss 추적
  52. 52실전 사례 — Matrix Multiply가 예상의 10배 느린 이유
  53. 53실전 사례 — 8-core가 4-core를 넘으면 throughput이 떨어지는 이유
  54. 54실전 사례 — 카메라 1080p 60fps가 30fps로 떨어지는 이유
  55. 55CXL.mem 지연·대역폭 실측 — Direct·Switch·Pooled 토폴로지 비교
  56. 56CXL 성능 프로파일링 도구 — cxl-cli·DAMON·perf-mem 활용
  57. 57실전 사례 — CXL.mem 추가로 LLM inference KV cache 처리량 회복