SMP와 NUMA: 멀티코어 시스템의 메모리 구조와 최적화

SMP와 NUMA의 메모리 접근 방식, 확장성 차이, NUMA 배치 정책과 스레드 어피니티 최적화 방법을 정리한다.

2026-08-14 · 최초 발행 2026-01-16

클럭 경쟁이 멀티코어 전환으로 이어진 이유

2000년대 초반까지 CPU 성능 향상은 주로 클럭 속도를 높이는 방식에 의존했다. 전력 소비와 발열이 물리적 한계에 부딪히면서, 프로세서 제조사는 하나의 칩에 여러 코어를 집적해 병렬성을 활용하는 방향으로 전환했다.

멀티코어는 여러 스레드를 동시에 실행해 처리량을 높이고, 낮은 전력으로 높은 성능을 달성할 수 있게 한다. 코어 수 증가에 따라 선형적인 성능 확장을 기대할 수 있으며, 워크로드를 코어 사이에 나누어 시스템 안정성에도 기여한다.

프로세서 발전 과정단일 코어(클럭 속도 경쟁)전력/발열 한계(Power Wall)멀티코어 도입(병렬성 활용)이기종 컴퓨팅(CPU+GPU+NPU)

공유 메모리를 중심으로 동작하는 SMP

SMP(Symmetric Multiprocessing)는 모든 프로세서가 같은 메모리 공간에 균등하게 접근하는 멀티프로세서 구조다. 프로세서의 역할은 대칭적이며, 운영체제는 각 프로세서에 작업을 분배한다.

SMP 시스템 구조CPU 코어 1L1 캐시CPU 코어 2L1 캐시CPU 코어 3L1 캐시CPU 코어 4L1 캐시공유 L2 캐시시스템 버스/인터커넥트공유 주기억장치I/O 서브시스템
관점 SMP에서의 의미
메모리 접근 모든 프로세서가 동일한 지연 시간으로 메모리에 접근
운영체제 하나의 OS가 모든 프로세서를 관리
처리 역할 모든 프로세서가 동등한 역할을 수행
프로세서 간 통신 공유 메모리 모델을 사용

공유 메모리 모델은 데이터 교환을 쉽게 만들고, 기존 단일 프로세서 코드의 이식과 표준 스레드 라이브러리 활용에도 유리하다. 운영체제가 유휴 프로세서에 작업을 할당하고 동적으로 스케줄링할 수 있어 부하 균형도 비교적 단순하다. 단일 메모리 컨트롤러를 쓰므로 비용을 줄일 수 있고, 소규모 시스템에서는 관리 복잡도도 낮다.

다만 버스 기반 SMP는 프로세서 수가 늘어날수록 버스 대역폭이 병목이 된다. 일반적으로 8-16개 프로세서까지가 효율적인 확장 한계이다. 여러 프로세서가 동시에 메모리를 요구하면 버스 경합으로 성능이 떨어질 수 있으며, MESI 등의 캐시 일관성 프로토콜도 추가 트래픽과 지연 시간을 만든다.

노드별 로컬 메모리를 두는 NUMA

NUMA(Non-Uniform Memory Access)는 각 프로세서가 로컬 메모리를 가지는 구조다. 자신의 노드에 있는 메모리보다 다른 프로세서의 메모리에 접근할 때 더 긴 지연 시간이 든다. 이 구조는 대규모 시스템에서 SMP의 확장성 문제를 줄이기 위해 설계됐다.

NUMA 시스템 구조NUMA 노드 3NUMA 노드 2NUMA 노드 1CPU 5CPU 1메모리 컨트롤러 1CPU 2로컬 메모리 1CPU 3메모리 컨트롤러 2CPU 4로컬 메모리 2메모리 컨트롤러 3CPU 6로컬 메모리 3인터커넥트(QPI/UPI/Infinity Fabric)

NUMA에서는 노드마다 독립적인 메모리 컨트롤러를 두고, 노드 사이를 저지연·고대역폭 인터커넥트로 연결한다. 이 방식은 수십~수백 개 프로세서까지 확장할 수 있다.

NUMA Factor는 원격 메모리 접근 지연 시간과 로컬 메모리 접근 지연 시간의 비율이다. 일반적으로 1.5~3배 정도이다. NUMA Distance는 노드 사이의 상대적 거리를 수치로 표현한 값으로, 로컬 노드는 10, 원격 노드는 20 이상의 값을 가진다.

예시 NUMA Distance 테이블:
       Node 0  Node 1  Node 2  Node 3
Node 0   10      20      30      30
Node 1   20      10      30      30
Node 2   30      30      10      20
Node 3   30      30      20      10

분산 메모리 컨트롤러는 전체 메모리 대역폭을 늘리고, 로컬 메모리 접근에서는 최적 성능을 제공한다. 노드를 단위로 확장할 수 있고 메모리 용량도 유연하게 구성할 수 있으며, 장애 격리에도 유리하다.

반대로 성능을 얻으려면 데이터와 이를 처리하는 스레드가 같은 노드에 위치해야 한다. NUMA 인지 프로그래밍에서는 메모리 할당과 스레드 배치를 신중히 다뤄야 하며, NUMA 토폴로지를 인식하고 최적화하는 운영체제 스케줄러도 필요하다.

메모리 접근 방식이 갈라놓는 선택 기준

비교 항목 SMP NUMA
메모리 접근 지연 균일 비균일
확장성 8-16 프로세서 수백 프로세서
프로그래밍 난이도 낮음 높음
메모리 대역폭 공유(제한적) 분산(확장 가능)
적용 분야 워크스테이션, 소형 서버 대형 서버, HPC
비용 상대적 저렴 상대적 고가

SMP는 소규모 시스템에서 단순한 프로그래밍 모델과 운영 편의성을 제공한다. 대형 서버와 HPC처럼 규모가 커질수록 NUMA의 분산 대역폭과 확장성이 더 적합해진다. 그 대가로 메모리의 물리적 위치를 성능 설계에 포함해야 한다.

NUMA 환경에서 데이터와 실행 위치 맞추기

메모리 할당 정책은 데이터가 어느 노드에 놓일지를 결정한다.

  • First Touch Policy는 메모리에 처음 접근하는 시점에 해당 스레드가 실행 중인 노드에 메모리를 할당한다.
  • Interleave Policy는 메모리를 모든 노드에 라운드 로빈 방식으로 분산 할당한다.
  • Local Allocation은 현재 노드의 로컬 메모리에서 할당한다.
  • Preferred Node는 지정한 노드에서 우선 할당하고, 실패하면 다른 노드를 사용한다.

스레드 어피니티는 스레드를 특정 CPU 또는 NUMA 노드에 고정하는 방법이다. 캐시 활용도를 높이고 원격 메모리 접근을 줄이는 데 사용한다.

Linux에서의 NUMA 제어:
$ numactl --cpunodebind=0 --membind=0 ./application
$ numactl --interleave=all ./application

대규모 자료구조는 노드별로 나누어 로컬 접근을 극대화할 수 있다.

NUMA 인지 자료구조 배치노드 2노드 1노드 0로컬 접근로컬 접근로컬 접근원격 접근(회피)원격 접근(회피)Data Partition 2Thread Group 0Data Partition 0Thread Group 1Data Partition 1Thread Group 2

서버 워크로드에서의 NUMA 활용

대형 데이터베이스는 NUMA 토폴로지를 인식해 버퍼 풀과 쿼리 처리를 노드별로 분리한다. Oracle, SQL Server 등 주요 DBMS는 NUMA 최적화를 지원한다.

가상화 환경에서는 하이퍼바이저가 가상 머신을 NUMA 노드에 매핑해 성능을 최적화한다. vNUMA(Virtual NUMA)를 사용하면 게스트 OS도 NUMA 토폴로지를 인식할 수 있다.

과학 계산과 시뮬레이션 워크로드에서는 NUMA 인지 MPI 구현으로 노드 간 통신을 최소화한다.

노드 간 연결을 담당하는 인터커넥트

Intel의 Quick Path Interconnect(QPI)와 Ultra Path Interconnect(UPI)는 NUMA 노드를 고속으로 연결한다. 포인트-투-포인트 방식으로 높은 대역폭과 낮은 지연 시간을 제공한다.

AMD Infinity Fabric은 EPYC 프로세서에서 쓰이는 인터커넥트 기술로, 칩렛(Chiplet) 간 및 소켓 간 연결을 담당한다.

CCIX(Cache Coherent Interconnect for Accelerators)와 CXL(Compute Express Link)은 CPU와 가속기 사이에서 캐시 일관성을 유지하는 차세대 인터커넥트 표준이다.

시스템 규모에 맞춰 SMP와 NUMA를 선택한다

SMP와 NUMA는 서로 다른 설계 목표를 가진 멀티코어 아키텍처다. SMP는 소규모 시스템에서 프로그래밍 용이성을 제공하고, NUMA는 대규모 시스템에서 높은 확장성을 제공한다. 현대 서버와 고성능 컴퓨팅 환경에서는 NUMA 아키텍처가 표준이 되었으며, 성능을 내려면 NUMA 인지 프로그래밍과 적절한 메모리 배치 전략이 필요하다.

멀티코어SMPNUMA운영체제메모리 아키텍처