<NUMA(Non-Uniform Memory Architecture)>
NUMA는 공유 메모리 아키텍쳐의 한 형태이다.
대다수의 경우 소규모 SMP(Symmetric Multiprocessing : 대칭형 멀티 프로세싱) 컴퓨터에 구현되어 있는 공유 메모리 아키텍처에서는 컴퓨터에 탑재되어 있는 모든 CPU가 메모리와 메모리 액세스에 사용하는 *버스를 공유하고 있다.
*버스 : CPU와 메모리 사이에서 데이터를 교환하는 경로
SMP 아키텍처의 메모리와 버스
하나의 CPU가 메모리 액세스를 위해 버스를 점유하면 다른 CPU는 버스가 해제될 때까지 메모리 액세스를 할 수 없다. 때문에 내장되어 있는 CPU의 수가 늘수록 버스의 해제 대기 시간이 길어질 가능성이 있다.
또한 CPU 수의 증가에 의해 버스도 물리적으로 길어지기 때문에 그에 수반하여 메모리에 도달할 때까지 시간이 걸린다.
즉, 단일 버스를 공유하여 사용하기 때문에 수많은 복수개의 CPU 중 하나의 CPU가 메모리에 접근하게 되면 나머지 CPU들은 block되어 메모리의 처리가 늦어진다.
SMP 시스템에서의 가장 큰 문제점은 바로 병목현상이다.
카페 알바로 예를 들어보자. 엄청 큰 카페가 새로 오픈하였고 일할 직업을 100명 뽑았다.
하지만 커피머신은 하나를 사용해서 커피를 뽑는다.
커피를 뽑을 수 있는 사람이 100명이여도 실제 한번에 하나의 커피만을 뽑을 수 있기 때문에 주문이 엄청 밀릴것이다.
그렇다면 커피 머신을 개조해서 한번에 4개씩 커피를 뽑을 수 있게 하면 전보다 훨신 더 많은 양의 일을 처리 할 수 있을 것이다.
바로 이런 단점을 해결한 것이 NUMA 시스템이다.
NUMA 시스템에서는 CPU를 몇개의 그룹으로 나누고 각 그룹에게 별도의 지역 메모리를 할당해준다.
각 그룹이 저장하는 메모리는 로컬메모리(Local Memory)라고 부른다.
로컬 메모리를 사용함으로써 우선 버스당 CPU 수가 제어되고 버스 해제 대기시간이 줄어든다 또한 물리적 버스의 길이도 짧아진다.
SMP 와 NUMA 의 비교
특정한 CPU 그룹 기준에서 다른 그룹이 저장한 메모리를 리모트 메모리(Remote Memory)라고 부른다.
또한 다른 CPU 그룹의 메모리에도 액세스가 가능하다.
그러나 로컬 메모리에 액세스하는 경우와 비교하면 액세스 경로가 복잡해서 퍼포먼스는 기존보다 4배정도 낮아진다.
때문에 NUMA 아키텍쳐를 효과적으로 활용하기 위해서는 애플리케이션도 각 CPU 그룹과 로컬 메모리의 관계를 배려할 필요가 있다.
또한 각 cpu 그룹을 NUMA NODE 라는 관리 대상으로 인식한다. 메모리를 필요로 하는 처리가 실행되면 그 스레드가 처리하는 스케줄러와 링크된 CPU NUMA 노드의 로컬 메모리에 필요한 영역이 확보된다.
또한 각 NUMA NODE 내에서 가능한 한 메모리 관리를 완결시키기 위해 아래의 컴포넌트가 모든 NUMA NODE 에 할당되어 있다.
지연 라이터 스레드 (Lazy Writer Thread)
SQL 서버의 메모리 관리를 수행하는 컴포넌트의 하나이다. 보통이라면 SQL SERVER 내에 하나만 존재하지만 NUMA 대응 기능이 유효화 되면 각 NUMA 노드에 I/O 지연 라이터 스레드가 준비된다.
I/O 완료 포트 스레드
I/O 완료 포트 스레드는 SQLOS 스케줄러가 네트워크 I/O와 디스크 I/O의 상황을 적절하게 판단할 수 있도록 다양한 동작을 수행하고 있다. 예로는 I/O 리퀘스트 리스트에 추가되어 있는 작업자에 I/O가 완료됐음을 알리는 것을 들 수 있다.
보통이라면 서버에 하나만 존재하지만 NUMA 대응 기능이 유효화 되면 NUMA 노드에 I/O완료 포트 스레드가 준비된다.
이들 내부 컴포넌트가 각 NUMA 노드에 할당되는 동시에 각각의 NUMA 노드에 할당된 작업자가 가능한 로컬 메모리를 사용하도록 디자인되어 있다.
그 결과 NUMA 아키텍쳐를 구현한 하드웨어상에서 SQL 서버가 효율적으로 동작하는 것이 가능하다.
소프트 NUMA
SQL 서버에는 NUMA 아키텍쳐를 구현하지 않은 하드웨어상에서도 그 이점의 일부를 사용할 수 있는 기능이 준비되어 있다.
그것은 하드웨어가 아니라 소프트웨어의 기능으로 구현된다는 의미를 담아 소프트 NUMA 라고 불린다.
하지만 기존의 NUMA 와는 다르게 하나의 메모리와 하나의 버스를 모든 NUMA 노드에서 공유하기 때문에 로컬 메모리의 장점을 누릴 수 없다.
다시 말해 버스 해제 대기 시간 발생과 물리적인 버스 길이 문제는 남아 있다.
그러나 각 NUMA 노드에는 지연 라이터 스레드와 I/O 완료 포트 스레드가 준비되어 있다.
때문에 각 컴포넌트의 부하가 매우 높은 환경이라면 소프트 NUMA 를 도입함으로써 퍼포먼스를 개선할 수 있다.
'DB ARCHITECTURE' 카테고리의 다른 글
sql server 메모리 관리(5) - 메모리의 용도 (0) | 2022.03.28 |
---|---|
sql server 메모리 관리(4) - 프로세스 내부 메모리 관리 방법 (0) | 2022.03.27 |
sql server 메모리 관리(2) - 가상 어드레스 공간의 관리 (2) | 2022.03.25 |
sql server 메모리 관리(1) - 가상 어드레스 공간 (0) | 2022.03.22 |
SQL SERVER 가 수행하는 I/O의 특징적 동작 (0) | 2022.01.22 |