1. NUMA?

NUMA 메모리를 관리하는 방법 하나이다.

가장 기본적으로 메모리를 관리하는 방법은 하나의 512GB 메모리에 대해서 여러 CPU 선점유 방식을 통해 접근하는 방법이 있다.

예를 들어 4개의 CPU core 존재한다고 가정했을 하나의 CPU 메모리에 접근하여 사용 중에 있다면 남은 3개의 core 메모리에 접근할 없고 대기해야하는 병목현상 문제가 발생하게 된다.

 

, 이를 보다 효율적으로 해결하기 위해 생겨난 방법이 NUMA 메모리 관리 기법이다.

NUMA 노드의 경우 위와 같이 메모리를 주소별 구간으로 나눈 각각의 CPU 할당하는 방식이다. 예를들어 512GB 메모리가 존재한다면

0~128까지는 CPU1

128~256 -> CPU2

256~384 -> CPU3

384~512 -> CPU4

CPU별로 접근하는 메모리를 나누어서 진행한다. 경우 하나의 메모리라도 구간이 나누어져있기 때문에(H/W, S/W적으로 나눌 있음) 메모리 구간에 대하여 동시에 접근이 가능하다. 병목현상 문제를 해결할 있다.

 

2. 성능

NUMA 위와 같이 core별로 메모리 area 정하고 가능한 해당 메모리만을 사용하도록 하여 병목현상을 해결하는 장점을 가지고 있다.

하지만 OS 동작 중에 현재 core에서 가지고 있지 않은 메모리 주소에 접근이 필요한 경우가 존재할 것이다.

예를 들어

0x00~0x25 core 1

0x25~0x50 core 2

라고 했을 core1에서 0x40 접근이 필요하게 된다면 NUMA 구조상 문제가 발생할 있다.

때는 core1 0x40 접근하는 방식을 remote라고 하며 remote 하는 경우 예기치 못한 시간소요가 발생하게 된다.

때문에 NUMA 지원하는 모델을 구현하기 위해서는 예기치 못한 remote 얼마나 일어나는지 빈도수를 계산해서 memory area 정해야 한다.

 

 

그림으로 다시 정리하면 NUMA 경우 실제적으로 cpu(core) n개를 하나의 NUMA node 묶어서 사용한다. NUMA node내에서 접근을 local access라고하며 각각의 NUMA node에서 각각의 local access 동시에 일어날 있고 이를 바탕으로 병목현상 문제에 강한 면모를 보일 있다.

 

하지만 앞서 말한내용과 같이 NUMA 성능에서 중요한 포인트는 remote access이다. Remote access local memory allocate등의 동작을 진행할 문제가 발생하면 remote access 발생하고 현재 cpu 존재하는 NUMA node 아닌 다른 NUMA node에서 작업을 처리하게 된다. 발생하는 시간적인 소요가 15%정도 나는 것으로 보이며 결과적으로 NUMA model optimization하기 위해서는 어떻게 NUMA node 설계해서 remote access 최소화 하는지가 관건이다.

 

 

  • Ref

https://cheonee.tistory.com/entry/Automatic-NUMA-Baleancing%E3%85%87%E3%85%87?category=537099
https://www.boost.org/doc/libs/1_66_0/libs/fiber/doc/html/fiber/numa.html

+ Recent posts