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

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

메모리 관리 아키텍처 – 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
1791 메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기 jevida(강성욱) 2016.09.28 1056
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1250
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1818
» 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2557
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1365
1786 메모리 관리 아키텍처 – 프로세스 주소 공간 jevida(강성욱) 2016.09.28 1363
1785 메모리 관리 아키텍처 – 메모리 아키텍처 jevida(강성욱) 2016.09.28 1873
1784 데이터 압축 상태에 대한 개체 크기 예상 jevida(강성욱) 2016.09.28 1368
1783 sp_MSforeachdb, sp_MSforeachtable 프로시저 활용하기 jevida(강성욱) 2016.09.28 2887
1782 SQL Server 쿼리 처리 아키텍처_분산 쿼리 아키텍처 jevida(강성욱) 2016.09.28 1145
1781 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 jevida(강성욱) 2016.09.28 1341
1780 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 jevida(강성욱) 2016.09.28 1853
1779 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 jevida(강성욱) 2016.09.28 1791
1778 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements jevida(강성욱) 2016.09.28 1009
1777 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 강제 매개 변수화 jevida(강성욱) 2016.09.28 999
1776 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 단순 매개 변수화 jevida(강성욱) 2016.09.28 880
1775 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 매개 변수 및 실행 계획 재사용 jevida(강성욱) 2016.09.28 1098
1774 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 jevida(강성욱) 2016.09.28 1440
1773 DMV를 이용한 캐시된 저장 프로시저 통계 정보 확인 jevida(강성욱) 2016.09.28 989
1772 SQL Server 쿼리 처리 아키텍처_저장 프로시저 및 트리거 실행 jevida(강성욱) 2016.09.27 941





XE Login