NUMA(Non-Uniform Memory Access) 이해

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

NUMA 개념

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

NUMA 하드웨어에서는 일부 메모리 영역이 실제로 나머지 영역과 다른 버스에 있습니다. NUMA는 로컬 메모리와 외부 메모리를 사용하므로 다른 영역에 비해 일부 메모리 영역에 액세스하는 시간이 오래 걸립니다. 로컬 메모리와 외부 메모리라는 용어는 대개 현재 실행 중인 스레드에 대한 참조에 사용됩니다. 로컬 메모리는 현재 스레드를 실행 중인 CPU와 같은 노드에 있는 메모리입니다. 스레드가 현재 실행 중인 노드에 속하지 않는 메모리는 외부 메모리입니다. 외부 메모리를 원격 메모리라고도 합니다. 로컬 메모리 액세스 비용에 대한 외부 메모리 액세스 비용의 비율을 NUMA 비율이라고 합니다. NUMA 비율이 1이면 이는 SMP(대칭 다중 처리)입니다. 비율이 높을수록 다른 노드의 메모리에 액세스하는 데 더 많은 비용이 소요됩니다. SQL Server 2000 SP3 이전 버전을 포함하여 NUMA를 인식하지 않는 Windows 응용 프로그램은 경우에 따라 NUMA 하드웨어에서 제대로 작동하지 않습니다.

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

4개의 프로세서가 있는 NUMA 노드

하드웨어 NUMA 및 소프트 NUMA

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

하드웨어 NUMA

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

하드웨어 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 노드를 만들 수 있습니다.

자세한 내용은 방법: 소프트 NUMA를 사용하도록 SQL Server 구성을 참조하십시오.