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

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

메모리 관리 아키텍처 – 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 옵션을 사용하여 메모리를 제한 한다.

 

 

 

[외부 페이지]

노드는 최대한 서로 독립적으로 작동한다. 노드에 대한 모든 메모리 할당 및 메모리 할당 취소는 해당 노드와 연결된 메모리를 사용하여 수행 된다. 그러나 노드 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

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

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





XE Login