Table of Contents
As modern data infrastructure scales to support terabyte-scale in-memory databases (Redis, Dragonfly, ClickHouse) and multi-billion parameter Large Language Model (LLM) serving, systems engineers face the Memory Wall.
Expanding traditional server DDR5 DRAM is severely bottlenecked by motherboard CPU socket constraints and exorbitant memory costs.
At the same time, leaving cold data idling in expensive DDR5 RAM wastes precious infrastructure budget.
To solve memory scaling constraints, modern cloud datacenters are transitioning to Heterogeneous Memory Tiering.
Powered by Compute Express Link (CXL 3.0) cache-coherent memory expansion and Linux kernel AutoNUMA page tiering, applications transparently combine fast local DRAM, expander CXL memory, and ultra-fast NVMe storage into a single unified memory space.
This article details CXL 3.0 CXL.mem protocols, NUMA tiering hierarchies, and automated kernel page demotion/promotion.
Heterogeneous Memory Tiering Architecture
How CXL 3.0 and AutoNUMA tier hot and cold memory pages across hardware tiers:
Core Memory Tiering Concepts
- The Memory Expansion Bottleneck: CPU pin count limitations restrict standard servers to 8 memory channels per socket. Plugging in higher capacity DRAM DIMMs drops memory clock speeds, creating a strict physical barrier to DRAM expansion.
- Compute Express Link (CXL 3.0):
- Built on top of the physical PCIe 5.0 / 6.0 bus, CXL introduces low-latency cache-coherent protocols:
CXL.io: Standard PCIe device discovery and I/O.CXL.cache: Allows external accelerator devices to access CPU memory coherently.CXL.mem: Allows the CPU to access external device memory using standard load/store assembly instructions with near-DRAM latency ($\approx 180\text{ns}$).
- CXL Memory Pooling: Multiple independent server nodes can dynamically allocate and share terabytes of CXL memory from a centralized hardware memory pool.
- Built on top of the physical PCIe 5.0 / 6.0 bus, CXL introduces low-latency cache-coherent protocols:
- NUMA Tiering Hierarchies: The Linux kernel organizes heterogeneous memory into distinct Non-Uniform Memory Access (NUMA) nodes:
- Tier 0 (Fast Tier): Local CPU-attached DDR5 DRAM ($100\text{ns}$ latency, $300\text{ GB/s}$ bandwidth).
- Tier 1 (Medium Tier): CXL Memory Controllers ($180\text{ns}$ latency, $150\text{ GB/s}$ bandwidth).
- Tier 2 (Slow Tier): CXL Memory-backed Flash / NVMe PMEM ($10\mu\text{s}$ latency).
- Automated Kernel Page Demotion & Promotion (
AutoNUMA):- Page Demotion: When Tier 0 (DRAM) memory pressure rises, the kernel's
kswapddaemon scans page access bits. Cold pages (un-accessed over a time window) are demoted from Tier 0 to Tier 1 (CXL memory) without swapping to disk! - Page Promotion: If a demoted page in Tier 1 receives a sudden burst of read/write accesses (detected via NUMA hinting page faults),
AutoNUMAasynchronously promotes the page back to Tier 0 DRAM.
- Page Demotion: When Tier 0 (DRAM) memory pressure rises, the kernel's
Python Implementation: Heterogeneous Memory Tiering Engine
Here is a production-grade Python implementation of a Heterogeneous Memory Tiering Manager featuring NUMA page tracking, cold page demotion, and hot page promotion:
import time
from typing import Dict, List, Optional
from pydantic import BaseModel
class MemoryPage(BaseModel):
page_id: int
data_payload: str
access_count: int = 0
last_accessed_epoch: float
current_tier: int = 0 # 0 = DRAM, 1 = CXL, 2 = NVMe
class HeterogeneousMemoryTierManager:
"""
Simulates Linux AutoNUMA Heterogeneous Memory Tiering (DRAM -> CXL -> NVMe).
"""
def __init__(self, dram_capacity_pages: int = 2, cxl_capacity_pages: int = 3):
self.dram_cap = dram_capacity_pages
self.cxl_cap = cxl_capacity_pages
self.page_store: Dict[int, MemoryPage] = {}
def allocate_page(self, page_id: int, data: str) -> MemoryPage:
"""Allocates new memory page into Tier 0 (DRAM). Triggers demotion if full."""
now = time.time()
page = MemoryPage(page_id=page_id, data_payload=data, last_accessed_epoch=now, current_tier=0)
print(f" 📥 [Alloc Page #{page_id}] Attempting allocation in Tier 0 (DRAM)...")
# Check DRAM capacity
dram_pages = [p for p in self.page_store.values() if p.current_tier == 0]
if len(dram_pages) >= self.dram_cap:
self._demote_coldest_dram_page()
self.page_store[page_id] = page
print(f" ✅ [Allocated] Page #{page_id} placed in Tier 0 (DRAM).")
return page
def access_page(self, page_id: int) -> MemoryPage:
"""Simulates CPU load/store access. Promotes page if accessed in slower tier!"""
if page_id not in self.page_store:
raise KeyError(f"Page #{page_id} not found!")
page = self.page_store[page_id]
page.access_count += 1
page.last_accessed_epoch = time.time()
tier_names = {0: "Tier 0 (DRAM)", 1: "Tier 1 (CXL)", 2: "Tier 2 (NVMe)"}
print(f" âš¡ [CPU Load/Store] Accessing Page #{page_id} from {tier_names[page.current_tier]}")
# If page is in CXL (Tier 1) or NVMe (Tier 2) and accessed frequently -> PROMOTE!
if page.current_tier > 0 and page.access_count >= 2:
self._promote_page_to_dram(page)
return page
def _demote_coldest_dram_page(self):
"""Demotes coldest DRAM page to Tier 1 (CXL)."""
dram_pages = [p for p in self.page_store.values() if p.current_tier == 0]
if not dram_pages:
return
# Coldest page = lowest access count / oldest access time
coldest = min(dram_pages, key=lambda p: (p.access_count, p.last_accessed_epoch))
# Check CXL capacity
cxl_pages = [p for p in self.page_store.values() if p.current_tier == 1]
if len(cxl_pages) >= self.cxl_cap:
self._demote_cxl_to_nvme(cxl_pages)
coldest.current_tier = 1
print(f" 🧊 [AutoNUMA Demotion] Cold Page #{coldest.page_id} demoted: Tier 0 (DRAM) -> Tier 1 (CXL).")
def _demote_cxl_to_nvme(self, cxl_pages: List[MemoryPage]):
coldest_cxl = min(cxl_pages, key=lambda p: (p.access_count, p.last_accessed_epoch))
coldest_cxl.current_tier = 2
print(f" 🧊 [AutoNUMA Demotion] Coldest CXL Page #{coldest_cxl.page_id} demoted: Tier 1 (CXL) -> Tier 2 (NVMe).")
def _promote_page_to_dram(self, page: MemoryPage):
"""Promotes page to Tier 0 DRAM."""
old_tier = page.current_tier
# Ensure space in DRAM
dram_pages = [p for p in self.page_store.values() if p.current_tier == 0]
if len(dram_pages) >= self.dram_cap:
self._demote_coldest_dram_page()
page.current_tier = 0
print(f" 🔥 [AutoNUMA Promotion] Hot Page #{page.page_id} promoted: Tier {old_tier} -> Tier 0 (DRAM)!")
# Demonstration Execution
if __name__ == "__main__":
mem_mgr = HeterogeneousMemoryTierManager(dram_capacity_pages=2, cxl_capacity_pages=2)
print("🚀 Demonstrating CXL Heterogeneous Memory Tiering & AutoNUMA...")
print("=" * 75)
# 1. Fill DRAM (Pages 1 & 2)
mem_mgr.allocate_page(1, "LLM_Weights_Layer1")
mem_mgr.allocate_page(2, "LLM_Weights_Layer2")
# 2. Allocate Page 3 -> Triggers Demotion of Page 1 to CXL!
print("\n1. Triggering DRAM Memory Pressure:")
mem_mgr.allocate_page(3, "LLM_Weights_Layer3")
# 3. Access Demoted Page 1 multiple times -> Triggers AutoNUMA Promotion back to DRAM!
print("\n2. Accessing Cold Page #1 (Currently in CXL Tier 1):")
mem_mgr.access_page(1)
mem_mgr.access_page(1) # 2nd access triggers promotion!
2. Heterogeneous Memory Gotchas & Best Practices
When configuring CXL and memory tiering:
Use CXL 3.0 Cache Coherency for Shared Pools: Ensure your CPU platform supports CXL.mem hardware cache coherency. Without hardware cache coherency, software must execute manual cache invalidation instructions (clflushopt), degrading memory performance.
Beware of NUMA Remote Latency Hops: If a CPU core on Socket 0 accesses CXL memory attached to Socket 1's PCIe bus, latency jumps from $180\text{ns}$ to $>350\text{ns}$ (Cross-Socket NUMA Penalty). Bind memory-intensive threads to local NUMA nodes using numactl --membind.
Real-World Enterprise Impact
Datacenters deploying CXL 3.0 memory tiering (such as AWS, Microsoft Azure, and Meta Hyperscale AI clusters) report:
- Over $50%$ Reduction in Total Cost of Ownership (TCO): Expanding memory capacity using lower-cost CXL expansion modules instead of high-cost DDR5 DRAM DIMMs.
- $3\times$ Larger In-Memory Database Datasets: Running terabyte-scale Redis and vector search engines without encountering CPU pin or motherboard memory slot limits.

Discussion & Comments