Ryotta's Basic

System
🖥️ System 검증완료

title: NUMA 아키텍처
date: 2025-06-25
category: system
tags: [NUMA, multi-socket, remote memory access, NUMA policy, ccNUMA, QPI, UPI, HyperTransport]


NUMA 아키텍처

개요

NUMA(Non-Uniform Memory Access)는 멀티 프로세서 시스템에서 메모리 접근 시간이 프로세서와 메모리의 물리적 상대 위치에 따라 달라지는 메모리 아키텍처이다. 각 프로세서(또는 프로세서 그룹)는 자신의 로컬 메모리를 빠르게 접근할 수 있지만, 다른 프로세서의 로컬 메모리에 접근할 때는 인터커넥트를 통해 추가 지연이 발생한다. 이러한 비균일한 접근 패턴은 시스템의 확장성을 높이는 동시에 메모리 대역폭 병목을 완화한다.

NUMA는 SMP(Symmetric Multiprocessing)에서 자연스럽게 확장된 아키텍처로, 1990년대부터 Unisys, Convex, SGI, Sequent, DEC 등 상용 시스템에 도입되었다. 현대 서버에서 NUMA는 표준 아키텍처로 자리잡았으며, Intel의 QPI(QuickPath Interconnect)/UPI(UltraPath Interconnect), AMD의 HyperTransport/Infinity Fabric 등의 고속 인터커넥트로 구현된다.

핵심 개념

NUMA 토폴로지

NUMA Topology

NUMA 시스템의 토폴로지는 프로세서 노드 간 연결 구조를 결정한다:

토폴로지 유형 설명 장점 단점
2-Socket Direct Connect 두 소켓이 직접 연결 단순한 구조, 낮은 지연 확장성 제한
Multi-Socket Ring 노드가 링으로 연결 균일한 평균 지연 최대 지연 증가
Multi-Socket Mesh 노드 간 메시 연결 높은 대역폭, 낮은 평균 지연 복잡한 라우팅
Multi-Socket Butterfly 나비형 연결 낮은 직경, 높은 대역폭 구현 복잡도

캐시 일관성 (Cache Coherence)

ccNUMA Protocol

ccNUMA(Cache-Coherent NUMA)는 프로세서 간 캐시 일관성을 유지하는 NUMA 구현이다:

  • ** Snooping 기반**: 모든 노드가 버스를 모니터링. 소규모 시스템에 적합 (2~4노드).
  • Directory 기반: 메모리 위치별로 캐시 소유권 정보를 디렉토리에 저장. 대규모 시스템에 적합.
  • MESIF/MOESI 프로토콜: x86에서 사용되는 캐시 일관성 프로토콜. Modified, Exclusive, Shared, Invalid 상태에 Forward(F) 또는 Owned(O)를 추가.

원격 메모리 접근 (Remote Memory Access)

프로세서가 로컬 메모리가 아닌 다른 노드의 메모리에 접근할 때 발생한다:

  • 지연 시간 차이: 로컬 접근 대비 1.5x~3x의 추가 지연 (인터커넥트 홉 수에 따라 달라짐)
  • 대역폭 감소: 인터커넥트 대역폭은 로컬 메모리 대역폭보다 낮음
  • 캐시 트래픽 증가: 원격 접근 시 캐시 일관성 프로토콜로 인한 추가 트래픽

NUMA 인지 하드웨어

하드웨어 구성 요소 역할
Integrated Memory Controller (IMC) 각 노드의 로컬 메모리 관리
Interconnect (QPI/UPI/HT) 노드 간 고속 통신
NUMA-aware Cache Coherence 원격 캐시 라인 추적 및 동기화
Home Agent 메모리 트랜잭션의 순서 보장 및 디렉토리 역할

비교/분석

UMA vs NUMA vs NUMA-like 비교

항목 UMA (Uniform) NUMA Cluster
메모리 접근 모든 프로세서에게 균일 위치에 따라 비균일 분산된 메모리
지연 시간 균일 비균일 (로컬 < 원격) 네트워크 지연 (μs)
대역폭 공유 버스 노드별 로컬 대역폭 노드별 독립
확장성 2~8 프로세서 2~1000+ 프로세서 수천 노드
프로그래밍 모델 단순 NUMA 인식 필요 MPI 등 필요
캐시 일관성 단순 스누핑 복잡한 프로토콜 없음 (소프트웨어)
예시 구형 데스크톱 현대 서버 HPC 클러스터

