메모리 관리 아키텍처 – NUMA 버퍼 풀 증가 및 축소
- Version : SQL Server 2005, 2008, 2008R2
SQL Server에서는 각 물리적 NUMA 노드에 대해 하나의 메모리 노드가 있다. 메모리 노드는 서로 독립적으로 증가하지만 메모리를 균일하게 나누어 쓴다.
예를 들어 SQL Server가 구성되어 있는 시스템의 메모리가 16GB라고 하였을 때 Windows를 포함한 다른 응용프로그램에서 각 노드의 일부 메모리를 사용하며 SQL Server는 일부 메모리를 버퍼 풀 외부의 프로세스에 할당 한다. 또한 SQL Server는 버퍼 풀에 할당할 10GB 메모리가 있을 때 버퍼 풀 메모리는 4개의 물리적인 NUMA 노드인 N0, N1, N2, N3에 분할되며 각 노드에서 사용할 수 있는 로컬 메모리는 다음과 같다.
- N0 – 1GB
- N1 – 3GB
- N2 – 3GB
- N3 – 3GB
위의 구성에서 모든 노드는 결국 2.5GB의 메모리를 할당 및 사용한다. 그러나 N0은 자체 메모리 1GB와 다른 노드의 메모리 1.5GB를 갖게 된다.
[시작 시 메모리 할당]
NUMA 사용 시 SQL Server는 초기 여유 메모리가 노드에 균일하지 않게 배포된 경우 NUMA가 구성되지 않은 시스템과 같은 속도로 운영체제에서 메모리를 받는다. 버퍼 풀은 각 노드에 대해 가능한 많은 로컬 메모리를 가져오려고 하지만 현재 Windows에 특정 노드에서 메모리를 할당하는 API가 없기 때문에 작업이 쉽지 않다.
메모리가 SQL Server에 할당 될 때 일부 노드에 다른 NUMA 노드의 페이지(외부 페이지)가 많이제공 될 수 있다. 그러나 이러한 페이지는 소유 노드로 자주 전송되어 해당 노드의 로컬 페이지가 될 수 있으므로 램프 업(ramp-up) 중에 사용되지 않는다.
Max server memory 값에 도달할 경우 일부 노드에 외부 메모리가 포함될 수도 있지만 메모리 대상이 획득되면 버퍼 풀에서 로컬 메모리와 외부 메모리를 동일하게 처리 한다. 예를 들어 메모리 부족 시 버퍼 풀에서 로컬 메모리 페이지보다 먼저 외부 메모리를 해제하려고 시도 하지 않는다.
[메모리를 특정 노드로 제한]
SQL Server가 사용 가능한 NUMA 노드의 하위 집합에서 실행되도록 구성되어 있으면 버퍼 풀은 해당 노드의 메모리로 자동으로 제한되지 않는다. 이 경우 버퍼 풀을 제한하려면 max server memory 옵션을 사용하여 메모리를 제한 한다.
- Max server memory 설정 : http://sqlmvp.kr/140167266577
[외부 페이지]
노드는 최대한 서로 독립적으로 작동한다. 노드에 대한 모든 메모리 할당 및 메모리 할당 취소는 해당 노드와 연결된 메모리를 사용하여 수행 된다. 그러나 노드 N1에서 실행 중인 작업자가 노드 N2의 메모리에 있는 데이터베이스 페이지에 액세스해야 하는 경우 로컬이 아닌 메모리에 액세스 한다.
[버퍼 풀의 로컬 메모리 및 외부 메모리 확인]
SQL Server에 대한 버퍼 풀의 전체 메모리는 Buffer Manager 개체의 Target pages 카운터로 표시 된다. 각 노드에 대한 버퍼 풀의 메모리는 Buffer Node 개체의 Target pages 카운터로 표시 된다. 다른 노드의 메모리는 foreign pages 카운터로 표시된다.
비-NUMA 하드웨어에서 SQL Server를 실행하는 경우 Buffer Node 및 Buffer Manager 개체의 카운터가 일치해야 하며 Foreign pages 카운터는 0이 된다.
NUMA 하드웨어에서 모든 Buffer Nodes의 각 카운터 합계는 Buffer Manager의 해당 합계와 일치해야 한다.
[각 노드에서 자체 메모리에 대해 검사점 수행]
각 메모리 노드는 자체 지연 기록기 스레드가 있다. 이 스레드는 암시적 검사점과 명시적 검사점에 대해 모두 호출 된다. SMP 컴퓨터에는 검사점 스레드가 하나뿐이므로 NUMA 사용시 여러 스레드를 사용하면 검사점의 속도가 향상 된다.
[테이블 검색 동작]
여러 노드의 CPU에서 병렬로 검색을 실행하지 않는 경우 노드 N1에서 실행되는 테이블 검색은 노드 N1과 연결된 메모리만 채운다. 검색이 단일 노드에서만 실행되는 경우에는 해당 노드의 버퍼 페이지만 사용된다.
[참고 자료]
- NUMA 버퍼 풀 증가 및 축소 :
http://msdn.microsoft.com/ko-kr/library/ms345403(v=sql.105).aspx
- Memory affinity in sparse matrixvector multiplications on multicore NUMA architectures(PDF)
http://www.cerfacs.fr/algor/PastWorkshops/SparseDays2011/Slides/sosonkina.pdf
- SQL Server, Buffer Manager 개체 :
http://msdn.microsoft.com/ko-kr/library/ms189628(v=sql.105).aspx
- SQL Server, Buffer Node 개체 :
http://msdn.microsoft.com/ko-kr/library/ms345597(v=sql.105).aspx
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp