메모리 관리 아키텍처 – Min/Max Server Memory 효과

 

  • Version : SQL Server 2005, 2008, 2008R2

 

 

Min Server Memory / Max Server Memory의 두 가지 옵션을 사용하여 SQL Server 인스턴스에서 사용하는 버퍼 풀의 메모리 양을 제어 할 수 있다.

 

기본적으로 SQL Server는 사용할 수 있는 시스템의 리소스에 따라 메모리를 동적으로 변경 한다. Min Server Memory 의 최소 용량은 0 이며 Max Server Memory의 최소 용량은 16MB이다.

 

 

SQL Server는 프로세스로서 Max Server Memory 옵션이 지정한 것보다 더 많은 메모리를 확보 한다. 내부 및 외부 구성요소 모두 추가 메모리를 사용하는 버퍼 풀 외부로 메모리를 할당할 수 있지만 일반적으로 버퍼 풀에 할당된 메모리가 SLQ Server에서 사용하는 메모리의 가장 큰 부분을 차지 한다.

 

Max Server Memory를 최소값으로 설정하면 SQL Server 성능에 문제가 발생 할 수 있으며 서비스 시작 시 정상적으로 실행되지 않는다면 –f 옵션을 사용하여 SQL Server를 시작하고 Max Server Memory의 값을 다시 설정 한다.

 

필자의 테스트 환경에서 Max Server Memory 값을 10MB로 설정 후 서비스 재시작을 하면 최소 Max Server Memory 값인 16MB로 변경되어 서비스가 시작된 것을 확인 할 수 있었다.

 

 

메모리를 동적으로 사용하는 경우 실제 메모리 여유 공간을 확보하기 위해 정기적으로 시스템을 쿼리 한다. SQL Server는 메모리 알림 API인 QueryMemoryResourceNotification을 사용하여 버퍼 풀에서 메모리를 할당 미 및 해제할 수 있는 시기를 결정 한다.

 

  • QueryMemoryResourceNotification function :

http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa366799(v=vs.85).aspx

 

Min Server Memory / Max Server Memory 값이 동일하게 지정 된 경우 데이터베이스 엔진은 할당된 메모리가 해당 값에 도달하면 데이터베이스 엔진은 버퍼 풀에 대한 메모리의 동적 해제 및 확보를 중지 한다.

 

 

SQL Server는 Min Server Memory를 사용하여 인스턴스의 버퍼 풀에 사용 가능한 최소 메모리 양을 보장한다. SQL Server 시작 시 Min Server Memory에 지정된 메모리 양을 즉시 할당하지 않는다. 그러나 클라이언트 로드 때문에 메모리 사용량이 이 값에 도달하면 Min Server Memory 값을 줄이기 전에 SQL Server가 할당된 버퍼 풀에서 메모리를 비울 수 없다.

 

SQL Server는 Max Server Memory를 사용하여 버퍼 풀이 지정된 양 이상 사용하지 못하도록 하여 나머지 메모리를 다른 응용프로그램이 사용 할 수 있다. SQL Server는 시작 할 때 Max Server Memory에서 지정된 메모리를 즉시 할당하지 않는다. 필요 시 Max Server Memory 까지 증가 시킨다. Max Server Memory의 값을 늘리기 전까지는 메모리 사용량을 초과할 수 없다.

 

 

 

Max Server Memory 값을 설정 할 때 성능 모니터를 사용하여 부하 상태에서 SQL Server:Buffer Manager 성능 개체를 검사하고 [Stolen pages] 및 [Reserved pages] 카운터의 현재 값을 확인 한다. 카운터의 값은 8K 페이지 수로 메모리를 보고 한다. 메모리 부족 오류를 방지하려면 Max Server Memory의 값을 두 카운터의 값의 합계보다 커야 한다. 가장 낮은 적절한 Max Server Memory(MB) 설정은 ([Stolen pages] + [Reserved pages])/100 이다.

 

 

Max Server Memory를 줄이려면 SQL Server를 다시 시작하여 메모리를 해제 해야 할 수 도 있다. Min Server Memory / Max Server Memory는 옵션이 변경될 경우 서비스를 재시작 하지 않아도 즉시 적용 된다. 위에서 말한 max server memory 해제 부분에 대해서는 사용 중인 경우 즉시 반환 할 수 없으며 필자의 경우에는 운영 중에 할당된 메모리가 필요 없는 경우 Max Server Memory 까지 메모리를 반환하는 것을 확인 할 수 있었다. 물론 즉시 반환은 아니었으며 다른 응용 프로그램이 요청할 때 반환 하는 듯 하였다.

 

 

[가상 메모리 관리]

