본문으로 건너뛰기
Memory Diagnostics · 6/7

CXL 메모리 진단 — RAS·Poison List·Media Error 추적

· Hawk · 3분 읽기

#CXL.mem은 일반 메모리와 무엇이 다른가

DDR DIMM과 달리 CXL 메모리 디바이스는:

  • 별도 NUMA 노드로 등록됨 — numastat에 별도 항목
  • RAS 이벤트 채널이 존재 — poison list, event log
  • Mailbox 명령으로 디바이스 상태 query 가능
  • Tiered memory 컨텍스트에서 promotion/demotion 트래픽 발생

기존 메모리 진단 도구(heaptrack·jemalloc profile)는 프로세스 관점입니다. CXL은 디바이스 관점 추가 진단이 필요합니다.

#NUMA 노드별 사용량

numastat에서 CXL 노드 사용량 확인:

Terminal window
# 전체 노드 통계
$ numastat -m
Node 0 Node 1 Node 2 (CXL)
MemTotal 262144000 262144000 274877906944
MemFree 5120000 6291000 8589934592
MemUsed 257024000 255853000 266287972352
Anon 198976000 201342000 198945792000
Active(file) 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
----------------------------------
Total 2332 4217 186419 192968

Node 2 (CXL)에 메모리 의외로 많이 가 있으면 원하지 않은 placement입니다. mbind() 또는 numactl로 제어해야 합니다.

#cxl-cli로 디바이스 상태

Terminal window
# 1. 전체 토폴로지
$ cxl list -RT
[
{
"memdev":"mem0",
"ram_size":274877906944,
"host":"0000:5e:00.0"
}
]
# 2. 디바이스 health
$ cxl health -m mem0
{
"memdev":"mem0",
"health_status":"normal",
"media_status":"normal",
"ext_status":"normal",
"life_used_percent":12,
"temperature":42,
"dirty_shutdown_count":3
}
# 3. Poison list — bad media 추적
$ cxl list -m mem0 -P
{
"poison":[
{"address":"0x80012340", "length":64, "source":"injected"},
{"address":"0x80015800", "length":64, "source":"internal"}
]
}
# 4. Event log
$ cxl monitor -m mem0
[2026-06-18 09:10:23] Info: Mailbox cmd 0x4400 completed in 1.2ms
[2026-06-18 09:11:45] Warning: Correctable ECC error at 0x80045000
[2026-06-18 09:12:01] Failure: Media error at 0x80067800 — added to poison list

#RAS 이벤트 분류

등급의미대응
Information정보성 (mailbox completion 등)무시 가능
WarningCorrectable error카운트 모니터링
FailureUncorrectable, 단일 영역poison list 격리, 페이지 unmap
Fatal디바이스 오류디바이스 reset 또는 교체

Linux 6.2+에서는 Failure 이벤트 발생 시 자동 page offlineMCE 이벤트 발생이 통합됩니다.

#DAMON으로 access 패턴

CXL 메모리가 cold tier로 잘 활용되는지 확인:

Terminal window
# DAMON 활성화
$ echo on > /sys/kernel/mm/damon/admin/kdamonds/0/state
# 결과 분포
$ damo report access
target_id region(KB) access(%) node
0 0-32M 82.3 0 # DDR — hot
0 32M-128M 45.1 0 # DDR — warm
0 128M-1G 8.2 2 # CXL — cool
0 1G-256G 1.1 2 # CXL — cold

*CXL 노드의 access %*가 DDR 대비 작아야 정상입니다. 비슷하면 promotion이 잘 안 되고 있는 신호.

#자주 만나는 함정

증상원인
CXL 노드 메모리 안 보임cxl create-region 안 함 — region 생성해야 사용 가능
numastat에 node 2 없음daxctl reconfigure-device -m system-ram 누락
Poison list 늘어남media wear 또는 ECC marginal — 디바이스 교체 검토
Health “warning”으로 떨어짐life_used_percent 또는 dirty_shutdown 증가 — log 확인
cxl monitor 무응답event interrupt 비활성. cxl set-event-irq -m memX
DAMON CXL 노드 무시DAMON 6.2+ tiered memory awareness 활성 확인
temperature 비현실적 (255 또는 0)디바이스 firmware bug — sensor 미초기화
갑작스러운 throughput 저하thermal throttling 가능 — cxl health 확인
Multi-host pool에서 access 실패LD(Logical Device) 할당 충돌 — Fabric Manager 확인
Page offline 빈번bad media 진행 — poison rate 모니터링

#진단 워크플로

  1. numastat -m — 노드별 전체 통계
  2. cxl health -m memX — 디바이스 자체 상태
  3. cxl list -m memX -P — poison list 변화 추적
  4. cxl monitor -m memX — 실시간 event log
  5. damo report access — access pattern 분포
  6. dmesg | grep -E "cxl|mce|memory_failure" — kernel 측 이벤트

#정리

  • CXL 메모리는 별도 NUMA 노드로 등록되어 numastat에서 디바이스 관점 진단이 가능합니다.
  • cxl-cli디바이스 health·poison·event를 노출하는 표준 도구입니다.
  • RAS 이벤트는 Information·Warning·Failure·Fatal 네 단계로 분류되며 Failure 이상에서 page offline이 trigger됩니다.
  • DAMON으로 CXL 노드의 access pattern을 확인해 tier 정렬이 잘 동작하는지 검증합니다.
  • 운영에서는 poison rate·life_used·dirty_shutdown 세 지표를 장기 추적합니다.

#다음 장 예고

Ch 7 — Tiered Memory 진단. DAMON·DAMOS·promotion/demotion debugging.

#관련 항목