23a88368f5dc3f8650bbd58b3684776b7dc9


Numa란 무엇일까?


Numa는 Non-Uniform Memory Access의 약자이며, 


각 프로세서가 메모리에 접근하는 속도가 동일하지 않은 아키텍처를 의미한다.


각 프로세서는 자신에게 물리적으로 가까운 로컬 메모리에 빠르게 접근할 수 있지만, 다른 프로세서의 원격 메모리에 접근할 때는 상대적으로 느려진다.


과거의 멀티프로세서 시스템은 Symmetric Multi-Processing(SMP) 또는 Uniform Memory Architecture(UMA) 를 기반으로 설계되었는데,

이 방식에서는 모든 프로세서가 단일 공유 메모리에 접근하므로, 버스 대역폭 및 캐시 일관성(Coherency) 문제로 인해 성능 병목이 발생했다.


NUMA는 이러한 문제를 해결하기 위해 프로세서별 로컬 메모리를 제공하고, 필요할 때만 원격 메모리에 접근하도록 설계된 확장성 높은 아키텍처이다.

(참고로 이러한 캐시 일관성 문제를 해결하기위해 나온 NUMA를 Cache-Coherent NUMA, ccNUMA 라고도 한다)


대규모 시스템에서는 NUMA가 확장성과 성능에서 더 유리하지만, 작은 규모의 시스템에서는 UMA가 더 효율적일 수도 있다.


자, 그럼 이 NUMA를 제대로 알기 위해서는 다음 글을 참조하는 것이 좋다


간단하게 한줄 요약!


프로세서Processor) 명령을 실행하고 연산을 수행하는 장치

로컬 메모리Local Memory)프로세서에 직접 연결된 메모리 ->빠르게 접근 가능!

원격 메모리Remote Memory) 다른 NUMA 노드에 속한 메모리로, 인터 커넥트를 통해 접근해야한다!->상대적으로 느림!

인터커넥트(InterConnect) NUMA 노드 간 데이터를 전송하는 링크로, 원격 메모리 접근시 사용되어 지연시간을 생성함.



23a88468f5dc3f8650bbd58b36837568b1c5



Christoph Lameter의 An Overview of Non-Uniform Memory Access (NUMA)이다.


참고로 이 문서를 읽기전 NUMA 노드의 개념에 대해서 알아야하는데,


NUMA에서는 노드Node는 하나의 CPU 소켓과 해당 CPU에 연결된 메모리 블록을 의미한다.


이 논문은 크게 운영체제에서 NUMA 메모리 관리방식과 NUMA 메모리 정책(Memory Policies)의 2가지로 나뉘는데 그전에 

NMUA 노드라는 개념을 알아야한다.



23a88668f5dc3f8650bbd58b36857c6cdeac

(NUMA 아키텍쳐-Intel 홈페이지 출처)



하나의 NUMA 노드=CPU+ 로컬 메모리+ 메모리 컨트롤러


-각 NUMA 노드는 자신의 메모리를 빠르게 접근할 수 있지만, 다른 NUMA 노드의 메모리는 상대적으로 느리게 접근한다.


즉 NUMA 아키텍쳐는 단일 메모리 풀을 여러개의 NODE라는 것으로 분할해서 관리하는 방식인 것이다!



23a88168f5dc3f8650bbd58b36837268fdcd

(2개의 NUMA 노드와 8개의 프로세서가 있는 시스템 예시)


운영 체제는 어떻게 NUMA를 처리할까?


이 글에서는 운영체제가 NUMA를 처리하는 방식은 크게 5가지 범주로 나눈다.



23a88568f5dc3f8650bbd58b36827265d4



1. 운영체제가 NUMA 노드의 차이 무시하기

-> 운영체제가 NUMA 노드의 차이를 고려하지 않고, 모든 메모리를 동일하게 취급하는 방식


이것은 일반적으로 NUMA 최적화가 필요치않은 레거시 시스템과 소형 어플리케이션에 썼다.


2. 하드웨어 메모리 스트라이핑(Memory Striping in Hardware)

->메모리 주소 매핑을 변경하여 각 노드에서 메모리 접근을 분산하는 방식


OS는 NUMA를 지원할 필요가 없다는 장점이 있다. 하지만 캐시라인이 여러 NUMA 노드에 걸쳐서 배치되므로 항상 원격 메모리를 사용해야한다는 문제가 있다.

즉 인터커넥트 사용을 강제적으로 발생하므로 오버헤드가 발생한다.


3. Heuristic 메모리 배치

->운영체제가 NUMA를 인식하고 자동으로 성능을 최적화하는 방식


일반적으로 최근의 OS에서 지원하는 기능이다. 

프로세스가 실행되는 노드의 로컬 메모리를 우선 배치하는 것이다!


다만 프로그래머의 실수로 노드 내 메모리를 잘못 산정할 경우, 어쩔 수 없이 원격 메모리를 사용해야한다.


4. 운영체제에서 특정 애플리케이션의 NUMA 설정(Special Numa Configuration for Applications)

->운영체제에서 특정 애플리케이션의 NUMA 메모리배치를 수동으로 지정할 수 있는 옵션 제공


수동으로 NUMA노드를 미세 조정해서 성능을 튜닝하는것


5. 애플리케이션이 직접 NUMA를 제어(Application-Controlled Numa Allocations)

->애플리케이션이 운영 체제의 기본 NUMA 정책을 따르지 않고, 직접 메모리를 지정하는 방식


애플리케이션이 직접 NUMA를 관리해야한다는 것은 프로그래머의 역량에 따라서 성능의 발전도 저하가 올 수도 있다는 것이다.



23a88268f5dc3f8650bbd58b368274697eb5

이 논문에서는 기본적으로 NUMA 메모리 정책을 리눅스의 명령어와 연관해서 설명하지만


본 필자는 기본 개념만 추출해서 이야기하도록한다.


NUMA 메모리 정책과 관리 방식


NODE LOCAL 노드 로컬

-> 프로세스가 현재 CPU 노드의 메모리에서 우선적으로 할당하는 것, 가장 기본적인 방식이다.


INTERLEAVE 인터리브

->메모리를 라운드 로빈 방식으로 여러 노드에 걸쳐서 분배


Reclaim 메모리 회수

-> 메모리 부족시 사용되지 않는 페이지를 해제함



페이지(Page)란?

운영체제가 메모리를 관리하는 최소 단위이다.

즉, 프로세스가 메모리를 할당 받을때, 운영체제는 "페이지 단위"로 관리한다.

일반적으로 약 4kb(4096 바이트)크기의 페이지를 사용함)



23a88868f5dc3f8650bbd58b3682706d7bd997

본 논문은 주로 리눅스에서 NUMA 관리법을 알려주지만,

윈도우도 마이크로소프트 런닝센터와 다양한 책에서 NUMA 개념과 API를 마련해두었다.


일반적으로 Windows와 Linux NUMA 차이는 다음과 같다



운영체제LinuxWindows
NUMA정책 적용numactl 커널설정Windows API
(GetNumaNodeProcessorMask)
기본 메모리정책NODE LOCAL(기본) INTERLEAVE(커널)NODE LOCAL
NUMA-aware 스케쥴러 NUMA-aware CPU&메모리 배치 지원NUMA-aware 스케쥴링 지원


이제 우리 프붕이들도 NUMA를 어느정도 이해할 수 있을것이다.