데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해

 

  • Version : SQL Server 2005, 2008, 2008R2

 

SQL Server는 NUMA(Non-Uniform Memory Access)를 인식하며 특수한 구성 없이 NUMA 하드웨어에서 작동한다. 클럭 속도와 프로세서 수가 증가 할수록 처리하는데 필요한 메모리 대기 시간을 줄이기가 더욱 어려워진다. 이러한 문제를 피하기 위해 하드웨어 업체에서는 L3 캐시를 제공하지만 제한적이다. NUMA 아키텍처는 이 문제에 대한 포괄적인 해결책을 제공하며 SQL Server는 응용프로그램을 변경할 필요 없이 NUMA 기반 컴퓨터를 활용하도록 디자인 되었다.

 

 

 

[NUMA 개념]

일반적인 하드웨어는 작은 프로세서 집합에 사용되는 시스템 버스를 여러 개 구성하며 각 프로세서 그룹에는 자체 메모리가 있으며 자체 I/O 채널이 있는 경우도 있다. 그러나 각 CPU는 일관된 방법으로 다른 그룹과 연결된 메모리에 액세스 한다. 각 그룹을 NUMA 노드라고 한다. NUMA 노드 내의 CPU 수는 하드웨어 공급업체에 따라 다르다. 다른 NUMA노드와 연결된 메모리보다 로컬 메모리를 액세스하는 것이 더 빠르다.

 

 

NUMA 하드웨어서는 일부 메모리 영역이 실제로 나머지 영역과 다른 버스에 있다. NUMA는 로컬 메모리와 외부메모리를 사용하므로 다른 영역에 비해 일부 메모리 영역에 액세스하는 시간이 오래 걸린다. 로컬 메모리와 외부메모리의 구분은 현재 실행중인 스레드에 대한 참조 위치에 따라 구분된다. 로컬 메모리는 현재 스레드가 실행중인 CPU와 같은 노드에 있는 메모리이다. 스레드가 현재 실행중인 노드에 속하지 않은 메모리가 외부 메모리이다.

 

외부메모리는 원격 메모리라고도 한다. 로컬 메모리 액세스 비용에 대한 외부 메모리 액세스 비용의 비율을 NUMA 비율이라고 한다. NUMA 비율이 1이면 이는 SMP(대칭 다중 처리)이며 비율이 높을수록 다른 노드의 메모리에 액세스하는데 더 많은 비용이 소요 된다.

 

NUMA의 이점은 확장성이다. NUMA 아키텍처는 SMP 아키텍처의 확장성 제한을 극복하기 위해 고안되었다. SMP를 사용하면 모든 메모리 액세스가 같은 공유 메모리 버스에 게시된다. CPU 수가 비교적 적을 때는 문제가 없지만 공유 메모리 버스 액세스를 위해 수십 개나 수백 개의 CPU가 경쟁할 경우에는 이 기능이 제대로 작동하지 않는다. NUMA는 특정 메모리 버스의 CPU 개수를 제한하고 고속 연결로 여러 개의 노드를 연결하여 이러한 병목 현상을 해소 한다.

 

NUMA는 하드웨어(하드웨어 NUMA) 또는 SQL Server 메모리를 구성(소프트 NUMA)하여 메모리를 CPU에 대응 시킬 수 있다. 시작 중에 SQL Server는 기본 운영체제 미 및 하드웨어 구성이나 소프트 NUMA 설정에 따라 구성 된다. 하드웨어 NUMA 및 소프트 NUMA 구성 시 SQL Server에서는 서비스 시작 시 각 노드에 대한 다중 모드 구성 메시지와 CPU 마스크가 SQL Server 로그에 기록 된다.

 

 

[하드웨어 NUMA]

하드웨어 NUMA가 구성된 컴퓨터에는 작은 프로세서 집합에 사용되는 시스템 버스가 여러 개 있다. 각 프로세서 그룹에는 자체 메모리가 있으며 자체 I/O 채널이 있는 경우도 있지만 각 CPU는 일관된 방법으로 다른 그룹과 연결된 메모리에 액세스 할 수 있다. 각 그룹을 NUMA 노드라고 하며 노드 내의 CPU 수는 하드웨어 공급업체에 따라 다르다.

 

 

하드웨어 NUMA가 있는 경우 NUMA 대신 인터리브 메모리를 사용하도록 구성 할 수 있다. 그러면 Windows와 SQL Server에서 NUMA로 인식되지 않는다.

 

다음 스크립트는 SQL Server에서 사용 가능한 메모리 노드의 개수를 확인 할 수 있다.

SELECT DISTINCT memory_node_id

FROM sys.dm_os_memory_clerks

 

 

SQL Server에서 하나의 메모리 노드(노드 0)만 반환되면 하드웨어 NUMA가 없거나 해당 하드웨어가 인터리브(비-NUMA)로 구성되어 있는 것이다. 하드웨어 NUMA가 잘못 구성되었다고 판단되는 경우 하드웨어 NUMA를 설정하도록 요청해야 한다.

 

SQL Server는 하드웨어 NUMA에 4개 이하의 CPU가 있고 CPU가 하나뿐인 노드가 하나 이상 있는 경우 NUMA 구성을 무시한다.

 

[소프트 NUMA]

SQL Server에서는 CPU를 소프트 NUMA라는 노드로 그룹화 할 수 있다. 일반적으로 많은 CPU가 있으며 하드웨어 NUMA가 없는 경우 소프트 NUMA를 구성하지만 소프트 NUMA를 사용하여 하드웨어 NUMA 노드를 더 작은 그룹으로 세분화 할 수도 있다.

 

