Split View: CXL 메모리 티어링, 커널은 어디까지 왔나 — DAMON이 머지한 것과 숫자가 재지 않은 것
CXL 메모리 티어링, 커널은 어디까지 왔나 — DAMON이 머지한 것과 숫자가 재지 않은 것
- 들어가며 — CXL 이야기에서 커널이 맡은 부분
- 커널이 페이지를 옮기는 두 가지 방법
- 2026년 7월 기준, mainline에 실제로 들어간 것
- 4.43%라는 숫자 — 그리고 그게 재지 않은 것
- 25%라는 숫자 — 그리고 그게 사실 티어링이 아니라는 것
- 94%라는 숫자 — 조건이 없는 숫자
- 진짜 문제는 알고리즘이 아니라 파라미터다
- 아직 해결되지 않은 것들
- 그래서, 당신은 지금 이걸 켜야 하나
- 마치며
- 참고 자료
들어가며 — CXL 이야기에서 커널이 맡은 부분
CXL 하드웨어 이야기는 Meta의 Vistara 브리지 칩 편에서 한 번 다뤘습니다. 은퇴한 DDR4를 CXL로 되살려 두 번째 메모리 계층으로 쓴다는, 하이퍼스케일의 종단 배치 보고였습니다.
그런데 칩이 꽂혀 있다는 것과 그게 값을 한다는 건 다른 얘기입니다. CXL 메모리는 운영체제에 CPU 없는 NUMA 노드로 보일 뿐이고, 어떤 페이지가 뜨겁고 어떤 페이지가 식었는지 판단해 실제로 옮기는 일은 전부 커널이 합니다. 이 판단이 틀리면 CXL은 그냥 느린 램입니다.
그래서 이 글은 하드웨어가 아니라 그 위에서 도는 코드를 봅니다. 2026년 7월 현재 리눅스 mainline에 무엇이 실제로 들어가 있는지를 커널 소스로 직접 확인하고, 이 분야에서 인용되는 숫자들이 원본 출처에서 정확히 무엇을 재고 무엇을 재지 않았는지 따라가 봅니다. 결론부터 말하면, 들어간 것은 부품이고 정책은 아직 당신 몫이며, 숫자들은 크기가 클수록 방법론이 적게 붙어 있습니다.
커널이 페이지를 옮기는 두 가지 방법
먼저 지형입니다. 티어링된 메모리에서 페이지를 옮기는 mainline 메커니즘은 크게 둘입니다.
첫째, NUMA balancing 티어링 모드(NUMAB-2). 접근 확인용 페이지 폴트(prot_none)로 뜨거운 페이지를 찾고, 프로세스 자신의 컨텍스트에서 승격을 수행합니다. 즉 승격 작업이 애플리케이션의 실제 일과 같은 스레드에서 일어납니다. 강등은 reclaim 기반으로 kswapd나 direct reclaim이 처리합니다.
둘째, DAMON과 그 위의 DAMOS. DAMON은 커널 스레드를 띄워 메모리 접근을 5ms마다 샘플링하고, 결과를 100ms마다 유저스페이스로 넘깁니다. 일반적인 시스템에서 오버헤드는 0.1% 미만이라고 DAMON 창시자 SeongJae Park이 LSFMM+BPF 2026에서 발표했습니다. 5.15에 처음 머지됐습니다. DAMOS는 그 관찰 결과에 동작을 붙이는 층이고, 티어링에 쓰이는 동작이 migrate_hot(승격)과 migrate_cold(강등)입니다. 핵심 차이는 DAMOS가 비동기 워커 스레드에서 돈다는 점입니다.
이 차이가 나중에 숫자로 돌아옵니다.
2026년 7월 기준, mainline에 실제로 들어간 것
발표 자료나 뉴스가 아니라 커널 소스를 직접 확인했습니다. 아래는 각 기능이 처음 나타나는 태그를 include/linux/damon.h와 문서에서 확인한 결과입니다.
6.11 DAMOS_MIGRATE_HOT / DAMOS_MIGRATE_COLD
(v6.10에 없음 → v6.11에 등장. SK hynix: Hyeongtak Ji, Honggyu Kim, 2024-06-14)
HMSDK의 CXL 용량 확장용. 임계값은 사람이 손으로 박는 정적 값.
6.16 node_mem_used_bp / node_mem_free_bp 쿼터 목표
(자가 튜닝 티어링, 일명 TPP-DAMON. SeongJae Park)
6.17 damos->migrate_dests — 목적지 노드 여러 개 + 가중치
(Micron: Bijan Tabatabai. 가상 주소 공간 전용)
6.19 node_memcg_used_bp / node_memcg_free_bp
(cgroup 단위 티어링. Meta 협업)
7.2-rc1 node_eligible_mem_bp
(Micron: Ravi Jonnalagadda. 아직 정식 릴리스된 커널에는 없음)
여기서 두 가지를 짚어야 합니다.
첫째, "그냥 되는" 티어링 커널 모듈은 없습니다. v7.2-rc3의 mm/damon/Kconfig에서 "tier"라는 문자열은 0번 나옵니다. 빌드되는 DAMON 모듈은 DAMON_RECLAIM, DAMON_LRU_SORT, DAMON_STAT 셋뿐이고 mm/damon/ 아래에 tiering.c는 없습니다. 즉 mainline이 주는 건 부품(쿼터 목표 metric, 마이그레이션 동작, 목적지 가중치)이고, 그걸 조립해 정책으로 만드는 일은 유저스페이스 몫입니다.
이건 사고가 아니라 계획대로입니다. 자가 튜닝 티어링 RFC 커버레터에서 저자 본인이 쿼터 목표 metric 부분을 먼저 올리고 티어링 모듈 부분은 "나중에" 올리겠다고 적었습니다. 모듈 쪽은 2계층만 가정하고 노드 주소 범위를 사용자가 직접 넣어야 하는, 완성형과 거리가 먼 상태라는 게 이유였습니다. 그 "나중에"는 2026년 7월 현재까지 오지 않았습니다.
그래서 오늘 이걸 굴리려면 발표 슬라이드에 나온 것처럼 damo 명령을 직접 짜야 합니다.
damo start \
--numa_node 0 --monitoring_intervals_goal 4% 3 5ms 10s \
--damos_action migrate_cold 1 --damos_access_rate 0% 0% \
--damos_apply_interval 1s \
--damos_quota_interval 1s --damos_quota_space 200MB \
--damos_quota_goal node_mem_free_bp 0.5% 0 \
--damos_filter reject young \
--numa_node 1 --monitoring_intervals_goal 4% 3 5ms 10s \
--damos_action migrate_hot 0 --damos_access_rate 5% max \
--damos_apply_interval 1s \
--damos_quota_interval 1s --damos_quota_space 200MB \
--damos_quota_goal node_mem_used_bp 99.7% 0 \
--damos_filter allow young \
--damos_nr_quota_goals 1 1 --damos_nr_filters 1 1 \
--nr_targets 1 1 --nr_schemes 1 1 --nr_ctxs 1 1
노드 0(DRAM)에서는 식은 페이지를 강등하되 여유 공간 0.5%를 목표로, 노드 1(CXL)에서는 뜨거운 페이지를 승격하되 DRAM 사용률 99.7%를 목표로 돌리는 구성입니다. 0.5%와 99.7%가 살짝 겹치도록 잡아 승격과 강등이 서로 멈추지 않게 하는 게 설계 의도이고, 커버레터는 이 두 값을 기본 권장값으로 제안합니다. 나쁘지 않은 인터페이스지만, 이걸 "그냥 된다"고 부르긴 어렵습니다.
둘째, CONFIG_DAMON은 기본값이 아닙니다. 2025년 5월 SeongJae Park이 주요 배포판들이 이미 DAMON을 빌드 활성화하고 있고 커널 패키지 크기가 약 0.1%만 늘어난다는 근거로 기본 활성화 패치를 올렸고, 6.16-rc1 머지 윈도에 들어갔습니다. 그리고 2025년 6월 10일 Linus Torvalds가 되돌렸습니다. 커밋 aef17cb3d3c4의 본문은 한 줄입니다 — "No, we don't make random features default to being on."
v7.2-rc3의 mm/damon/Kconfig를 확인해 보면 config DAMON에는 지금도 default y가 없습니다. 되돌림은 그대로 유지됐습니다.
4.43%라는 숫자 — 그리고 그게 재지 않은 것
자가 튜닝 티어링(6.16)에 붙어 다니는 숫자가 4.42%입니다. 원본 RFC 커버레터(SeongJae Park, 2025-03-19)를 읽어 보면 조건이 전부 적혀 있습니다.
측정 환경. DRAM 계층 250 GiB, CXL 계층 50 GiB를 각각 NUMA 노드 0과 1로 노출한 머신. 커널은 v6.13에 2025-03-15 mm 트리의 DAMON 패치 전부와 해당 시리즈를 얹고, 애플리케이션의 전통적 NUMA 최적화가 끼어들지 않도록 mempolicy() 시스템 콜을 무시하도록 고쳤습니다. 워크로드는 DCPerf의 Taobench 변형으로 메모리 크기 340 GiB, 워밍업 2,500초, 측정 1,440초, RSS는 워밍업 중 270 GiB까지 자랍니다. 각 구성마다 5회 반복.
결과 표(커버레터 원문).
Config Score Stdev (%) Normalized
Baseline 1.6165 0.0319 1.9764 1.0000
Numab_tiering 1.4976 0.0452 3.0209 0.9264
DAMON_tiering 1.6881 0.0249 1.4767 1.0443
직접 계산해 보면 1.6881 나누기 1.6165는 1.0443이니 DAMON 티어링은 4.43% 개선, 1.4976 나누기 1.6165는 0.9264이니 NUMAB-2는 7.36% 저하입니다. (커버레터 요약부는 4.42%와 7.34%로 적고 있는데, 자기 표에서 나오는 값은 4.43%와 7.36%입니다. 1년 뒤 LSFMM 슬라이드까지 "~4.42%"가 그대로 실려 다닙니다. 사소하지만, 인용되는 숫자가 원 표를 다시 계산해 본 사람 손을 거치지 않는다는 뜻이기도 합니다.)
여기까지는 좋은 소식처럼 들립니다. 이제 같은 커버레터가 스스로 적어 둔 캐비엇을 봅시다.
워크로드가 원래는 아무 차이도 못 만들었습니다. 저자의 서술을 그대로 옮기면, Taobench는 접근 패턴이 매우 정적이어서 RSS의 약 13%만 처음부터 끝까지 자주 접근됐고, 그 결과 설계와 구현이 무엇이든 승격은 의미 있는 성능 차이를 만들지 못했습니다. 그래서 저자는 커널을 고쳐서 1분에 한 번씩 뜨거운 페이지를 최대 10 GiB 강등하고 식은 페이지를 최대 10 GiB 승격시키는 훼방을 넣었습니다. 접근 패턴이 주기적으로 바뀌는 상황을 시뮬레이션하기 위해서였고, 워크로드 이름에 "modified"가 붙은 이유가 이것입니다.
즉 4.43%는 티어링이 유리하도록 인위적으로 흔든 워크로드에서 나온 값입니다. 흔들지 않은 원래 워크로드에서는 어떤 티어링 구현도 차이를 못 냈습니다.
강등은 아예 일어나지 않았습니다. 커버레터가 직접 밝히듯, 시뮬레이션용 훼방이 워크로드 시작부터 돌아 DRAM 계층 사용량이 항상 워터마크 아래에 머물렀고 그래서 모든 테스트 런에서 실제 강등이 발생하지 않았습니다. 이 표는 LRU 기반 강등과 DAMON 기반 강등을 비교하지 않습니다. 오직 NUMAB-2 승격과 DAMON 승격의 차이만 담고 있습니다.
저자 본인의 한계 서술. 커버레터에는 "Evaluation Limitations" 절이 따로 있고, 관점에 따라 이 변형 Taobench가 그림을 너무 왜곡한 것처럼 보일 수 있으며 더 현실적인 워크로드나 더 공정한 마이크로벤치마크로 평가하는 편이 낫겠다고 적혀 있습니다. 저자가 자기 숫자에 대해 이보다 더 정직하기는 어렵습니다.
그리고 표준편차. 점수 대비 표준편차가 1.48%에서 3.02%입니다. 4.43%는 그 위에 있긴 하지만 압도적으로 위는 아닙니다.
진짜 흥미로운 건 다른 줄입니다. 같은 테스트에서 NUMAB-2, 즉 커널에 이미 들어 있는 기존 티어링 기능은 성능을 7.36% 떨어뜨렸습니다. 저자는 NUMAB-2의 동기적 승격이 Taobench의 실제 작업 진행을 막았기 때문이라고 추정합니다. 앞에서 짚은 "프로세스 컨텍스트에서 승격"이 여기서 값을 치른 겁니다.
이 표를 한 줄로 요약하면 이렇습니다 — 티어링을 켤 이유를 억지로 만들어 준 워크로드에서, 새 방식은 4.43% 벌었고 기존 방식은 7.36% 잃었습니다.
25%라는 숫자 — 그리고 그게 사실 티어링이 아니라는 것
6.17의 다중 목적지 마이그레이션에는 25%가 붙어 다닙니다. 원본 커버레터(Bijan Tabatabai, Micron, 2025-07-02)를 보면 이것도 조건이 다 적혀 있고, 앞의 이야기와는 성격이 완전히 다릅니다.
측정 환경. 128코어 256스레드 AMD CPU, 로컬 DDR 대역폭 72 GB/s, CXL 대역폭 26 GB/s. 워크로드는 대역폭 집약적인 embedding reduction 애플리케이션으로, 반복마다 같은 할당을 재사용하고 반복별 소요 시간을 보고합니다.
진행. 처음엔 시스템 대역폭 사용률이 낮으니 인터리브 가중치를 1대 0으로 두고 전부 로컬 메모리에 할당합니다. 워크로드가 시작되면 로컬 대역폭이 포화되고, 이때 가중치를 3대 1로 바꿔 DAMON이 데이터를 옮기게 합니다. 반복 시간은 7,600ms대에서 5,630ms대로 떨어졌고 커버레터는 이를 약 25% speedup이라고 적습니다.
여기서 중요한 전환. 이건 "뜨거운 건 빠른 계층, 식은 건 느린 계층"이 아닙니다. 정반대로 뜨거운 데이터를 일부러 느린 CXL에 얹어서 두 계층의 대역폭을 합산하는 겁니다. 용량 티어링이 아니라 대역폭 인터리빙입니다.
숫자가 맞아떨어지는지 직접 확인해 봤습니다. 72 더하기 26은 98이고, 98 나누기 72는 1.361이니 대역폭 병목이라면 시간은 0.735배가 돼야 합니다. 7,620ms 곱하기 0.735는 약 5,600ms이고 실측은 약 5,634ms입니다. 오차 1% 안쪽으로 들어맞습니다. 가중치 3대 1도 대역폭 비율 72대 26(약 2.8대 1)에 붙어 있습니다. 즉 이 25%는 대역폭 합산으로 설명이 되며, 그 이상도 이하도 아닙니다. 순수하게 대역폭에 묶인 워크로드가 아니라면 이 이득은 나오지 않습니다.
그리고 가장 정직해야 할 부분. 가중치를 1대 0에서 3대 1로 바꾼 건 사람입니다. 정확히 대역폭이 포화된 그 순간에요. 커버레터는 이 점을 숨기지 않습니다 — 이 패치 세트는 데이터를 어떻게 인터리브할지 바꾸는 메커니즘을 추가할 뿐이고, 가중치가 얼마여야 하는지라는 정책은 유저스페이스에 남긴다고 명시합니다. 그리고 시스템 대역폭 사용률이나 접근 지연을 모니터링해 가중치를 조율하는 유저스페이스 프로그램을 만들고 있지만 아직 공개할 준비가 안 됐다고 적습니다.
그 루프를 닫는 조각이 앞의 타임라인에 있던 node_eligible_mem_bp입니다. 스킴의 접근 패턴에 매칭되는 메모리 중 특정 노드에 있는 비율을 basis point로 재는 metric이고, 이걸 목표로 걸면 "뜨거운 데이터의 60%는 DRAM에, 40%는 CXL에" 같은 분포를 쿼터 오토튜너가 알아서 유지합니다. 커밋 9138e27a3bc3(Ravi Jonnalagadda, Micron)이 그 구현입니다.
주목할 점 셋. 첫째, 이 커밋은 저자 날짜가 2026-04-28이고 커밋 날짜가 2026-05-29입니다. 7.1-rc1이 2026-04-26에 나왔으니 이건 7.1을 놓쳤고, 실제로 DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP는 v7.0에도 v7.1에도 없고 v7.2-rc1에 처음 나타납니다. v7.2는 아직 정식 릴리스가 아니므로(현재 최신 태그가 v7.2-rc3입니다), 오늘 기준 이 기능이 들어간 정식 커널은 아직 없습니다. (LWN 기사는 이 기능이 7.1-rc1에 머지됐다고 적었지만, 발표자 본인 슬라이드는 "7.1-rc1 이후 mm-new에 머지"라고 적고 있고 소스가 슬라이드 쪽 손을 들어 줍니다. 7.1-rc1에 들어간 건 쿼터 목표 튜너 알고리즘 쪽입니다.)
둘째, 이 커밋에는 성능 숫자가 하나도 없습니다. "Testing Results" 절이 있긴 한데 내용은 2노드 이종 메모리 시스템에서 기능 검증을 했다는 것, TEMPORAL 튜너는 목표 분포로 빨리 수렴하고 CONSIST 튜너는 더 느리게 수렴한다는 것, 목표 도달 시간은 워크로드 강도에 따라 달라진다는 것뿐입니다. 수렴 동작 보고이지 speedup 보고가 아닙니다.
셋째, CONFIG_DAMON_PADDR이 필요합니다. 물리 주소 공간에서만 동작합니다. 반면 6.17의 가중치 인터리빙은 가상 주소 공간 전용입니다 — 폴리오가 VMA 안에서 매핑된 오프셋으로 목적지 노드를 정하는데, 물리 주소 스킴에서 그걸 알아내려면 비싼 rmap 순회가 필요하기 때문입니다. 즉 메커니즘과 그 자동 튜닝 목표가 서로 다른 주소 공간에 살고 있습니다.
정리하면, 25%는 진짜지만 사람이 손으로 스위치를 올려서 얻은 값이고, 그 스위치를 자동으로 올려 줄 물건은 1년 뒤에야 -rc에 도착했으며 아직 성능 숫자가 붙지 않았습니다.
94%라는 숫자 — 조건이 없는 숫자
LSFMM+BPF 2026에서 가장 큰 숫자는 94%였습니다. TPP-DAMON이 단일 스레드로는 너무 느려 다중 스레드 모델로 옮겼고, llama.cpp 벤치마크에서 94% 개선을 낸다는 내용입니다. SK hynix가 한 작업입니다.
발표자 본인이 공개한 슬라이드 원본을 받아 확인해 보면, 해당 슬라이드는 이렇게 생겼습니다 — 제목 "Multi-thread Tiering (SK hynix)", 불릿 셋: 서브리전별 DAMON 워커 스레드, 뜨거운/식은 페이지 찾기 가속, 마이그레이션 가속. 그리고 마지막 불릿 "Achieves ~94% llama.cpp speedup".
그게 전부입니다. 어떤 하드웨어인지, 어떤 모델인지, 무엇 대비인지, 몇 번 돌렸는지 아무것도 없습니다. 이 숫자의 조건을 담은 공개 커버레터를 저는 찾지 못했습니다. DAMON 프로젝트 자체 뉴스 목록에도 이 항목은 없습니다. LWN 기사가 같은 94%를 전하고 있지만 그건 같은 발표를 받아적은 것이므로 독립적인 확인이 아닙니다.
이걸 "가짜"라고 말하는 게 아닙니다. 다만 대조는 해 둘 만합니다. 4.43%에는 하드웨어 스펙, 워크로드 파라미터, 5회 반복, 표준편차 컬럼, 그리고 저자가 직접 쓴 한계 절이 붙어 있습니다. 94%에는 불릿 하나가 붙어 있습니다. 이 분야에서 숫자의 크기와 방법론의 양은 대체로 반비례합니다. 그리고 슬라이드를 계속 읽으면 이렇게 적혀 있습니다 — TPP-DAMON은 긍정적 테스트 결과가 "비공개로 공유"됐고(privately shared), 더 이상의 활발한 개발 계획은 없으며 지원 모드에 들어갔습니다.
즉 커널 티어링의 간판 자동 튜닝 모듈은 공개 성능 근거 없이 유지보수 모드로 넘어갔고, 개발 역량은 NUMA-TPP-DAMON이라는 다음 물건으로 옮겨 갔습니다. 그건 슬라이드 표현으로 "브레인스토밍 수준의 초기 기획"입니다.
진짜 문제는 알고리즘이 아니라 파라미터다
왜 이 커뮤니티가 이렇게까지 자동 튜닝에 매달리는지는 위스콘신 대학 연구진의 논문이 잘 설명합니다. From Good to Great: Improving Memory Tiering Performance Through Parameter Tuning(Kanellis 등, arXiv:2504.18714, 2025-04-25)의 초록은 이렇게 말합니다 — 기존 티어링 솔루션은 휴리스틱과 미리 정해 둔 임계값으로 배치·이주를 결정하는데, 그래서 워크로드와 하드웨어에 적응하지 못하고 최적 이하로 동작한다.
연구진은 베이지안 최적화로 기존 티어링 시스템(HeMem과 SK hynix의 HMSDK)의 파라미터를 탐색했고, 값을 제대로 잡으면 같은 시스템의 기본 설정 대비 2배, 당시 최신 티어링 시스템 대비 1.56배 성능이 나온다고 보고합니다.
이 문장을 앞의 4.43%와 나란히 놓으면 그림이 선명해집니다. 알고리즘을 바꿔서 얻는 게 한 자릿수 퍼센트인데, 같은 알고리즘의 파라미터를 제대로 잡으면 2배가 나옵니다. 티어링에서 값을 결정하는 건 메커니즘이 아니라 튜닝입니다. 그리고 기본 설정은 절반을 버리고 있습니다.
동시에 이건 나쁜 소식이기도 합니다. 그 2배를 얻는 방법이 베이지안 최적화, 즉 워크로드마다 비싼 탐색을 돌리는 것이기 때문입니다. 프로덕션에서 워크로드마다 파라미터 스윕을 돌릴 여력이 있는 조직은 많지 않습니다. 커널이 하려는 자가 튜닝은 바로 이 탐색을 온라인 피드백 루프로 대체하려는 시도이고, 6.16의 사용률·여유공간 목표부터 7.2-rc1의 분포 목표까지가 그 궤적입니다. 아직 도착하지 않았을 뿐입니다.
아직 해결되지 않은 것들
발표에서 나온 열린 문제들이 지금 이 기술의 성숙도를 가장 정확하게 말해 줍니다.
DAMON은 누가 접근했는지 모릅니다. 자가 튜닝 티어링 커버레터가 명시하듯 이 설계는 CPU NUMA 노드가 하나인 경우만 가정합니다. DAMON이 접근 정보의 출처를 알 수 없기 때문에, CPU NUMA 노드가 여럿인 시스템에 적용하는 건 복잡해진다고 저자가 직접 적었습니다. 2소켓 서버가 흔하다는 걸 생각하면 이건 작은 단서가 아닙니다.
DAMON과 NUMA balancing이 같은 비트를 놓고 다툽니다. 둘 다 page-idle 비트로 접근을 확인하기 때문에, 서로가 유발한 폴트를 상대방이 "측정"하게 됩니다. 발표에서 나온 후보안은 빌드 타임 배타(둘 중 하나만 커널에 넣기), 런타임 격리(한 번에 하나만 활성), 부분 격리, 그리고 그냥 서로 간섭하게 두기였습니다. Park의 제안은 필요한 정리 작업이 끝나면 첫 구현은 빌드 타임 배타를 쓰거나 아예 문제를 무시하자는 쪽이었습니다. 배타로 가면 배포판이 둘 중 하나를 골라야 하는 곤란한 처지에 놓입니다. 세션에서 Davidlohr Bueso가 여러 층이 메모리 배치 결정을 두고 서로 싸우는 문제를 우려한 것도 같은 맥락입니다.
다음 세대는 아직 아이디어입니다. NUMA-TPP-DAMON — 티어링을 NUMA 배치의 특수한 경우로 일반화해서 CPU·GPU 등 여러 접근자(accessor)마다 승격 경로를 따로 돌리자는 구상은 브레인스토밍 단계이고, 접근자별 모니터링이라는 난제가 앞에 있습니다.
그리고 문서. node_eligible_mem_bp는 v7.2-rc3의 include/linux/damon.h에는 있지만 DAMON 설계 문서의 쿼터 목표 metric 목록에는 아직 없습니다. 문서가 늦는 건 흔한 일이지만, 이 기능이 얼마나 갓 도착한 물건인지를 보여 주는 표시이긴 합니다.
그래서, 당신은 지금 이걸 켜야 하나
켤 만한 경우
- 서버가 코어가 아니라 메모리 용량에 묶여 있고, 워크로드 메모리의 상당 부분이 실제로 식어 있다. (Meta가 Vistara 논문에서 보고한 fleet 43.7%가 이 상태였습니다.)
- 워크로드가 대역폭에 묶여 있고 CXL 대역폭을 합산해서 얻을 게 있다. 이 경우엔 용량 티어링이 아니라 가중치 인터리빙을 봐야 하고, 위 25% 사례의 산수를 당신 하드웨어 숫자로 다시 해 보면 상한이 바로 나옵니다.
- 파라미터를 실제 워크로드로 튜닝할 여력이 있다. 위 논문대로라면 여기가 2배가 있는 자리입니다.
- CPU NUMA 노드가 하나다.
아직 아닌 경우
- 접근 패턴이 정적이다. 4.43% 실험의 원래 Taobench가 그랬고, 결과는 어떤 구현으로도 의미 있는 차이가 없었습니다. 티어링은 뜨거움과 차가움이 시간에 따라 바뀔 때 값을 합니다. 안 바뀌면 옮길 이유가 없습니다.
- "켜면 알아서 되는" 것을 기대한다. mainline에 티어링 모듈은 없고,
damo명령줄과 몇 개의 손으로 고른 상수가 당신 것입니다. - 2소켓 이상이다. 설계가 아직 그 경우를 가정하지 않습니다.
- 지연에 민감한 서비스인데 여유가 빠듯하다. 강등이 틀리면 그 페이지의 다음 접근은 CXL 지연을 그대로 먹습니다.
- NUMAB-2를 켜면 될 거라고 생각한다. 위 표에서 그건 7.36% 손해였습니다. 적어도 그 워크로드에서는요.
무엇을 하든 순서는 하나입니다 — 당신 워크로드의 접근 패턴을 먼저 재세요. 다행히 그건 이제 쉽습니다. DAMON_STAT이 6.17에 들어갔고 Debian 커널에서 빌드 활성화돼 있습니다. 페이지의 몇 퍼센트가 몇 시간째 안 읽히는지 모른 채 티어링을 켜는 건, 위 실험이 정확히 보여 주듯 아무것도 아닌 일에 마이그레이션 오버헤드를 내는 것입니다.
마치며
정리하면 이렇습니다. 리눅스 mainline은 2024년 6.11부터 2026년 7.2-rc1까지 CXL 티어링 부품을 꾸준히 받아 왔고, 그 부품들은 대부분 메모리를 파는 회사들(SK hynix, Micron)과 메모리에 돈이 묶인 회사(Meta)가 직접 쓴 코드입니다. 부품 자체는 잘 설계돼 있습니다.
다만 정직하게 말하면, 오늘 mainline에는 켜면 되는 티어링 모듈이 없고, CONFIG_DAMON은 기본으로 꺼져 있으며, 자동 튜닝의 마지막 조각은 아직 정식 릴리스에 들어가지 않았고, 간판 모듈은 공개 성능 근거 없이 지원 모드로 넘어갔습니다. 인용되는 숫자 중 가장 잘 문서화된 것은 4.43%이고 그것도 워크로드를 인위적으로 흔들어야 나왔으며, 가장 큰 숫자인 94%에는 조건이 없습니다.
CXL이 과대 선전돼 왔다는 말은 흔합니다. 커널 쪽에서 본 그림은 조금 다릅니다 — 여기서 진행은 느리지만 실재하고, 무엇보다 작업하는 사람들 스스로가 자기 숫자에 대해 대단히 정직합니다. 커버레터에 "이 워크로드는 그림을 너무 왜곡한 것처럼 보일 수 있다"고 적고, 슬라이드에 "결과는 비공개로 공유됐다"고 적는 사람들입니다. 과장은 대체로 이 코드를 쓰는 사람들이 아니라 그걸 요약해 나르는 층에서 붙습니다.
그러니 CXL 티어링을 검토한다면, 벤더 자료 대신 커버레터를 읽으십시오. 거기에는 숫자와 함께 그 숫자가 재지 않은 것들의 목록이 이미 적혀 있습니다.
참고 자료
- A 2026 DAMON update — LSFMM+BPF 2026 세션 보고 (Jonathan Corbet, LWN, 2026-05-08)
- 발표 슬라이드 원본 — damonitor/talks, LSFMM+BPF 2026
- mm/damon: let DAMON-based memory tiering self-tuned and just works — RFC 커버레터 (SeongJae Park, 2025-03-19). 4.43%의 측정 환경과 한계가 전부 여기 있습니다
- mm/damon/vaddr: Allow interleaving in migrate actions — 커버레터 (Bijan Tabatabai, Micron, 2025-07-02). 25%의 측정 환경
- From Good to Great: Improving Memory Tiering Performance Through Parameter Tuning (Kanellis 등, arXiv:2504.18714)
- DAMON 프로젝트 뉴스 목록 — 머지 시점과 협업 주체의 1차 기록
- DAMON 설계 문서 (커널 mainline)
- 은퇴한 DDR4를 되살리는 법 — Meta의 CXL 브리지 칩 Vistara (관련 글)
- 메모리 월과 HBM 대역폭 (관련 글)
CXL Memory Tiering: How Far Has the Kernel Come — What DAMON Merged, and What the Numbers Didn't Measure
- Introduction — The Kernel's Part in the CXL Story
- Two Ways the Kernel Moves Pages
- What's Actually Landed in Mainline as of July 2026
- The Number 4.43% — And What It Didn't Measure
- The Number 25% — And Why It Isn't Actually Tiering
- The Number 94% — A Number With No Conditions
- The Real Problem Isn't the Algorithm — It's the Parameters
- What's Still Unresolved
- So, Should You Turn This On Right Now
- Closing
- References
Introduction — The Kernel's Part in the CXL Story
We already covered the CXL hardware story once, in Reviving Retired DDR4 — Meta's CXL Bridge Chip, Vistara. It was a hyperscale end-of-life deployment report about reviving retired DDR4 as CXL and using it as a second memory tier.
But a chip being plugged in and that chip actually paying off are two different things. To the operating system, CXL memory just looks like a NUMA node with no CPUs, and deciding which pages are hot and which are cold — then actually moving them — is entirely the kernel's job. Get that judgment wrong and CXL is just slow RAM.
So this post looks at the code running on top of the hardware, not the hardware itself. We check directly against kernel source what's actually landed in Linux mainline as of July 2026, and trace the numbers cited in this space back to their original sources to see exactly what each one measured and didn't. The conclusion up front: what's landed are parts, the policy is still on you, and the bigger a number is, the less methodology tends to come attached to it.
Two Ways the Kernel Moves Pages
First, the lay of the land. There are broadly two mainline mechanisms for moving pages in tiered memory.
First, NUMA balancing's tiering mode (NUMAB-2). It finds hot pages via access-checking page faults (prot_none) and performs promotion in the process's own context — meaning the promotion work happens on the same thread as the application's actual work. Demotion is reclaim-based, handled by kswapd or direct reclaim.
Second, DAMON and DAMOS on top of it. DAMON spins up a kernel thread that samples memory access every 5ms and hands the results to userspace every 100ms. DAMON's creator, SeongJae Park, presented at LSFMM+BPF 2026 that overhead is under 0.1% on a typical system. It first merged in 5.15. DAMOS is the layer that attaches actions to those observations, and the actions used for tiering are migrate_hot (promotion) and migrate_cold (demotion). The key difference is that DAMOS runs on an asynchronous worker thread.
This difference comes back as a number later.
What's Actually Landed in Mainline as of July 2026
Rather than trusting slides or news coverage, I checked kernel source directly. Below is the tag each feature first appears in, confirmed against include/linux/damon.h and the documentation.
6.11 DAMOS_MIGRATE_HOT / DAMOS_MIGRATE_COLD
(Absent in v6.10 -> appears in v6.11. SK hynix: Hyeongtak Ji, Honggyu Kim, 2024-06-14)
For HMSDK's CXL capacity expansion. Thresholds are static values a human hand-sets.
6.16 node_mem_used_bp / node_mem_free_bp quota goals
(Self-tuning tiering, aka TPP-DAMON. SeongJae Park)
6.17 damos->migrate_dests -- multiple destination nodes + weights
(Micron: Bijan Tabatabai. Virtual address space only)
6.19 node_memcg_used_bp / node_memcg_free_bp
(cgroup-scoped tiering. Meta collaboration)
7.2-rc1 node_eligible_mem_bp
(Micron: Ravi Jonnalagadda. Not yet in any officially released kernel)
Two things need pointing out here.
First, there is no tiering kernel module that just works. The string "tier" appears zero times in mm/damon/Kconfig at v7.2-rc3. The only buildable DAMON modules are DAMON_RECLAIM, DAMON_LRU_SORT, and DAMON_STAT, and there is no tiering.c under mm/damon/. In other words, what mainline provides is parts — quota-goal metrics, migration actions, destination weighting — and assembling those into a policy is left to userspace.
This isn't an accident — it's the plan. In the self-tuning tiering RFC cover letter, the author himself wrote that he'd send the quota-goal metric piece first and the tiering module piece "later." The reason given was that the module side only assumes two tiers and requires the user to hand-enter node address ranges — far from a finished state. That "later" still hasn't arrived as of July 2026.
So to actually run this today, you have to hand-write a damo command, as shown in the presentation slides.
damo start \
--numa_node 0 --monitoring_intervals_goal 4% 3 5ms 10s \
--damos_action migrate_cold 1 --damos_access_rate 0% 0% \
--damos_apply_interval 1s \
--damos_quota_interval 1s --damos_quota_space 200MB \
--damos_quota_goal node_mem_free_bp 0.5% 0 \
--damos_filter reject young \
--numa_node 1 --monitoring_intervals_goal 4% 3 5ms 10s \
--damos_action migrate_hot 0 --damos_access_rate 5% max \
--damos_apply_interval 1s \
--damos_quota_interval 1s --damos_quota_space 200MB \
--damos_quota_goal node_mem_used_bp 99.7% 0 \
--damos_filter allow young \
--damos_nr_quota_goals 1 1 --damos_nr_filters 1 1 \
--nr_targets 1 1 --nr_schemes 1 1 --nr_ctxs 1 1
This configuration demotes cold pages on node 0 (DRAM) targeting 0.5% free space, and promotes hot pages on node 1 (CXL) targeting 99.7% DRAM utilization. The design intent is to set 0.5% and 99.7% to overlap slightly so promotion and demotion don't stall each other, and the cover letter proposes these two values as the default recommendation. It's not a bad interface, but it's hard to call this "just works."
Second, CONFIG_DAMON isn't on by default. In May 2025, SeongJae Park submitted a patch to enable it by default, on the grounds that major distributions were already building DAMON in and that it only grows the kernel package size by about 0.1%, and it landed in the 6.16-rc1 merge window. Then, on June 10, 2025, Linus Torvalds reverted it. The body of commit aef17cb3d3c4 is a single line — "No, we don't make random features default to being on."
Checking mm/damon/Kconfig at v7.2-rc3, config DAMON still has no default y. The revert has held.
The Number 4.43% — And What It Didn't Measure
The number attached to self-tuning tiering (6.16) is 4.42%. Reading the original RFC cover letter (SeongJae Park, 2025-03-19), all the conditions are spelled out.
Test environment. A machine exposing a 250 GiB DRAM tier and a 50 GiB CXL tier as NUMA nodes 0 and 1 respectively. The kernel is v6.13 with all the DAMON patches from the 2025-03-15 mm tree plus this series layered on top, and the mempolicy() syscall was patched to be ignored so that the application's traditional NUMA optimizations don't interfere. The workload is a modified variant of DCPerf's Taobench, with a memory size of 340 GiB, a 2,500-second warmup, a 1,440-second measurement window, and RSS growing to 270 GiB during warmup. Each configuration was run 5 times.
Results table (verbatim from the cover letter).
Config Score Stdev (%) Normalized
Baseline 1.6165 0.0319 1.9764 1.0000
Numab_tiering 1.4976 0.0452 3.0209 0.9264
DAMON_tiering 1.6881 0.0249 1.4767 1.0443
Doing the math directly: 1.6881 divided by 1.6165 is 1.0443, so DAMON tiering is a 4.43% improvement; 1.4976 divided by 1.6165 is 0.9264, so NUMAB-2 is a 7.36% regression. (The cover letter's summary text states 4.42% and 7.34%, but the values that actually come out of its own table are 4.43% and 7.36%. "~4.42%" carries through unchanged even into the LSFMM slides a year later. It's a small thing, but it also means the cited number hasn't passed through anyone who recomputed the original table.)
So far this sounds like good news. Now let's look at the caveats the same cover letter wrote down about itself.
The unmodified workload produced no difference at all. In the author's own words, Taobench's access pattern is so static that only about 13% of RSS was frequently accessed from start to finish, and as a result promotion — regardless of design or implementation — produced no meaningful performance difference. So the author patched the kernel to inject a disturbance that demotes up to 10 GiB of hot pages and promotes up to 10 GiB of cold pages once a minute. This was meant to simulate a situation where the access pattern periodically shifts, which is why the workload's name has "modified" attached to it.
In other words, 4.43% is a value produced on a workload artificially perturbed to favor tiering. On the original, unperturbed workload, no tiering implementation made a difference.
Demotion never actually happened. As the cover letter states directly, the simulated disturbance ran from the start of the workload, so DRAM-tier usage stayed below the watermark the whole time, and no actual demotion occurred in any test run. This table does not compare LRU-based demotion against DAMON-based demotion. It only captures the difference between NUMAB-2 promotion and DAMON promotion.
The author's own statement of limitations. The cover letter has a dedicated "Evaluation Limitations" section stating that, depending on one's perspective, this modified Taobench may skew the picture too much, and that it would be better to evaluate with a more realistic workload or a fairer microbenchmark. It's hard to be more honest about your own numbers than that.
And the standard deviation. Standard deviation relative to score ranges from 1.48% to 3.02%. 4.43% sits above that range, but not overwhelmingly so.
What's actually interesting is the other line. On the same test, NUMAB-2 — the tiering feature already in the kernel — actually made performance 7.36% worse. The author speculates this is because NUMAB-2's synchronous promotion blocked Taobench's actual work from progressing. This is where "promotion in the process's own context," noted earlier, exacts its cost.
Summed up in one line: on a workload artificially given a reason to need tiering, the new approach gained 4.43% and the existing approach lost 7.36%.
The Number 25% — And Why It Isn't Actually Tiering
25% is the number attached to 6.17's multi-destination migration. The original cover letter (Bijan Tabatabai, Micron, 2025-07-02) spells out its conditions too, and this one is a completely different animal from the story above.
Test environment. A 128-core, 256-thread AMD CPU, local DDR bandwidth of 72 GB/s, CXL bandwidth of 26 GB/s. The workload is a bandwidth-intensive embedding reduction application that reuses the same allocation across iterations and reports per-iteration time.
Procedure. Since system bandwidth utilization starts low, the interleave weight is initially set to 1:0 with everything allocated to local memory. Once the workload begins, local bandwidth saturates, and at that point the weight is changed to 3:1, having DAMON move data. Iteration time dropped from around 7,600ms to around 5,630ms, and the cover letter records this as roughly a 25% speedup.
Here's the important pivot. This is not "hot goes on the fast tier, cold goes on the slow tier." It's the opposite: deliberately placing hot data on the slower CXL tier to sum the bandwidth of both tiers. This is bandwidth interleaving, not capacity tiering.
I checked directly whether the numbers add up. 72 plus 26 is 98, and 98 divided by 72 is 1.361, so if this is a bandwidth bottleneck, time should scale by 0.735x. 7,620ms times 0.735 is about 5,600ms, and the measured value is about 5,634ms — within 1% error. The 3:1 weight also tracks the bandwidth ratio of 72:26 (roughly 2.8:1). In other words, this 25% is fully explained by bandwidth aggregation, no more and no less. Without a workload that is purely bandwidth-bound, this gain doesn't materialize.
And the part that most demands honesty. The one who changed the weight from 1:0 to 3:1 was a human — at exactly the moment bandwidth saturated. The cover letter doesn't hide this: it states plainly that this patch set only adds a mechanism for changing how data gets interleaved, and leaves the policy of what the weight should be to userspace. It also notes that a userspace program that monitors system bandwidth utilization or access latency to tune the weight is being built, but isn't ready to be published yet.
The piece that closes that loop is node_eligible_mem_bp, from the timeline above. It's a metric that measures, in basis points, what fraction of the memory matching a scheme's access pattern sits on a particular node, and setting it as a goal lets the quota auto-tuner maintain a distribution like "60% of hot data on DRAM, 40% on CXL" on its own. Commit 9138e27a3bc3 (Ravi Jonnalagadda, Micron) is the implementation.
Three things worth noting. First, this commit has an author date of 2026-04-28 and a commit date of 2026-05-29. Since 7.1-rc1 shipped on 2026-04-26, this missed 7.1 — and indeed DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP isn't in v7.0 or v7.1; it first appears in v7.2-rc1. Since v7.2 isn't an official release yet (the latest tag as of writing is v7.2-rc3), there is no officially released kernel with this feature as of today. (The LWN article states this feature merged in 7.1-rc1, but the presenter's own slides say "merged into mm-new after 7.1-rc1," and the source backs the slides. What landed in 7.1-rc1 was the quota-goal tuner algorithm.)
Second, this commit has zero performance numbers. There's a "Testing Results" section, but all it says is that functional verification was done on a 2-node heterogeneous memory system, that the TEMPORAL tuner converges to the target distribution quickly while the CONSIST tuner converges more slowly, and that time-to-target varies with workload intensity. It's a report on convergence behavior, not a speedup report.
Third, it requires CONFIG_DAMON_PADDR. It only operates in physical address space. By contrast, 6.17's weighted interleaving is virtual-address-space only — because a folio's destination node is determined by its mapped offset within the VMA, and figuring that out from a physical-address scheme requires an expensive rmap walk. In other words, the mechanism and its auto-tuning target live in two different address spaces.
To sum up, the 25% is real, but it's a value obtained by a human flipping the switch by hand, and the thing that would flip that switch automatically only arrived in an -rc a year later, and still has no performance numbers attached.
The Number 94% — A Number With No Conditions
The biggest number at LSFMM+BPF 2026 was 94%. TPP-DAMON was too slow single-threaded, so it moved to a multi-threaded model, and this is claimed to deliver a 94% improvement on the llama.cpp benchmark. This is SK hynix's work.
Pulling the original slides the presenter published themselves and checking them, the slide in question looks like this — title "Multi-thread Tiering (SK hynix)," three bullets: per-subregion DAMON worker threads, accelerated hot/cold page discovery, accelerated migration. And a final bullet: "Achieves ~94% llama.cpp speedup."
That's it. No hardware, no model, no baseline, no run count — nothing. I could not find a public cover letter that states this number's conditions. It doesn't appear in the DAMON project's own news list either. The LWN article reports the same 94%, but since that's just transcribing the same talk, it isn't independent confirmation.
I'm not saying this is "fake." But it's worth contrasting. 4.43% comes with hardware specs, workload parameters, 5 repetitions, a standard-deviation column, and a limitations section the author wrote himself. 94% comes with one bullet point. In this space, the size of a number and the amount of methodology attached to it are, generally, inversely proportional. And reading further into the slides, it states that TPP-DAMON's positive test results were "privately shared," that there are no plans for further active development, and that it has entered support mode.
In other words, kernel tiering's flagship auto-tuning module moved into maintenance mode without any public performance evidence, and development effort has shifted to the next thing, NUMA-TPP-DAMON. In the slide's own words, that's "early-stage, brainstorming-level planning."
The Real Problem Isn't the Algorithm — It's the Parameters
Why this community is so fixated on auto-tuning is well explained by a paper from University of Wisconsin researchers. The abstract of From Good to Great: Improving Memory Tiering Performance Through Parameter Tuning (Kanellis et al., arXiv:2504.18714, 2025-04-25) states: existing tiering solutions decide placement and migration using heuristics and pre-set thresholds, and as a result fail to adapt to the workload and hardware, operating suboptimally.
The researchers used Bayesian optimization to search the parameters of existing tiering systems (HeMem and SK hynix's HMSDK), and report that getting the values right yields 2x the performance of the same system's default settings, and 1.56x compared to the then-state-of-the-art tiering system.
Put this sentence next to the 4.43% above and the picture snaps into focus. Changing the algorithm gets you single-digit percentages; getting the same algorithm's parameters right gets you 2x. What determines the payoff in tiering is not the mechanism but the tuning. And the default settings are throwing away half of it.
At the same time, this is also bad news. The way to get that 2x is Bayesian optimization — running an expensive search per workload. Not many organizations can afford to run a parameter sweep per workload in production. The kernel's self-tuning effort is an attempt to replace exactly that search with an online feedback loop, and the trajectory runs from 6.16's utilization/free-space goals to 7.2-rc1's distribution goals. It just hasn't arrived yet.
What's Still Unresolved
The open problems raised in the talk say the most accurate thing about how mature this technology is right now.
DAMON doesn't know who did the accessing. As the self-tuning tiering cover letter states explicitly, this design assumes only a single CPU NUMA node. The author writes directly that because DAMON can't identify the source of an access, applying this to a system with multiple CPU NUMA nodes gets complicated. Given how common 2-socket servers are, this is not a small caveat.
DAMON and NUMA balancing fight over the same bit. Because both use the page-idle bit to check access, each ends up "measuring" faults the other one triggered. The candidate solutions raised in the talk were build-time exclusivity (put only one of the two in the kernel), runtime isolation (only one active at a time), partial isolation, and just letting them interfere. Park's proposal was that once the necessary cleanup work is done, the first implementation should either use build-time exclusivity or just ignore the problem. Going the exclusivity route puts distributions in the awkward position of having to pick one or the other. Davidlohr Bueso's concern during the session, about multiple layers fighting each other over memory placement decisions, is in the same vein.
The next generation is still just an idea. NUMA-TPP-DAMON — the concept of generalizing tiering as a special case of NUMA placement, running separate promotion paths per accessor (CPU, GPU, etc.) — is at the brainstorming stage, with the hard problem of per-accessor monitoring still ahead of it.
And the documentation. node_eligible_mem_bp is in include/linux/damon.h at v7.2-rc3, but it's not yet in the DAMON design document's list of quota-goal metrics. Lagging docs are common enough, but it's still a sign of just how freshly this feature arrived.
So, Should You Turn This On Right Now
When it's worth turning on
- Your servers are bound not by cores but by memory capacity, and a substantial share of your workload's memory is genuinely cold. (This was the state of the 43.7% of fleet that Meta reported in the Vistara paper.)
- Your workload is bandwidth-bound and there's something to gain from aggregating CXL bandwidth. In this case, look at weighted interleaving rather than capacity tiering — redo the arithmetic from the 25% case above with your own hardware's numbers and you get the ceiling immediately.
- You have the capacity to tune parameters against real workloads. Per the paper above, this is where the 2x lives.
- You have a single CPU NUMA node.
When it's not yet time
- Your access pattern is static. That was true of the original, unmodified Taobench in the 4.43% experiment, and the result was no meaningful difference under any implementation. Tiering pays off when hot and cold shift over time. If they don't shift, there's no reason to move anything.
- You're expecting something that "just works when you flip it on." There is no tiering module in mainline — the
damocommand line and a handful of hand-picked constants are yours to own. - You're on 2 sockets or more. The design doesn't yet assume that case.
- You're running a latency-sensitive service with a tight margin. If demotion gets it wrong, the next access to that page eats the full CXL latency.
- You think just turning on NUMAB-2 will do it. In the table above, that was a 7.36% loss — at least on that workload.
Whatever you do, there's one order of operations — measure your workload's access pattern first. Fortunately that's easy now. DAMON_STAT landed in 6.17 and is build-enabled in Debian's kernel. Turning on tiering without knowing what percentage of your pages have gone unread for how many hours is, exactly as the experiment above shows, paying migration overhead for nothing.
Closing
To sum up: Linux mainline has steadily received CXL tiering parts from 6.11 in 2024 through 7.2-rc1 in 2026, and most of those parts are code written directly by companies that sell memory (SK hynix, Micron) and a company with money tied up in memory (Meta). The parts themselves are well designed.
But to be honest, mainline today has no tiering module you can just switch on, CONFIG_DAMON is off by default, the last piece of auto-tuning still hasn't reached an official release, and the flagship module moved to support mode without public performance evidence. Of the cited numbers, the best-documented one is 4.43% — and even that only appeared after artificially perturbing the workload — while the biggest number, 94%, has no conditions attached at all.
It's a common line that CXL has been overhyped. The picture from the kernel side is a little different — here, progress is slow but real, and above all, the people doing the work are remarkably honest about their own numbers. These are people who write "this workload may skew the picture too much" in a cover letter, and "results were privately shared" on a slide. The exaggeration mostly gets added not by the people writing this code, but by the layer that summarizes and carries it onward.
So if you're evaluating CXL tiering, read the cover letters instead of the vendor materials. They already come with the number, and a list of everything that number didn't measure.
References
- A 2026 DAMON update — LSFMM+BPF 2026 session report (Jonathan Corbet, LWN, 2026-05-08)
- Original presentation slides — damonitor/talks, LSFMM+BPF 2026
- mm/damon: let DAMON-based memory tiering self-tuned and just works — RFC cover letter (SeongJae Park, 2025-03-19). The test environment and limitations behind 4.43% are all here
- mm/damon/vaddr: Allow interleaving in migrate actions — cover letter (Bijan Tabatabai, Micron, 2025-07-02). The test environment behind 25%
- From Good to Great: Improving Memory Tiering Performance Through Parameter Tuning (Kanellis et al., arXiv:2504.18714)
- DAMON project news list — primary record of merge timing and collaborators
- DAMON design documentation (kernel mainline)
- Reviving Retired DDR4 — Meta's CXL Bridge Chip, Vistara (related post)
- The Memory Wall and HBM — The Real Bottleneck That Divides AI Performance (related post)