고성능 서버나 데이터베이스 서버에서는 여러 개의 CPU를 사용하는 경우가 많다.
하지만 CPU 수가 증가할수록 모든 CPU가 하나의 메모리를 공유하는 구조에서는 병목 현상이 발생한다.
이를 해결하기 위해 등장한 메모리 구조가 NUMA(Non-Uniform Memory Access)이다.
이번 글에서는 NUMA의 개념, 등장 배경, 구성 요소, 동작 원리에 대해 알아본다.
NUMA는 CPU마다 메모리 접근 속도가 서로 다른 메모리 구조이다.
CPU0 → Local Memory 이면 : 빠름
CPU0 → Remote Memory 이면 : 느림
-> 메모리 접근 시간이 균일하지 않기 떄문에 Non-Uniform Memory Access라고 부른다.

예를 들어 CPU가 32개인 서버에서 모든 CPU가 하나의 메모리에 접근하면 성능이 급격히 저하될 수 있다.
이러한 문제를 해결하기 위해 CPU 소켓과 해당 소켓에 연결된 메모리를 하나의 Node로 구성하는 NUMA 구조가 등장하였다.가 등장하였다.
연산을 수행하는 "프로세서"이다.
NUMA에서 CPU 내부의 코어들은 자신이 속한 Node의 Local Memory를 우선적으로 사용한다.
CPU와 같은 NUMA Node에 연결된(묶인) 메모리이다.
다른 NUMA Node에 연결된(묶인) 메모리들을 말한다.
CPU는 인터커넥트를 통해 접근하며 Local memory보다 접근 속도가 느리다.
CPU와 메모리를 하나의 그룹으로 묶은 단위이다.
Node0
├ CPU0
└ RAM0
Node1
├ CPU1
└ RAM1
NUMA는 이러한 Node단위로 동작한다.
일반적으로 하나의 NUMA Node는 하나의 CPU 소켓과 해당 소켓에 연결된 메모리로 구성된다.
따라서 하나의 Node에 여러 개의 CPU 코어와 다수의 메모리 모듈이 포함될 수 있다.

NUMA 환경에서 프로세스가 실행되면 운영체제는 가능한 한 같은 Node의 CPU와 메모리를 사용하도록 배치한다.
이를 "NUMA Awareness"라고 한다.
NUMA Awareness를 지원하는 운영체제나 애플리케이션은 CPU와 메모리를 같은 Node에 배치하여 Remote Memory 접근을 최소화한다.
구조가 복잡하다.
Remote Memory 접근 시 성능 저하가 발생한다.
NUMA를 고려하지 않은 프로그램은 성능 이점을 얻기 어렵다.
운영체제와 애플리케이션이 NUMA를 인식(NUMA Awareness)해야 최적의 성능을 낼 수 있다.
메모리 사용량이 불균형해질 수 있다.
NUMA는 CPU와 메모리를 Node 단위로 구성하여 각 CPU가 가까운 메모리를 우선 사용하도록 함으로써 멀티 프로세서 환경의 병목 현상을 줄이는 메모리 구조이다.