로그인 입점하기
← 가이드 목록
시작하기

NUMA란? CPU와 메모리의 거리에 따라 접근 속도가 달라지는 구조 쉽게 이해하기

NUMA는 CPU마다 가까운 Local Memory와 먼 Remote Memory가 있는 구조입니다. Node·Affinity·First Touch·Bandwidth·Scale Out까지 초보 기준으로 정리합니다.

NUMA란? CPU와 메모리의 거리에 따라 접근 속도가 달라지는 구조 쉽게 이해하기

보통은 CPU가 어느 RAM이든 똑같이 빠르게 읽는다고 생각하기 쉽습니다. 대형 서버·다중 CPU에서는 그렇지 않을 수 있습니다. CPU 1은 가까운 Memory 1을 빠르게 읽고, CPU 2 쪽 Memory 2는 Interconnect를 거쳐야 할 수 있습니다. 이처럼 어느 메모리에 접근하느냐에 따라 Latency·Bandwidth가 달라질 수 있는 구조NUMA(Non-Uniform Memory Access, 균일하지 않은 메모리 접근)라고 합니다. 쉽게 말해 CPU마다 가까운 Memory와 먼 Memory가 있습니다.

공장 A → 창고 A (가까움)
공장 A → 도로 → 창고 B (더 멀다)

Local · Remote · Node

현재 CPU(또는 Node)와 가까운 메모리가 Local Memory, 다른 Node에 연결된 메모리가 Remote Memory입니다. Remote도 쓸 수 있고 프로그램에는 하나의 큰 주소 공간처럼 보일 수 있지만 성능 특성은 동일하지 않을 수 있습니다. CPU Core와 가까운 Memory를 묶은 단위가 NUMA Node입니다. RAM 용량만으로는 Node 수·배치를 알 수 없습니다.

Local Access와 Interconnect를 거친 Remote Access 비교
Local은 짧은 경로, Remote는 CPU 간 연결을 더 거칠 수 있다

왜 NUMA인가 · Bandwidth

모든 Core가 하나의 Memory Controller만 공유하면 Memory Bandwidth 경쟁이 심해질 수 있습니다. Node별로 Memory를 나누면 각 그룹이 가까운 Bandwidth를 쓰고, 여러 Node를 동시에 쓰면 전체 Throughput을 높일 수 있습니다. 한 Node에 CPU·Memory 부하가 몰리면 서버 전체 여유가 있어도 그 Node만 병목이 됩니다. 부하 분산이 중요합니다.

Affinity · Migration · First Touch

CPU Affinity는 Thread를 특정 Core에 묶거나 선호도를 주는 것입니다. Thread 실행 위치와 Memory 위치가 함께 NUMA 성능을 만듭니다. Scheduler가 Core를 옮기는 Thread Migration은 Cache Locality뿐 아니라 Remote Access도 늘릴 수 있습니다. Memory를 특정 Node에 가깝게 두는 정책이 Memory Affinity입니다. First Touch는 Page를 처음 실제로 쓴 CPU의 Node 근처에 배치하는 방식입니다. 한 Thread가 100GB를 전부 초기화하면 데이터가 한 Node에 치우쳐, 다른 Node CPU가 Remote를 많이 읽을 수 있습니다. 초기화도 Node별로 나누는 것이 NUMA-aware의 예입니다.

Thread 위치 + Memory 위치 = NUMA 성능
강한 Pinning → Locality↑ · Load Balancing↓
자유 Scheduling → 균형↑ · Remote↑ 가능

Interleave · Pinning · Partition

Interleave는 Page를 Node에 번갈아 배치해 Controller를 함께 쓰려는 정책입니다. Locality는 떨어질 수 있습니다. Process·VM을 Node에 가깝게 두는 것을 NUMA Pinning이라고 부를 수 있습니다. Worker마다 Data를 나눠 Shared-Nothing에 가깝게 두면 Locality 유지가 쉽고, 큰 Shared Data를 모든 Thread가 쓰면 Remote·Coherence Traffic이 늘 수 있습니다. 데이터 파티셔닝은 DB Sharding과 아이디어는 비슷하지만 한 서버 안 Locality 축입니다. Bulkhead로 Worker를 분리하는 것과도 맞닿습니다.

Cache · Coherence · 계층

Cache Miss 뒤 Main Memory가 Local이면 비교적 가깝고 Remote면 더 멉니다. Socket이 다른 Core가 같은 줄을 자주 수정하면 Coherence·False Sharing 비용이 Interconnect로 커질 수 있습니다. 개념적 계층은 Register → L1/L2/L3 → Local Memory → Remote Memory → Storage 순으로 느려지는 경향입니다. Prefetch도 Remote Traffic을 늘리면 Bandwidth 경쟁(Contention)과 맞물립니다.

언제 중요한가 · Scale

소형 VM·단일 Socket·적은 Core에서는 우선순위가 낮습니다. 수십~수백 Core, Multi-Socket, 대용량 Memory, DB·In-Memory·AI·HPC에서 중요해질 수 있습니다. JVM 대형 Heap·GC, GPU·NIC가 특정 Socket에 가까운 경우도 Affinity를 볼 수 있습니다. Core만 늘려도 성능이 안 오르면 Lock·Bandwidth·Remote Access·Coherence를 측정합니다. 한 대 Scale Up은 NUMA 복잡성이 커질 수 있고, 여러 서버 Scale Out·로드밸런싱은 네트워크 복잡성이 늘지만 Local Memory만 쓰는 형태에 가깝게 갈 수 있습니다. vNUMA·컨테이너·Kubernetes Topology는 고성능 워크로드에서만 직접 다루는 경우가 많습니다. 일반 홈페이지는 DB·캐시·이미지·API가 먼저입니다. SEO 전용 개념은 아닙니다.

목표: 필요 이상의 Remote Access를 줄이기
자동 NUMA Balancing·Memory Migration에도 비용 있음
Thread가 Node를 자주 오가면 Cache·Memory Locality 둘 다↓

자주 묻는 질문

NUMA란?

CPU·Memory 위치에 따라 접근 Latency·Bandwidth가 동일하지 않을 수 있는 구조입니다.

Local / Remote Memory?

Local은 가까운 Node Memory, Remote는 다른 Node Memory(추가 경로)입니다. Remote도 사용 가능합니다.

NUMA Node란?

CPU Core와 가까운 Memory를 하나의 성능 영역으로 묶은 단위입니다.

First Touch란?

Page를 처음 실제로 사용한 CPU의 Node 근처에 Memory를 배치하는 정책 개념입니다.

작은 웹서버에서도?

대부분 우선순위가 낮습니다. Multi-Socket·고성능 Memory 워크로드에서 더 중요합니다.

SEO와 관련있나?

SEO 전용 개념은 아닙니다. 서버 Hardware Topology에 관한 개념입니다.

정리

NUMA = 모든 CPU가 모든 Memory에 같은 비용으로 접근하지 않는 구조입니다. Local은 가깝고 Remote는 Interconnect 등 추가 경로를 거칠 수 있습니다. Core·RAM 용량만 보지 말고 어떤 CPU가 어떤 Memory를 쓰는지도 봅니다. Affinity·Placement·Locality·Node별 분산을 함께 고려합니다. CPU가 다른 Node Memory에 접근하거나 Cache 상태를 맞추려면 CPU 사이를 잇는 통로가 필요합니다. 이 통로가 부족하면 Remote Access·Coherence Traffic이 몰려 새 병목이 됩니다. 이처럼 CPU·Memory Controller·장치 등을 연결해 데이터를 주고받게 하는 고속 연결 구조Interconnect(인터커넥트)라고 합니다.