CXL 메모리 할당, hotplug, tiering
개요
CXL 메모리는 단순한 장치 메모리가 아니라, Linux가 부팅 시점부터 runtime hotplug까지 이어서 다루는 메모리 자원입니다. 펌웨어가 제공하는 ACPI 정보로 NUMA 노드와 접근 성능을 읽고, 커널은 이를 SystemRAM, DAX kmem, ZONE_MOVABLE, memory_tier 같은 표현으로 나눠서 관리합니다.
핵심은 “어떻게 노드로 보이게 할 것인가”, “어떤 메모리를 상위 티어로 둘 것인가”, “언제 승격할 것인가”를 한 흐름으로 연결하는 데 있습니다. 이 문서는 early boot, memory hotplug, access coordinates, adistance, promotion control, DAMON/DAMOS를 이어서 정리합니다.
그림 1. 펌웨어 식별, CXL 드라이버, memory hotplug, memory_tier, promotion/demotion의 연결
핵심 개념
early boot와 memory hotplug
Linux는 early boot에서 immutable 자원인 NUMA 노드와 메모리 티어의 뼈대를 만들고, 이후 driver probe와 memory hotplug 단계에서 CXL 메모리를 실제 시스템 메모리로 드러냅니다. EFI_MEMORY_SP, CONFIG_EFI_SOFT_RESERVE, CONFIG_MHP_DEFAULT_ONLINE_TYPE_*, nosoftreserve 조합에 따라 같은 CXL 메모리라도 SystemRAM, SOFT_RESERVED, ZONE_NORMAL, ZONE_MOVABLE, DAX kmem 중 어디에 놓일지가 달라집니다.
여기서 중요한 제약은 NUMA 노드 생성이 runtime에 새로 일어나는 작업이 아니라는 점입니다. SRAT에 proximity domain이 있으면 early boot에서 미리 NUMA 노드를 예약하고, CFMWS 범위가 SRAT에 직접 매핑되지 않는 경우에는 커널이 fake PXM을 만들어 연결하기도 합니다. 즉, hotplug는 이미 잡혀 있는 노드 틀 안으로 메모리 블록을 추가하는 과정에 가깝습니다.
| 단계 | 입력 | Linux 쪽 결과 |
|---|---|---|
| 펌웨어 식별 | SRAT, CEDT, HMAT, CDAT |
NUMA 노드와 CXL 성능 정보의 원천 생성 |
| early boot | EFI_MEMORY_SP, CONFIG_EFI_SOFT_RESERVE |
Specific Purpose 메모리 분리 또는 SystemRAM 노출 |
| online 정책 | CONFIG_MHP_DEFAULT_ONLINE_TYPE_* |
ZONE_NORMAL / ZONE_MOVABLE / DAX kmem 선택 |
| runtime hotplug | CXL driver probe, memory hotplug | memory block 생성과 onlining |
| tier 반영 | access coordinates, HMAT, CDAT |
memory_tier와 adistance 갱신 |
이 흐름 때문에 CXL 메모리는 “장치 메모리”로만 끝나지 않고, OS가 관리하는 계층형 메모리의 일부가 됩니다.
runtime hotplug는 다시 두 단계로 나뉩니다. 먼저 메모리 section들이 memory block으로 묶여 sysfs에 나타나고, 그 다음 online, online_kernel, online_movable 정책으로 실제 page allocator에 편입됩니다. /sys/devices/system/memory/auto_online_blocks, memory_hotplug.online_policy, valid_zones를 같이 봐야 CXL 메모리가 왜 ZONE_NORMAL에 들어갔는지, 혹은 왜 ZONE_MOVABLE로 유지됐는지 설명할 수 있습니다.
핫니스 탐지
티어링의 출발점은 hot/cold를 얼마나 빨리, 얼마나 싸게 구분하느냐입니다. 가장 기본 경로는 NUMA balancing의 hint fault이고, 비용을 줄이려면 PTE Accessed bit, PMU 샘플링, CXL 디바이스 추적, DAMON region 샘플링을 보조로 씁니다.
| 방식 | 신호 | 장점 | 한계 | 적합한 경우 |
|---|---|---|---|---|
| NUMA hint fault | 접근 시 fault | 노드 단위 위치를 잘 잡음 | fault 경로 오버헤드가 있음 | 기본 티어링 |
| PTE Accessed bit | hardware A-bit | 비용이 낮음 | 빈도 정보가 거침 | 저비용 보조 탐지 |
| PMU 샘플링 | PEBS / IBS | 정밀도가 높음 | 하드웨어·드라이버 의존 | 고정밀 분석 |
| CXL hot-page tracking | 디바이스/컨트롤러 추적 | CPU 부담을 줄이기 좋음 | 플랫폼 의존성이 큼 | CXL 기반 시스템 |
| DAMON region sampling | region 단위 샘플링 | 대용량에서 오버헤드가 일정함 | 페이지 단위 정밀도는 낮음 | 상시 모니터링 |
페이지 마이그레이션
promotion과 demotion은 결국 페이지를 다른 노드로 옮기는 작업입니다. 커널의 migrate_pages() 경로는 단순 복사가 아니라 isolate, unmap, TLB flush, copy, remap, release를 거치므로 비용이 작지 않습니다.
/* NUMA hint fault에서 hot으로 판정된 페이지를 상위 티어로 */
int migrate_misplaced_folio(struct folio *folio,
struct vm_area_struct *vma, int node)
{
pg_data_t *pgdat = NODE_DATA(node);
LIST_HEAD(migratepages);
/* 1) 대상 노드에 승격 여유가 있는지(워터마크) 확인 */
if (migrate_misplaced_folio_prepare(folio, vma, node))
return -EAGAIN;
/* 2) LRU에서 분리 후 migrate_pages 코어 호출 */
folio_isolate_lru(folio);
list_add(&folio->lru, &migratepages);
migrate_pages(&migratepages, alloc_misplaced_dst_folio,
NULL, (unsigned long)pgdat, MIGRATE_ASYNC,
MR_NUMA_MISPLACED, &nr_succeeded);
/* MR_NUMA_MISPLACED → pgpromote_success 통계로 집계 */
return 0;
}
이 경로에서 중요한 비용은 rmap 역방향 순회와 TLB shootdown입니다. 그래서 hot하다고 확신할 때만, 그리고 가능한 한 batch로 묶어 이동합니다.
티어 추상화와 제어
하드웨어 거리만으로는 메모리 종류의 차이를 충분히 표현하기 어렵기 때문에 Linux는 adistance와 memory_tier를 사용합니다. HMAT와 CDAT의 지연/대역폭 정보는 access coordinates로 모이고, 그 값은 다시 하나의 거리 값으로 환산됩니다. MEMTIER_CHUNK_SIZE는 128이며, DRAM은 576, CXL/PMem 계열은 더 큰 값으로 배치됩니다.
cat /sys/devices/virtual/memory_tiering/memory_tier*/nodelist
echo 65536 | sudo tee /proc/sys/kernel/numa_balancing_promote_rate_limit_MBps
| 절제 장치 | 역할 |
|---|---|
promote_rate_limit_MBps |
초당 승격량 상한으로 thrashing을 막음 |
| hot threshold | 스캔 후 너무 늦게 다시 접근된 페이지를 걸러냄 |
| threshold 자동 조정 | 승격률이 상한을 넘으면 더 엄격하게 바꿈 |
pgpromote_candidate / success |
후보 대비 실제 승격 비율을 보여줌 |
또한 hotplug 운영 관점에서는 auto-movable와 contig-zones 차이도 중요합니다. 전자는 추가 메모리를 가능한 많이 ZONE_MOVABLE에 넣어 hotunplug 성공률을 높이려 하고, 후자는 기존 zone 연속성을 더 중시합니다. CXL 메모리를 나중에 다시 회수하거나 교체할 계획이 있다면 이 선택이 tiering 성능 못지않게 중요합니다.
DAMON / DAMOS 기반 티어링
DAMON은 페이지가 아니라 region 단위로 관찰하기 때문에 대용량에서도 오버헤드를 일정하게 유지하기 쉽습니다. DAMOS는 이 관찰 결과를 바탕으로 migrate_hot과 migrate_cold를 직접 실행해서, NUMA hint fault를 덜 쓰는 방향의 티어링을 가능하게 합니다.
echo Y | sudo tee /sys/module/damon_lru_sort/parameters/enabled
| DAMOS 요소 | 의미 |
|---|---|
| access pattern | nr_accesses, age, region 크기 조건 |
| action | migrate_hot = promotion, migrate_cold = demotion |
| quota | 한 주기 처리량 상한 |
| quota goal | 상위 티어 사용률을 목표로 quota를 자동 조절 |
비교/분석
| 방식 | 탐지 | promotion 능동성 | 오버헤드 | 비고 |
|---|---|---|---|---|
| NUMA balancing | hint fault(접근 시) | 수동(접근 발생에 반응) | 페이지 fault 비례 | 기본 경로 |
| TPP | reclaim + hint fault | 개선(경로 분리) | 중 | mainline 계열 |
| DAMON + DAMOS | region 샘플링 | 능동(압력 없이도) | 대용량에서 거의 일정 | 자가 조정 가능 |
| PMU / CXL HW | HW 카운터 / 디바이스 | 능동·저지연 | HW에 위임 | 정확도와 지연이 좋음 |
동작 원리
- 펌웨어가
SRAT,CEDT,HMAT,CDAT를 제공하고, Linux는 early boot에서 NUMA 노드와 memory tier의 골격을 만듭니다. - CXL driver는 access coordinates를 계산해 CXL 메모리의 latency와 bandwidth를 정리하고, hotplug 가능한 메모리를 SystemRAM 또는 DAX kmem으로 노출합니다.
- hotplug 단계에서 커널은 memory block을 만들고,
auto_online_blocks와online_policy에 따라ZONE_NORMAL또는ZONE_MOVABLE에 online합니다. memory_tier_init과memory_tier_late_init가 online 상태의 노드를 티어에 묶고,adistance로 상하위 계층을 정리합니다.- NUMA balancing, PMU, CXL HW 추적, DAMON이 hot 페이지를 찾습니다.
- hot으로 판단되면
migrate_pages()가 페이지를 더 빠른 티어로 옮기고, cold 페이지는 하위 티어로 내려갑니다. promote_rate_limit_MBps와 hot threshold가 승격 속도를 제어해 thrashing을 줄입니다.
이 흐름을 따라가면 CXL 메모리는 단순히 “붙는 메모리”가 아니라, Linux의 메모리 계층 안에서 policy와 hotplug의 영향을 함께 받는 자원이 됩니다.
장단점
- 장점: CXL 메모리를 SystemRAM, DAX, tiered memory로 유연하게 배치할 수 있습니다.
- 장점:
memory_tier와adistance덕분에 서로 다른 메모리 종류를 같은 정책으로 다루기 쉽습니다. - 장점: DAMON/DAMOS를 쓰면 대용량에서도 탐지 비용을 일정하게 유지하기 좋습니다.
- 단점: hint fault 기반 승격은 본질적으로 지연과 오버헤드가 있습니다.
- 단점: 잘못된 승격은 thrashing으로 바로 이어질 수 있습니다.
- 단점: CXL, HMAT, CDAT, hotplug, zone 정책이 함께 맞아야 해서 플랫폼 의존성이 큽니다.
관련 기술
- Linux Memory Management Basics
- Linux Memory Tiering Deep
- Virtual Memory
- Memory Controller
- CXL Version Comparison
- Linux Init (Early Boot)
- CXL Access Coordinates Computation
- NUMA Memory Policy
- Memory Hot(Un)Plug
- CXL Linux Soft Reserved / DAX
- DAMON
- CXL subsystem
핵심 정리
CXL 메모리 통합은 early boot, hotplug, tiering을 하나의 흐름으로 보는 문제입니다. 펌웨어가 알려준 성능 정보는 access coordinates와 adistance로 정리되고, Linux는 이를 memory_tier로 묶어 상위·하위 계층을 나눕니다. 실제 운영에서는 memory block이 어떤 online 정책으로 ZONE_NORMAL 또는 ZONE_MOVABLE에 편입되는지가 성능과 hotunplug 가능성을 함께 좌우합니다. hot 페이지는 migrate_pages()로 승격되고, promote_rate_limit_MBps와 hot threshold가 그 속도를 조절합니다. DAMON/DAMOS는 region 단위 관찰과 quota 제어로 이 과정을 더 저비용으로 보완합니다.