SQL Server 스케줄러와 SQL Server 네트워크 인터페이스(SNI)만 소프트 NUMA를 인식한다. 메모리 노드는 하드웨어 NUMA를 기반으로 생성되므로 소프트 NUMA의 영향을 받지 않는다.

 

 

 

예를 들어 SMP 컴퓨터에 8개의 CPU가 있으며 각각 두 개의 CPU를 가진 소프트 NUMA 4개를 만들면 메모리 노드 하나에서 4개의 NUMA 노드를 모두 처리한다. 소프트 NUMA는 메모리에서 CPU로의 선호도를 제공하지 않는다.

 

소프트 NUMA는 많은 CPU가 있고 하드웨어 NUMA가 없는 컴퓨터에서 I/O 및 지연 기록기 병목을 완화시키는 이점이 있다. 각 NUMA 노드에 대해 I/O 스레드와 지연기록기 스레드가 각각 하나씩 있다. 데이터베이스 사용량에 따라 이러한 단일 스레드는 심각한 병목이 될 수 있다. 4개의 소프트 NUMA를 구성하면 I/O 스레드와 지연 기록기 스레드가 각각 4개가 되므로 성능이 향상 된다.

 

여러 하드웨어 NUMA 노드의 CPU를 포함하는 소프트 NUMA를 만들 수는 없다. 예를 들어 하드웨어에 8개의 CPU(0~7)가 있고 하드웨어 NUMA 노드가 두 개(0~3, 4~7)이면 CPU 0,1과 CPU 2,3을 결합하여 소프트 NUMA를 만들 수 있다. CPU 1,5를 사용하여 소프트 NUMA를 만들 수는 없지만 CPU 선호도를 사용하여 SQL Server 인스턴스의 선호도를 여러 NUMA 노드의 CPU로 설정 할 수 있다.

 

따라서 앞에서 설명한 SQL Server에 CPU 0~3이 사용되는 경우 I/O 스레드와 지연 기록기 스레드가 각각 하나씩 있다. 또한 SQL Server에 CPU 1,2,5,6이 사용되는 경우 두 개의 NUMA노드에 액세스하게 되며 I/O 스레드와 지연 기록기 스레드가 각각 두 개씩 있다.

 

일부 하드웨어 구성은 L3/L4 캐시 같은 일반 리소스를 공유한다. 이러한 공유 리소스를 중심으로 프로세서를 그룹화 하여 소프트 NUMA를 만들 수 있다.

 

 

[메모리 인터리빙]

메모리 접근 속도를 빠르게 하기 위해 인접한 메모리 위치를 서로 다른 뱅크에 둠으로써 동시에 여러 곳을 접근 할 수 있게 하는 기법. 메모리 인터리빙은 블로곡 단위 전송이 가능하므로 캐시나 기억장치와 주변 장치 사이의 빠른 데이터 전송을 위한 DMA에서 많이 사용한다.

 

2중 인터리빙 방식으로 홀수 번지의 주소를 가진 메모리를 하나의 뱅크에 두고 짝수 번지 주소를 가진 메모리를 다른 뱅크데 둠으로써 서로 다른 뱅크에 있는 메모리에 동시에 접근한다.

 

 

 

[참고자료]

 

 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
1810 DMV를 이용한 CPU 사용량 높은 쿼리 찾기 jevida(강성욱) 2016.09.29 4395
1809 DMV를 이용한 인덱스 크기 및 조각화 정보 반환 jevida(강성욱) 2016.09.29 1156
1808 Checkpoint 추적하기 jevida(강성욱) 2016.09.29 1285
1807 중복 인덱스와 성능(Duplicate Indexes with Performance) jevida(강성욱) 2016.09.29 2235
1806 823, 824, 825, 832 오류 (DISK IO 오류) jevida(강성욱) 2016.09.29 2138
1805 DISK I/O 병목 확인 jevida(강성욱) 2016.09.29 3718
1804 SQL Server 2012에서 비상계정 생성하기 - 비밀번호를 잊어 버렸을 경우 대처하기 jevida(강성욱) 2016.09.29 1251
1803 SQL Server 차단 최소화 jevida(강성욱) 2016.09.29 1129
1802 자주 사용되는 System 함수 jevida(강성욱) 2016.09.29 1070
1801 프로시저와 임시테이블, 그리고 리컴파일 jevida(강성욱) 2016.09.29 2398
1800 access check cache 크기에 따른 성능 문제 jevida(강성욱) 2016.09.29 1049
1799 Hot Add CPU jevida(강성욱) 2016.09.29 849
1798 스레드 및 파이버 실행 jevida(강성욱) 2016.09.29 1000
1797 CPU에 스레드 할당 및 lightweight pooling 옵션 사용 jevida(강성욱) 2016.09.29 1693
1796 스레드 및 태스크 아키텍처 jevida(강성욱) 2016.09.29 1392
1795 메모리 관리 아키텍처 – NUMA 버퍼 풀 증가 및 축소 jevida(강성욱) 2016.09.29 1231
1794 메모리 관리 아키텍처 – NUMA 지원 방법 jevida(강성욱) 2016.09.29 1545
» 메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해 jevida(강성욱) 2016.09.29 1415
1792 메모리 관리 아키텍처 – Hot Add 메모리 jevida(강성욱) 2016.09.28 929
1791 메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기 jevida(강성욱) 2016.09.28 1053





XE Login