BLOG main image
분류 전체보기 (45)
SQL Server 이야기 (45)
일상 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2009. 9. 1. 17:26

 

1.   물리적 CPU 리소스 분산이 필요한 경우


하나의
SQL Server에서 다른 타입의 쿼리가 수행되는 경우에

원활한 서비스를 위해 물리적인 리소스(CPU)를 분산 시켜 주어야 하는 이슈가 있을 수 있습니다.

예를 들어보면, 하나는 CPU자원을 많이 사용하지는 않지만, 많이 요청되는 OLTP성 쿼리,

다른 하나는 많이 수행되지는 않지만 CPU자원을 많이 사용하는 배치성 쿼리인 환경을 볼 수 있습니다.

 

이러한 경우에 배치성 쿼리로 인해 OLTP 쿼리 성능에 영향을 줄 수 있습니다.

이때 해결 할 수 있는 방법으로는 각각의 쿼리 타입마다 물리적인 리소스(CPU)를 할당하여
같은 다른 타입의 형태의 쿼리가 같은 CPU를 사용하지 못하게 한다면, 위와 같은 문제를 처리할 수 있습니다. 
 

2.   해결할 수 있는 방법들

 

가장 먼저 떠오르는 방법은,
하나의 물리적인 머신에 두 개의 인스턴스를 올리고
, affinity mask를 설정하는 것입니다.

또한 물리적인 메모리를 각각의 인스턴스에서 설정하여, 메모리 크기도 조절할 수 있는
장점이 있습니다. 하지만
, 인스턴스가 다른 관계로 데이터를 동기화 해주어야 하는 부담이
존재하게 되고 전체적인 운영비용이 높아질 수 밖에 없습니다
.

 

~ 다른 방법으로 그냥 MAXDOP를 줘서 CPU사용을 제한 하는 것도 방법일 수 있지만,
MAXDOP
의 경우 물리적인 CPU 지정 및 사용량을 지정을 할 수 없기에
배치가 수행되는 CPU에서 수행되는 OLTP성 쿼리는 여전히 문제가 될 수 있습니다.

 

음~ 그럼 SQL Server 2008의 리소스 관리자를 생각할 수 있습니다.

하지만 SQL Server 2008 Enterprise에서만 지원하는 제약이 있습니다.

 

3.   또 하나의 방법 NUMA


여기서 소개하려는 방법은
NUMA 를 이용한 방법 입니다.
상황에 따라 최선의 솔루션은 달라지기에 모든 상황에 대한 최선의 솔루션이라고는 볼 수 없습니다.
그리고 여기서는 NUMA를 소개하고자 하는 것이
아니기에 
NUMA에 대한 소개는 건너뛰겠습니다.


요즘 판매되는 네할렘 기반의 프로세스는 메모리 컨트롤러가
CPU내부에 위치하고 있어
기본적으로
2CPU 이상인 경우 NUMA를 지원하고 있습니다.

만약 NUMA를 지원하지 않는 환경이라도 soft NUMA를 설정 할 수 있기에 크게 상관은 없습니다
 

그럼 NUMA를 가지고 어떻게 할 수 있을까요?


BOL을 보면 NUMA
노드 별로 TCP/IP 포트를 설정할 수 있는 방법을 소개 하고 있습니다.
바로 이 설정으로 쿼리 타입별 CPU 리소스를 분리 할 수 있습니다.
만약 하드웨어 NUMA로 지원되는 노드가 아니라 더 세분하게 CPU 리소스를 분산하고자 한다면
soft NUMA를 추가적으로 설정해서 처리할 수 있습니다.

 

간단하게 예를 들면 1000포트는 0NUMA 노드, 2000번 포트는 1NUMA 노드,
3000
번 포트는 모든 NUMA를 사용하게 설정 할 수 있습니다
.

 

이렇게 설정하게 된 후 각각의 클라이언트에서 각 쿼리 타입별로 사용 포트를 변경해서

사용하면 CPU 리소스 간섭 없이 처리 할 수 있습니다.


간단한 구성 방법은 아래를 참고하시길 바랍니다. 

[soft NUMA 설정 방법] http://msdn.microsoft.com/ko-kr/library/ms345357.aspx

 

Soft NUMA
를 설정하거나, NUMA를 지원하는 장비라면 sp_readerrorlog에서 아래와 같은 메시지를 확인할 수 있습니다.

2009-08-28 15:10:23.940 서버          Node configuration: node 0: CPU mask: 0x000000aa Active CPU mask: 0x000000aa.
2009-08-28 15:10:23.940 서버          Node configuration: node 1: CPU mask: 0x00000055 Active CPU mask: 0x00000055.


 

[NUMA 노드에 TCP/IP 포트 매핑] http://msdn.microsoft.com/ko-kr/library/ms345346.aspx

 

TCP/IP 포트를 NUMA노드에 맵핑 재시작 하면 SP_READERORLOG 에서는 아래와 같이 확인할 있습니다.

2009-08-28 15:10:24.860
서버          Server is listening on [ 'any' <ipv4> 3000].
2009-08-28 15:10:24.860 서버          SQL Server Network Interfaces initialized listeners on node 0 of a multi-node (NUMA) server configuration with node affinity mask 0x00000003.
2009-08-28 15:10:24.860 서버          Server is listening on [ 'any' <ipv4> 1000].
2009-08-28 15:10:24.860 서버          SQL Server Network Interfaces initialized listeners on node 0 of a multi-node (NUMA) server configuration with node affinity mask 0x00000001.
2009-08-28 15:10:24.860 서버          Server is listening on [ 'any' <ipv4> 2000].
2009-08-28 15:10:24.860 서버          SQL Server Network Interfaces initialized listeners on node 1 of a multi-node (NUMA) server configuration with node affinity mask 0x00000002

각각의 포트별로 스트레스를 주고 작업관리자를 확인해 보면
, NUMA 노드 만을 사용하는 것을 확인할 수 있습니다  

1000번 포트 사용

2000번 포트 사용

3000번 포트 사용

송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com