AMD vs Intel NUMA 구현

항목 AMD (EPYC/Opteron) Intel (Xeon)
인터커넥트 HyperTransport → Infinity Fabric QPI → UPI, 패키지 내부 Mesh
소켓 내부 NUMA 분할 NPS1/2/4/8로 메모리 컨트롤러와 CCD를 여러 NUMA 도메인으로 분할 SNC(Sub-NUMA Clustering)로 LLC/메모리 지역성 강화
메모리 컨트롤러 구조 I/O Die 중심 IMC와 Fabric 라우팅 소켓 통합 IMC와 UPI Home Agent
최대 메모리 대역폭 8ch DDR5 (Zen 4 SP5) 8ch DDR5 (Sapphire Rapids)
운영 포인트 CCD-메모리 거리와 NPS 설정이 지연 시간에 영향 UPI 홉 수와 SNC 설정이 원격 접근 비용에 영향

Linux NUMA 정책

Linux 커널은 여러 NUMA 메모리 정책을 제공한다:

정책 동작 사용처
MPOL_DEFAULT 시스템 기본 정책 (로컬 할당) 기본값
MPOL_BIND 지정된 노드에서만 할당 성능 예측 가능성이 중요한 앱
MPOL_PREFERRED 지정 노드 우선, 실패 시 다른 노드 특정 노드 배정이 유리한 경우
MPOL_INTERLEAVE 지정 노드들에 페이지 교차 할당 공유 메모리, 대용량 데이터
MPOL_WEIGHTED_INTERLEAVE 가중치 기반 교차 할당 이종 메모리 시스템 (CXL)
MPOL_PREFERRED_MANY 다수 노드 우선 할당 다중 노드 선호 시

NUMA 스케줄링 정책

정책 설명 장점
Process-Fair 프로세스의 메모리 할당 노드 균형 시스템 부하 균형
First-Touch 페이지가 처음 접근될 때 해당 CPU의 로컬 노드에 할당 지역성 활용
Page-Migration 프로세스를 메모리가 있는 노드로 이동 또는 메모리를 CPU로 이동 지연 시간 최소화
AutoNUMA 커널이 자동으로 메모리 접근 패턴 감지 및 마이그레이션 수동 설정 불필요

동작 원리

1단계: 시스템 토폴로지 인식

부팅 시 OS 커널은 ACPI(Advanced Configuration and Power Interface) 테이블에서 NUMA 토폴로지와 거리 정보를 읽는다:

  • SRAT (System Resource Affinity Table): CPU, 메모리, 디바이스의 NUMA 노드 소속
  • SLIT (System Locality Information Table): 노드 간 거리 행렬과 상대 지연 비용
  • HMAT (Heterogeneous Memory Attribute Table): 메모리 계층별 지연 시간과 대역폭 특성

운영체제는 이 정보를 /sys/devices/system/node/, numactl --hardware, lstopo 같은 인터페이스로 노출하며, 이후 스케줄러와 페이지 할당기가 이 정보를 바탕으로 로컬 우선 배치를 결정한다.

2단계: 메모리 할당 정책 적용

프로세스가 메모리를 할당할 때, 적용된 NUMA 정책에 따라:

  1. 로컬 할당 (Default): 현재 CPU가 속한 노드의 메모리에서 할당
  2. 바인딩 할당 (Bind): 지정된 노드 세트에서만 할당 시도
  3. 교차 할당 (Interleave): 지정된 노드들에 페이지 단위로 교차 할당

3단계: 원격 접근 처리

CPU가 로컬 메모리에 없는 데이터에 접근할 때:

  1. 로컬 메모리 컨트롤러가 원격 노드의 메모리 컨트롤러에 요청 전달
  2. 원격 노드에서 데이터 읽기/쓰기 수행
  3. 캐시 일관성 프로토콜로 다른 노드의 캐시 갱신
  4. 결과 데이터가 인터커넥트를 통해 반환

4단계: AutoNUMA 동작

