CXL 메모리 풀링
개요
CXL(Compute Express Link) 메모리 풀링은 CXL 2.0에서 도입된 핵심 기능으로, 여러 호스트 CPU가 물리적으로 분리된 메모리 리소스를 공유할 수 있게 해주는 기술이다. 기존 DIMM 기반 메모리가 소켓당 고정된 용량으로 제한되는 것과 달리, CXL 메모리 풀링은 스위치를 통해 여러 메모리 디바이스를 하나의 풀로 구성하고, 각 호스트에 동적으로 할당할 수 있다.
메모리 풀링의 핵심 가치는 자원 활용률 극대화에 있다. 서버 간 메모리 사용률 불균형이 심한 클러스터 환경에서, 사용하지 않는 메모리를 다른 호스트에 유연하게 배분할 수 있으므로 전체 시스템의 메모리 효율성이 크게 향상된다. 또한 메모리 용량 확장 시 소켓 수를 늘리지 않고도 CXL 메모리 익스팬더만 추가하면 되므로 하드웨어 비용과 전력 소모를 줄일 수 있다.
핵심 개념
메모리 풀링 아키텍처
CXL 메모리 풀링은 크게 세 가지 레이어로 구성된다.
- 호스트(CPU): CXL.io로 장치를 발견하고, CXL.mem을 통해 풀링된 메모리에 로드/스토어로 접근한다. 호스트 관점에서는 원격 메모리가 로컬 메모리처럼 보이지만, 실제 물리적 접근은 CXL 라우터를 통해 이뤄진다.
- CXL 스위치/라우터: 여러 호스트와 메모리 디바이스를 중계하는 장치다. 포트 기반 라우팅(PBR) 테이블을 사용해 트래픽을 라우팅하며, HDM(Host-Managed Device Memory) 디코더가 메모리 주소를 실제 디바이스에 매핑한다.
- 메모리 풀: CXL Type 3 디바이스(메모리 익스팬더) 여러 개가 하나의 논리적 풀로 묶인다. 각 디바이스는 독립적인 HDM decoder를 가지며, 스위치가 호스트 요청을 적절한 디바이스로 전달한다.
메모리 할당 모델
CXL 사양은 두 가지 메모리 할당 모델을 정의한다.
| 모델 | 설명 | 용도 |
|---|---|---|
| Capacity Pooling | 여러 디바이스의 물리적 메모리를 하나의 큰 주소 공간으로 통합 | 대용량 메모리 필요 시 |
| Vault Pooling | 각 디바이스를 독립적인 메모리 영역으로 할당 | 성능 격리가 필요할 때 |
Capacity Pooling은 여러 CXL 메모리 디바이스의 용량을 하나의 큰 메모리 풀로 합치는 방식이다. 호스트는 마치 하나의 거대한 메모리에 접근하는 것처럼 보이며, 스위치가 실제 물리적 디바이스로 라우팅한다. 이 방식은 메모리 용량 확장에 유리하지만, 특정 디바이스 장애 시 전체 풀에 영향을 줄 수 있다.
Vault Pooling은 각 메모리 디바이스를 독립적인 메모리 볼트로 관리하는 방식이다. 호스트가 특정 볼트를 지정해 접근할 수 있으므로 성능 예측 가능성이 높고, 볼트 단위로 격리된 서비스를 제공할 수 있다. 다만 전체 풀 대비 활용률은 Capacity Pooling보다 낮을 수 있다.
HDM 디코더와 주소 매핑
HDM(Host-Managed Device Memory) 디코더는 CXL 메모리 풀링의 핵심 하드웨어 구성 요소다. 호스트가 CXL 메모리에 접근할 때, 플랫폼 펌웨어와 OS가 설정한 주소 윈도우를 기준으로 HDM 디코더가 호스트 물리 주소(HPA)를 CXL 디바이스의 DPA(Device Physical Address)로 연결한다.
HDM 디코더는 호스트 브리지, 스위치, Type 3 메모리 디바이스 각 계층에 존재할 수 있으며, 각 디코더는 독립적인 주소 범위와 인터리브 정책을 가진다. 이를 통해 한 호스트에는 풀의 일부만 노출하고 다른 호스트에는 다른 범위를 매핑할 수 있어 격리, 용량 할당, NUMA 정책 반영이 가능하다.
논리적 디바이스(Logical Device)
CXL 2.0 이후에서는 물리적 디바이스를 여러 호스트에 논리적으로 분할해 노출할 수 있다. 각 호스트는 자신에게 할당된 논리적 디바이스만 인식하며, 실제 물리적 리소스는 백엔드에서 관리된다.
이 기능은 다중 테넌트 환경에서 특히 유용하다. 클라우드 서비스 프로바이더(CSP)가 하나의 CXL 메모리 디바이스를 여러 고객에게 임대할 때, 각 고객은 독립된 메모리 영역을 할당받고 서로 간의 데이터 접근이 원천 차단된다.
비교/분석
메모리 확장 방식 비교
| 항목 | CXL 메모리 풀링 | 기존 DIMM 확장 | NUMA 기반 메모리 | SmartNIC 기반 |
|---|---|---|---|---|
| 확장 단위 | CXL 메모리 디바이스 | DIMM 슬롯 | 소켓당 메모리 | 네트워크 기반 |
| 최대 용량 | 수 TB (스위치 수준) | 소켓당 제한적 | 소켓 수에 비례 | 네트워크 대역폭 의존 |
| 레이턴시 오버헤드 | ~200ns | 없음 (로컬) | NUMA 원거리 ~300ns+ | ~1μs+ |
| 동적 할당 | 지원 (HDM 디코더) | 불가 | 불가 | 제한적 |
| 코히어런스 | CXL.mem 코히어런트 | 로컬 코히어런트 | NUMA 코히어런트 | 비코히어런트 |
| 비용 효율 | 높음 (공유) | 낮음 (고정) | 중간 | 낮음 |
CXL 2.0 vs 3.0 풀링 기능 비교
| 항목 | CXL 2.0 | CXL 3.0 |
|---|---|---|
| 풀링 모드 | Capacity/Vault Pooling | 모든 모드 + GFAM |
| 스위칭 | 1-hop 트리 | 멀티홉 패브릭 (메시, 링) |
| 메모리 공유 | 불가 (할당만 가능) | 같은 메모리 세그먼트 공유 가능 |
| Back-Invalidate | 불가 | 지원 (디바이스 → 호스트 캐시 무효화) |
| P2P 전송 | 불가 | 디바이스 간 직접 전송 지원 |
| 최대 노드 수 | 제한적 | 4,096 (PBR) |
| GFAM | 없음 | Global Fabric Attached Memory |
CXL 2.0의 핵심은 스위칭과 풀링을 통해 여러 Type 3 메모리 디바이스를 여러 호스트에 할당하는 것이다. CXL 3.0은 여기서 더 나아가 멀티레벨 스위칭, 메모리 공유, P2P, Back-Invalidate를 추가해 단순한 확장 버스를 넘어 패브릭형 메모리 시스템으로 확장한다.
동작 원리
CXL 메모리 풀링의 동작은 다음 단계로 설명할 수 있다.
-
시작과 초기화: 시스템 부팅 시 BIOS/펌웨어가 CXL 스위치와 메모리 디바이스를 발견한다. 각 디바이스는 HDM 디코더에 자신의 메모리 영역을 등록하고, 스위치는 포트 기반 라우팅 테이블을 구축한다.
-
메모리 할당: OS나 하이퍼바이저가 CXL 메모리 풀에서 필요한 용량을 호스트에 할당한다. HDM 디코더가 해당 호스트의 주소 공간에 물리적 메모리 영역을 매핑한다. 이 과정은 소프트웨어에서 제어되며, 핫플러그가 가능하다.
-
데이터 접근: 호스트가 CXL 메모리에 접근하면, 메모리 컨트롤러가 CXL.mem 프로토콜로 요청을 생성한다. 스위치가 라우팅 테이블을 참조해 적절한 메모리 디바이스로 요청을 전달하고, 응답이 호스트로 반환된다. 이 전체 과정에서 ~200ns의 추가 레이턴시가 발생한다.
-
동적 재할당: 호스트가 할당된 메모리를 더 이상 필요로 하지 않으면, 해당 영역을 풀에 반환하고 다른 호스트에 재할당할 수 있다. HDM 디코더의 매핑 테이블이 업데이트되며, 메모리 오프라인과 핫플러그 절차를 통해 운영 중 재구성이 가능하다.
-
오류 처리: 메모리 디바이스 장애나 링크 오류가 발생하면 펌웨어와 OS가 해당 디바이스 또는 디코더 범위를 오프라인 처리하고, 상위 오케스트레이션 계층이 워크로드를 다른 메모리 영역으로 재배치한다. CXL 자체가 자동 failover를 보장하는 것은 아니므로, 실제 가용성은 플랫폼 RAS 정책과 소프트웨어 관리 스택에 좌우된다.
장단점
| 장점 | 단점 |
|---|---|
| 소켓 수를 늘리지 않고 메모리 용량을 유연하게 확장할 수 있다 | CXL 메모리 접근에 ~200ns의 추가 레이턴시가 발생한다 |
| 여러 호스트가 메모리를 공유해 자원 활용률을 높일 수 있다 | CXL 2.0 이상의 하드웨어(스위치, 메모리 디바이스)가 필요하다 |
| 핫플러그/리무브로 가용성과 유연성을 확보할 수 있다 | 소프트웨어 스택(OS, 하이퍼바이저, 패브릭 매니저)의 CXL 지원이 필요하다 |
| 메모리 풀 단위로 비용 효율적인 메모리 확장이 가능하다 | 스위치 포인트 오브 페일러가 존재한다 |
| NUMA 인식 메모리 배치로 성능 최적화가 가능하다 | 초기 구현 비용과 복잡도가 높다 |
관련 기술
- CXL Version Comparison
- PCIe Gen5/Gen6
- Linux Memory Tiering Deep
- Memory Controller
- NUMA Architecture
- Linux Memory Management Basics
- CXL Consortium Specification
- Linux Kernel CXL Documentation
- Lenovo Press: Implementing CXL Memory on Linux
- Samsung CXL Memory Module
핵심 정리
CXL 메모리 풀링은 CXL 2.0에서 도입된 기능으로, CXL 스위치와 HDM 디코더를 통해 여러 호스트가 물리적 메모리 디바이스를 공유할 수 있게 한다. Capacity Pooling과 Vault Pooling 두 가지 모델을 지원하며, 동적 할당과 핫플러그가 가능하다. CXL 3.0에서는 GFAM, 멀티홉 패브릭, 메모리 공유, Back-Invalidate가 추가돼 더 유연한 풀링이 가능해졌다. 레이턴시 오버헤드(~200ns)와 하드웨어 비용은 단점이지만, 소켓 수 증가 없이 메모리 용량을 유연하게 확장할 수 있다는 점에서 클라우드와 데이터센터 환경에서 큰 가치를 제공한다.