Linux Memory Tiering Deep
개요
Linux 메모리 티어링은 DRAM, HBM, CXL/PMem 같은 서로 다른 메모리 계층을 하나의 정책 아래에서 다루는 기법입니다. 핵심은 hot 페이지를 더 빠른 티어로 올리고, cold 페이지를 더 느린 티어로 내리되, 이동 비용과 thrashing을 같이 관리하는 데 있습니다.
이 문서는 kernel 내부 기준으로 hotness 탐지, 페이지 마이그레이션, abstract distance(adistance) 기반 티어 추상화, 승격 제어, DAMON/DAMOS 연계까지 이어지는 흐름을 정리합니다. 실제 구현은 mm/memory-tiers.c, include/linux/memory-tiers.h, mm/migrate.c, Documentation/admin-guide/mm/damon/ 문서군을 함께 봐야 연결이 맞습니다.
그림 1. Linux 메모리 티어링의 큰 흐름
핵심 개념
핫니스 탐지
티어링의 첫 단계는 어떤 페이지가 hot인지 찾는 일입니다. 기본 경로는 NUMA balancing의 hint fault이고, 보조 경로로 PTE Accessed bit, PMU 샘플링, CXL 디바이스 기반 추적, DAMON region 샘플링이 있습니다.
task_numa_work()는 주소 공간 일부를 주기적으로 스캔하고 PTE를PROT_NONE으로 바꿉니다.- 이후 접근이 들어오면
do_numa_page()가 hint fault를 처리하고 접근 사실과 노드 정보를 기록합니다. folio_use_access_time()는 slow memory folio에서_last_cpupid를 접근 시간 기록용으로 재사용합니다.- 이 방식은 정확도는 좋지만 fault 경로를 타기 때문에 탐지 지연과 오버헤드가 생깁니다.
이 흐름을 바탕으로 아래 절에서 이동, 추상화, 제어, DAMON/DAMOS를 각각 분해해 봅니다.
페이지 마이그레이션
promotion과 demotion은 결국 페이지를 다른 노드로 옮기는 작업이고, 커널의 migrate_pages() 계열이 중심입니다. 이동은 단순 복사가 아니라 isolate, unmap, TLB flush, copy, remap, release 순서를 거치며 비용이 꽤 큽니다.
그림 3. migrate_pages()가 수행하는 페이지 이동 단계
folio_isolate_lru()로 대상 folio를 LRU에서 분리합니다.remove_migration_ptes()가 migration entry를 정상 PTE로 되돌립니다.folio_migrate_flags()가 참조 상태, dirty 상태, cpupid 같은 보조 정보를 옮깁니다.- fast/slow 티어를 넘는 이동에서는 cpupid를 초기화해 과도한 재이동을 줄입니다.
티어 추상화
하드웨어 거리(NUMA distance)만으로는 메모리 종류를 충분히 표현하기 어렵기 때문에 커널은 abstract distance(adistance)를 씁니다. mt_perf_to_adistance()는 latency는 비례, bandwidth는 반비례로 반영해 성능 정보를 하나의 거리 값으로 바꿉니다.
MEMTIER_CHUNK_SIZE는 128이고, adistance를 128 단위로 묶어memory_tier를 만듭니다.- 기본 DRAM은
MEMTIER_ADISTANCE_DRAM = 576에 놓입니다. find_create_memory_tier()는 같은 chunk에 속하는 memtype을 같은 tier로 묶습니다.node_is_toptier()는 CPU가 붙은 상위 tier를 판별하고,next_demotion_node()는 하위 tier로 갈 경로를 고릅니다.
그림 4. HMAT/CDAT 성능 정보가 adistance와 memory_tier로 정리되는 과정
/sys/devices/virtual/memory_tiering/memory_tier*/nodelist를 보면 실제 tier 구성을 확인할 수 있습니다.
cat /sys/devices/virtual/memory_tiering/memory_tier*/nodelist
제어 루프
승격은 이득이 분명할 때만 해야 합니다. 그래서 커널은 승격량 상한과 hot threshold를 함께 써서 thrashing을 막습니다. hint fault latency가 짧은 페이지만 hot 후보로 남기고, 승격률이 상한에 가까워지면 threshold를 더 엄격하게 바꿉니다.
그림 5. hint fault 지연과 승격량 상한을 이용한 제어 루프
- rate limit은 상위 티어가 과도하게 잠식되는 것을 막습니다.
- hot threshold는 스캔 후 너무 늦게 다시 접근된 페이지를 걸러냅니다.
- 자동 조정은 워크로드가 바뀌어도 승격 적극성을 다시 맞춥니다.
DAMON / DAMOS 기반 티어링
DAMON은 페이지가 아니라 region 단위로 관찰하므로 대용량에서도 오버헤드를 일정하게 유지하기 쉽습니다. DAMOS는 그 관찰 결과에 따라 migrate_hot과 migrate_cold 같은 작업을 직접 실행합니다.
그림 6. DAMON region 샘플링과 DAMOS의 자동 작업 적용
- sampling interval은 대표 주소를 얼마나 자주 볼지 정합니다.
- aggregation interval은 접근 빈도를 얼마나 자주 묶어 볼지 정합니다.
- region 수 상한은 모니터링 비용을 일정하게 유지합니다.
- quota와 quota goal은 상위 티어 사용률을 맞추도록 작업량을 조절합니다.
비교/분석
| 방식 | 신호 | 장점 | 한계 | 적합한 경우 |
|---|---|---|---|---|
| NUMA hint fault | 접근 시 fault | 노드 단위 접근 위치를 알기 좋음 | fault 오버헤드와 지연이 있음 | 기본 티어링 |
| PTE Accessed bit | hardware A-bit | 비용이 낮음 | 빈도 정보가 거칠음 | 저비용 보조 탐지 |
| PMU 샘플링 | PEBS / IBS | 정밀도가 높음 | 하드웨어·드라이버 의존 | 고정밀 분석 |
| DAMON region sampling | region 단위 샘플링 | 대용량에서 오버헤드가 일정함 | 페이지 단위 정밀도는 낮음 | 상시 모니터링 |
| CXL hot-page tracking | 디바이스/컨트롤러 추적 | CPU 부담을 줄이기 좋음 | 플랫폼 의존성이 큼 | CXL 기반 시스템 |
동작 원리
- 펌웨어(HMAT/CDAT)나 디바이스 드라이버가 메모리 성능 정보를 제공합니다.
- 커널은 그 값을
adistance로 바꾸고, 같은 chunk의 노드를 같은memory_tier로 묶습니다. - NUMA balancing이나 DAMON이 hot 페이지를 찾습니다.
- hot으로 판단되면
migrate_pages()가 페이지를 다른 tier로 옮깁니다. - migration entry가 접근을 막고, 이동이 끝나면 새 folio가 다시 매핑됩니다.
- 승격률과 threshold는 제어 루프가 조정해서 thrashing을 줄입니다.
이 흐름 덕분에 DRAM, HBM, CXL/PMem 같은 서로 다른 메모리 종류를 한 정책으로 다룰 수 있습니다. 특히 memory_tier와 node_demotion 경로가 분리돼 있어, 상위 티어는 승격 대상으로, 하위 티어는 강등 대상으로 비교적 명확하게 관리됩니다.
장단점
- 장점: 서로 다른 메모리 계층을 하나의 정책으로 묶을 수 있습니다.
- 장점: DAMON/DAMOS를 쓰면 대용량에서도 모니터링 비용을 관리하기 쉽습니다.
- 장점: hot 페이지를 상위 티어에 집중시켜 평균 지연을 줄일 수 있습니다.
- 단점: hint fault 기반은 본질적으로 느리고 비용이 있습니다.
- 단점: 잘못된 승격은 thrashing으로 바로 이어질 수 있습니다.
- 단점: CXL, HMAT, CDAT 같은 플랫폼 지원 품질에 따라 결과가 달라집니다.
관련 기술
- Memory Hierarchy
- Virtual Memory
- Memory Controller
- CXL Version Comparison
- HBM Generation Comparison
- Linux kernel
Documentation/admin-guide/mm/damon/index.rst - Linux kernel
Documentation/admin-guide/mm/damon/usage.rst - Linux kernel
Documentation/admin-guide/mm/damon/reclaim.rst - Linux kernel
Documentation/admin-guide/mm/damon/lru_sort.rst - Linux kernel
include/linux/memory-tiers.h - Linux kernel
mm/memory-tiers.c - Linux kernel
mm/migrate.c
핵심 정리
메모리 티어링은 hot 페이지를 빠른 메모리로, cold 페이지를 느린 메모리로 보내는 정책입니다. 핵심은 탐지 지연과 이동 비용을 감수할 만큼 진짜 hot한지 판단하는 데 있습니다. 커널은 adistance와 memory_tier로 계층을 추상화하고, migrate_pages()로 실제 이동을 처리합니다. DAMON/DAMOS는 region 단위 관찰과 quota/goal 제어로 이 과정을 더 저비용으로 보완합니다.