Linux 커널의 자동 NUMA 균형화(Automatic NUMA Balancing):

  1. 프로세스의 메모리 페이지에 접근 불가 비트 설정
  2. 접근 시 페이지 폴트 발생 → 현재 CPU와 페이지 소속 노드 확인
  3. CPU와 페이지가 다른 노드에 있으면 마이그레이션 검토
  4. 일정 빈도 이상 원격 접근 시 페이지를 로컬 노드로 마이그레이션

AutoNUMA는 모든 워크로드에 항상 이득을 주는 것은 아니다. 스레드가 짧게 이동하거나 메모리 공유 비중이 높은 애플리케이션에서는 힌트 페이지 폴트와 마이그레이션 오버헤드가 오히려 성능을 흔들 수 있어, 데이터베이스나 JVM 서버는 numactl --cpunodebind, --membind, cpuset과 함께 정책을 명시적으로 고정하는 경우가 많다.

5단계: 페이지 마이그레이션

NUMA 정책에 따라 페이지를 한 노드에서 다른 노드로 이동:

  1. 소스 노드에서 페이지 내용 복사
  2. 목적 노드에 새 프레임 할당
  3. 페이지 테이블 엔트리 갱신
  4. 소스 프레임 해제
  5. 캐시 일관성 보장 (TLB shootdown)

장단점

장점 단점
로컬 메모리 접근으로 낮은 지연 시간 원격 접근 시 지연 시간 증가 (1.5x~3x)
노드별 독립된 메모리 대역폭으로 확장성 확보 프로그래머가 NUMA 인식 필요
메모리 대역폭 병목 완화 원격 메모리 접근 시 대역폭 감소
멀티소켓 서버에서의 높은 성능 메모리 할당/마이그레이션 오버헤드
서버용 애플리케이션에 최적화 데스크톱/임베디드에는 과도한 복잡도
CXL 등 새로운 인터커넥트와의 호환성 하드웨어/소프트웨어 모두 NUMA 지원 필요

관련 기술

  • Virtual Memory: 가상 메모리 관리와 NUMA 페이지 할당
  • Memory Controller: 통합 메모리 컨트롤러와 NUMA 구현
  • CPU Cache Architecture: 캐시 계층과 NUMA 캐시 일관성
  • Linux Memory Management Basics: Linux 메모리 관리와 NUMA 정책
  • Linux Memory Tiering Deep: 메모리 계층화와 NUMA 활용
  • Intel QPI/UPI Architecture: Intel 프로세서의 NUMA 인터커넥트 사양
  • AMD HyperTransport/Infinity Fabric: AMD 프로세서의 NUMA 인터커넥트 사양
  • ACPI SLIT/SRAT: NUMA 토폴로지 정보 표준
  • Linux numactl/numastat: NUMA 정책 관리 및 모니터링 도구
  • hwloc (lstopo): NUMA 하드웨어 토폴로지 시각화 도구
  • CXL (Compute Express Link): 확장 메모리 풀링을 위한 차세대 프로토콜
  • Linux kernel NUMA Memory Policy 문서: set_mempolicy(), mbind(), MPOL_WEIGHTED_INTERLEAVE 동작 정의
  • ACPI 6.x SRAT/SLIT/HMAT: 펌웨어가 NUMA 거리와 메모리 속성을 전달하는 표준

핵심 정리

NUMA는 현대 멀티소켓 서버의 표준 메모리 아키텍처로, 각 프로세서 노드에 로컬 메모리를 배정하여 메모리 대역폭을 확장하고 접근 지연을 최소화한다. 캐시 일관성(ccNUMA)은 하드웨어 레벨에서 여러 노드 간 데이터 일관성을 보장하며, Intel QPI/UPI, AMD HyperTransport/Infinity Fabric 등의 고속 인터커넥트로 구현된다. Linux 커널은 MPOL_BIND, MPOL_INTERLEAVE, MPOL_WEIGHTED_INTERLEAVE 등의 NUMA 메모리 정책과 AutoNUMA 자동 균형화를 제공하여, 애플리케이션이 NUMA-aware하게 동작할 수 있도록 지원한다. NUMA 토폴로지 인식, 적절한 메모리 할당 정책, 페이지 마이그레이션의 조합은 시스템 성능에 직접적인 영향을 미치며, CXL과 같은 새로운 인터커넥트 기술과 결합하여 향후 분산 메모리 아키텍처의 기반이 된다.