본문 바로가기

SQL Server/SQL Server Tip & Tech

affinity mask, affinity I/O mask, soft NUMA 적용

SQL Server에서는 CPU 및 I/O의 affinity를 지정할 수 있습니다.

목적은 CPU를 특정 스레드에 할당하여 컨텍스트 스위치를 줄임으로써 성능을 향상시키는 것입니다.

물론 대부분의 경우 OS가 컨트롤 하도록 놔두는 것이 더 좋습니다.

그럼 어떤 경우에 이런 설정이 필요할까요?

- 멀티 인스턴스 환경에서 인스턴스 별로 CPU를 할당하고 싶다.
- 단일 인스턴스 환경에서 CPU 집약적 작업과 디스크 I/O작업의 비율이 극단적으로 다를 때, 각 작업에 CPU를 할당하고 싶다.
- 위 두가지 모두...

이 정도 이유가 있을 듯 하네요.

각 옵션의 기능은 아래와 같습니다.

- affinity mask 옵션을 사용하면 SQL Server 인스턴스가 사용할 CPU를 지정
- affinity I/O mask 옵션을 사용하면 SQL Server 인스턴스가 디스크 I/O에 사용할 CPU를 지정

단, 두 옵션은 서로 배타적이어야하는데... 즉 동일 CPU를 두가지 작업에 함께 할당 할 수는 없습니다.

대신 모든 CPU를 affinity mask 적용하고 affinity I/O mask는 적용하지 않는 것은 가능합니다.


예를 들어 서버에 16개의 CPU가 있다고 가정합니다.

1번째 ~ 4번째 CPU에 CPU affinity를 적용하고, 5번째 ~ 16번째 CPU에 디스크 I/O affinity를 적용하고자 한다면, 아래와 같이 설정할 수 있습니다.

EXEC sp_configure 'show advanced options', 1;

RECONFIGURE;

GO

 

EXEC sp_configure 'affinity mask', 15; -- 0x1111

RECONFIGURE;

GO

 

EXEC sp_configure 'affinity I/O mask', 65520; -- 0x1111111111110000

RECONFIGURE;

GO

해당 서버가 CPU 집약적인 작업이 많다면 더 많은 CPU를 CPU affinity 적용하고, 그 반대라면 I/O affinity 적용하는 방식입니다.



그리고... NUMA (Non-uniform Memory Access)라는 개념이 있습니다. (SQL Server 2000 SP4, 2005, 2008)

CPU가 많을수록, CPU의 클럭 스피드가 빠를 수록... 메모리에 접근하기 위한 경합으로 병목이 발생하기 쉬운데... CPU와 전용의 메모리를 쌍으로 구성한 하드웨어를 사용하여 성능을 높이는 것입니다.

NUMA는 위에서 언급한대로 하드웨어로서도 존재하지만, OS에서 레지스트리를 설정하여 소프트 NUMA를 구성할 수도 있습니다.

단, 소프트 NUMA는 하드웨어 NUMA에서처럼 각 NUMA 노드에 메모리가 직접 매핑되는 형태는 아닙니다.

대신 "I/O 스레드"와 "지연 기록기 스레드"가 NUMA 노드 만큼 만들어지기 때문에 I/O가 많은 인스턴스에 유리한 시스템을 구성할 수 있습니다.

CPU에 소프트 NUMA 노드를 매핑하기 위해선 레지스트리 키를 추가해야하는데, 이 때 매핑할 CPU는 미리 affinity 옵션으로 해당 인스턴스에 할당되어 있어야 합니다.

추가해야하는 레지스트리 키는 아래와 같습니다. (SQL 서비스 재시작 필요)


SQL Server 2005

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1



SQL Server 2008

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node1



각 키에 다음과 같이 DWORD를 추가해 줍니다.

유형

값 이름

값 데이터

DWORD

CPUMask

0x3

DWORD

CPUMask

0xC


위 예는 2개의 NUMA 노드를 만들고, 첫번째 NUMA 노드에 0번, 1번 CPU를... 두번째 NUMA 노드에 2번, 3번 CPU를 할당한 것입니다.

11 = 3 = 0x3
1100 = 12 = 0xC

물론 미리 affinity mask 옵션으로 첫번째와 두번째 CPU가 SQL Server 인스턴스에 할당되어 있어야 합니다.


p.s
tempdb 최적화 방법에서 권고하는 사항 중 하나는... CPU의 수 만큼 동일한 사이즈의 tempdb 데이터 파일을 생성하라... 입니다.
이때, affinity mask 옵션이 설정되었다면... affinity mask로 할당한 CPU의 수 만큼의 tempdb 데이터 파일을 세팅해 주면 됩니다.