4GB의 주소 공간은 Windows VMM(가상 메모리 관리자)에 의해 사용할 수 있는 실제 메모리에 매핑된다. 따라서 AWE에서 실제 액세스 할 수 잇는 메모리 용량은 사용 중인 운영체제에 따라 달라진다.

 

가상 주소 시스템에서는 실제 메모리의 과다 커밋이 허용되므로 가상 메모리와 실제 메모리의 비율이 1:1을 초과할 수 있다. 그 결과 실제 메모리가 다양하게 구성된 컴퓨터에서 대용량 프로그램을 실행 할 수 있다. 그러나 모든 프로세스의 현재 평균 설정을 합한 값보다 너무 많은 가상 메모리를 사용하면 성능이 떨어 질 수 있다.

 

 

[다중 SQL Server 인스턴스 실행 환경]

  • Max Server Memory : 허용 되는 총 메모리가 컴퓨터의 실제 메모리 합계보다 크지 않도록 해야 한다. 예상 작업이나 데이터베이스 크기에 비례하여 각 인스턴스 메모리를 설정 한다. 이 방법은 프로세스나 인스턴스 시작시 여유 메모리를 즉시 사용할 수 있지만 모든 인스턴스를 실행하지 않는 경우 실행 중인 인스턴스가 남은 여유 메모리를 사용할 수 없다.

 

  • Min Server Memory : 최소값의 합계가 실제 메모리의 합계보다 1-2GB정도 작도록 각 인스터턴스를 설정한다. 이 방법은 모든 인스턴스가 동시에 실행하지 않는 경우 실행 중인 인스턴스에서 남은 여유 메모리를 사용할 수 있는 장점이 있다. 단점은 새 인스턴스나 프로세스 시작 시 메모리를 해제 하기 위해 수정된 페이지를 다시 데이터베이스에 써야 하는 경우 실행 중인 인스턴스 메모리를 해제하는데 오랜 시간이 걸린다. 이때 페이징 파일의 크기를 훨씬 늘려야 할 수도 있다.

 

  • Min Server Memory / Max Server Memory를 설정하지 않는 경우 작업이 제공되는 첫 번째 인스턴스에서 모든 메모리를 할당 하여 유휴 인스턴스나 나중에 시작된 인스턴스는 사용 가능한 최소 메모리만으로 실행되지 않을 수 있다. SQL Server는 인스터턴스 간의 메모리 사용을 조절하지는 않는다. 그러나 모든 인스턴스는 Windows 메모리 알림 신호에 응답하여 버퍼 풀의 크기를 조절 한다. Windows 메모리 알림 API로 응용프로그램 간 메모리 균형을 유지하는 것이 아니라 단순히 시스템의 메모리 사용 가능 여부에 대한 전역 피드백만 제공한다.

 

 

[참고 자료]

  • Min / Max Server Memory 효과 :

http://msdn.microsoft.com/ko-kr/library/ms180797(v=sql.105).aspx

http://mssqlwiki.com/tag/querymemoryresourcenotification/

 

 

 

강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 598
1806 823, 824, 825, 832 오류 (DISK IO 오류) jevida(강성욱) 2016.09.29 2250
1805 DISK I/O 병목 확인 jevida(강성욱) 2016.09.29 4099
1804 SQL Server 2012에서 비상계정 생성하기 - 비밀번호를 잊어 버렸을 경우 대처하기 jevida(강성욱) 2016.09.29 1507
1803 SQL Server 차단 최소화 jevida(강성욱) 2016.09.29 1159
1802 자주 사용되는 System 함수 jevida(강성욱) 2016.09.29 1093
1801 프로시저와 임시테이블, 그리고 리컴파일 jevida(강성욱) 2016.09.29 2501
1800 access check cache 크기에 따른 성능 문제 jevida(강성욱) 2016.09.29 1088
1799 Hot Add CPU jevida(강성욱) 2016.09.29 880
1798 스레드 및 파이버 실행 jevida(강성욱) 2016.09.29 1049
1797 CPU에 스레드 할당 및 lightweight pooling 옵션 사용 jevida(강성욱) 2016.09.29 1770
1796 스레드 및 태스크 아키텍처 jevida(강성욱) 2016.09.29 1473
1795 메모리 관리 아키텍처 – NUMA 버퍼 풀 증가 및 축소 jevida(강성욱) 2016.09.29 1252
1794 메모리 관리 아키텍처 – NUMA 지원 방법 jevida(강성욱) 2016.09.29 1580
1793 메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해 jevida(강성욱) 2016.09.29 1453
1792 메모리 관리 아키텍처 – Hot Add 메모리 jevida(강성욱) 2016.09.28 947
1791 메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기 jevida(강성욱) 2016.09.28 1083
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1283
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1851
» 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2596
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1385





XE Login