서버 메모리 구성 옵션
적용 대상: SQL Server
SQL Server 데이터베이스 엔진의 메모리 사용률은 구성 설정, min server memory (MB) and max server memory (MB) 쌍으로 제한됩니다. 시간이 지남에 따라 정상적인 환경에서 SQL Server는 max server memory (MB)로 설정된 한도까지 메모리를 클레임하려고 시도합니다.
참고 항목
Columnstore 인덱스: 개요 및 메모리 내 OLTP 개요 및 사용 시나리오 개체에는 자체 메모리 클럭이 있으므로 버퍼 풀 사용량을 보다 쉽게 모니터링할 수 있습니다. 자세한 내용은 sys.dm_os_memory_clerks를 참조하세요.
이전 버전의 SQL Server에서는 메모리 사용률이 거의 제한되지 않았고, 이는 SQL Server에서 모든 시스템 메모리를 사용할 수 있었음을 나타냅니다. 모든 버전의 SQL Server에서 max server memory (MB)를 구성하여 SQL Server 메모리 사용률의 상한을 구성하는 것이 좋습니다.
- SQL Server 2019(15.x) 이상 Windows 서버의 SQL 설치 프로그램은 설치 시 사용 가능한 시스템 메모리의 백분율에 따라 독립 실행형 SQL Server 인스턴스에 대한 max server memory (MB) 권장 사항을 제공합니다.
- 언제든지 min server memory (MB) 및 max server memory (MB) 구성 옵션을 통해 SQL Server 인스턴스에서 사용하는 SQL Server 프로세스에 대한 메모리 범위(MB)를 다시 구성할 수 있습니다.
참고 항목
이 가이드에서는 SQL Server on Windows 인스턴스를 참조합니다. Linux의 메모리 구성에 관한 내용은 SQL Server on Linux의 성능 모범 사례 및 구성 지침과 memory.memorylimitmb 설정을 참조하세요.
권장 사항
이러한 옵션에 대한 기본 설정 및 최소 허용 값은 다음과 같습니다.
옵션 | 기본값 | 최소 허용 값 | 권장 |
---|---|---|---|
min server memory (MB) | 0 | 0 | 0 |
max server memory (MB) | 2,147,483,647메가바이트(MB) | 128MB | 기타 인스턴스 등을 포함하여 다른 프로세스에서 사용하지 않는 사용 가능한 시스템 메모리의 75%. 더 자세한 권장 사항은 max server memory를 참조하세요. |
이러한 범위 내에서 SQL Server는 사용 가능한 시스템 리소스에 따라 동적으로 메모리 요구 사항을 변경할 수 있습니다. 자세한 내용은 동적 메모리 관리를 참조하세요.
- max server memory (MB) 값을 너무 높게 설정하면 SQL Server의 단일 인스턴스가 동일한 호스트에서 호스트되는 다른 SQL Server 인스턴스와 메모리를 경합할 수 있습니다.
- 그러나 max server memory (MB)를 너무 낮게 설정하면 성능이 저하될 수 있고 SQL Server 인스턴스에서 메모리 압력 및 성능 문제가 발생할 수 있습니다.
- max server memory (MB)를 최솟값으로 설정하면 SQL Server를 시작하지 못할 수도 있습니다. 이 옵션을 변경한 후 SQL Server를 시작할 수 없으면
-f
시작 옵션을 사용하여 SQL Server를 시작하고 max server memory (MB)를 이전 값으로 다시 설정합니다. 자세한 내용은 데이터베이스 엔진 서비스 시작 옵션을 참조하세요. - max server memory (MB) 및 min server memory (MB)를 동일한 값으로 설정하거나 동일한 값에 가깝게 설정하는 것은 좋지 않습니다.
참고 항목
최대 서버 메모리 옵션은 SQL Server 버퍼 풀의 크기만 제한합니다. 최대 서버 메모리 옵션은 확장 저장 프로시저, COM 개체, 공유되지 않는 DLL 및 EXE와 같은 다른 구성 요소의 할당을 위해 SQL Server 남은 예약되지 않은 메모리 영역을 제한하지 않습니다.
SQL Server는 메모리를 동적으로 사용할 수 있습니다. 그러나 메모리 옵션을 수동으로 설정하고 SQL Server에서 액세스할 수 있는 메모리 양을 제한할 수 있습니다. SQL Server에 대한 메모리 양을 설정하기 전에 OS(운영 체제), max server memory (MB)로 제어되지 않는 메모리 할당, 다른 모든 SQL Server 인스턴스(및 다른 SQL Server 인스턴스를 포함하여 서버가 메모리를 사용하는 다른 애플리케이션의 홈인 경우 다른 시스템이 사용)에 필요한 메모리를 총 실제 메모리에서 빼서 적합한 메모리 설정을 결정합니다. 이러한 차이는 현재 SQL Server 인스턴스에 할당할 수 있는 최대 메모리 양입니다.
모든 SQL Server 버전의 프로세스 가상 주소 공간 제한까지 메모리를 구성할 수 있습니다. 자세한 내용은 Windows 및 Windows Server 릴리스의 메모리 제한을 참조 하세요.
최소 서버 메모리
min server memory (MB)를 사용하여 SQL Server Memory Manager가 사용할 수 있는 최소 메모리 양을 보장합니다.
SQL Server는 시작할 때 min server memory (MB)에 지정된 메모리 양을 즉시 할당하지 않습니다. 그러나 클라이언트 부하로 인해 메모리 사용량이 이 값에 도달하면 SQL Server는 min server memory (MB) 값이 감소할 때까지 메모리를 확보할 수 없습니다. 예를 들어, SQL Server의 여러 인스턴스가 동일한 서버에 동시에 설치되는 경우 min server memory (MB) 매개 변수를 설정하여 인스턴스에 대한 메모리를 예약하는 것이 좋습니다.
기본 호스트의 메모리 압력이 게스트 VM(가상 머신)의 버퍼 풀에서 허용되는 성능에 필요한 것 이상으로 메모리를 할당 취소하지 않도록 하려면 가상화된 환경에서 min server memory (MB) 값을 설정해야 합니다. 가상 머신의 SQL Server 인스턴스가 가상 호스트 자동 관리 메모리 할당 취소 프로세스와 경쟁하지 않게 하는 것이 가장 좋습니다.
SQL Server는 min server memory (MB)에 지정된 메모리 양을 할당하도록 보장되지 않습니다. 서버의 부하 때문에 min server memory (MB)에 지정된 메모리 양을 할당할 필요가 없는 경우 SQL Server는 더 적은 메모리를 사용합니다.
최대 서버 메모리
max server memory (MB)를 사용하여 OS 및 기타 애플리케이션에서 SQL Server로 인한 부정적인 메모리 압력이 발생하지 않도록 보장합니다.
- max server memory (MB) 구성을 설정하기 전에 정상 작업 중에 SQL Server 인스턴스를 호스트하는 서버의 전체 메모리 사용량을 모니터링하여 메모리 가용성과 요구 사항을 확인합니다. 초기 구성의 경우 또는 시간 경과에 따른 SQL Server 프로세스 메모리 사용량을 수집할 수 없는 경우 다음 일반적인 모범 사례 접근 방식을 사용하여 단일 인스턴스에 대한 max server memory (MB)를 구성합니다.
- 총 OS 메모리에서, 스택 크기1에 계산된 최대 작업자 스레드 수2를 곱한 값인 max server memory (MB)로 제어되지 않는 잠재적 SQL Server 스레드 메모리 할당량을 뺍니다.
- 그런 다음 백업 버퍼, 확장 저장 프로시저 DLL, 자동화 프로시저를 사용하여 만든 개체(
sp_OA
호출) 및 연결된 서버 공급자의 할당을 비롯하여 max server memory (MB) control 외부의 다른 메모리 할당량에 대해 25%를 뺍니다. 이는 일반적인 근사값이며 진행 정도는 달라질 수 있습니다. - 남은 일은 단일 인스턴스 설정을 위한 max server memory (MB)를 설정하는 것입니다.
1 아키텍처당 스레드 스택 크기에 대한 자세한 내용은 메모리 관리 아키텍처 가이드를 참조하세요.
2 현재 호스트에서 지정된 수의 선호도 CPU에 대한 계산된 기본 작업자 스레드에 대한 자세한 내용은 최대 작업자 스레드(서버 구성 옵션)을 구성하는 방법에 대한 설명서 페이지를 참조하세요.
수동으로 옵션 설정
서버 옵션 min server memory (MB) 및 max server memory (MB)를 설정하여 메모리 값 범위를 확장합니다. 이 방법은 시스템 또는 데이터베이스 관리자가 다른 애플리케이션의 메모리 요구 사항이 있는 SQL Server의 인스턴스 또는 동일한 호스트에서 실행되는 SQL Server의 다른 인스턴스를 구성하는 데 유용합니다.
Transact-SQL 사용
min server memory (MB) 및 max server memory (MB) 옵션은 고급 옵션입니다. sp_configure
시스템 저장 프로시저를 사용하여 이러한 설정을 변경할 경우 show advanced options가 1로 설정된 경우에만 변경할 수 있습니다. 이 설정은 서버를 다시 시작하지 않아도 즉시 적용됩니다. 자세한 내용은 sp_configure를 참조하세요.
다음 예제에서는 max server memory (MB) 옵션을 12,288MB 또는 12GB로 설정합니다. sp_configure
는 옵션 이름을 max server memory (MB)
로 지정하지만 (MB)
는 생략할 수 있습니다.
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 12288;
GO
RECONFIGURE;
GO
다음 쿼리는 현재 구성된 값과 현재 사용 중인 값에 관한 정보를 반환합니다. 이 쿼리는 sp_configure
옵션 ‘show advanced options’가 사용하도록 설정되었는지 여부에 관계없이 결과를 반환합니다.
SELECT [name], [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)' OR [name] = 'min server memory (MB)';
SQL Server Management Studio 사용
min server memory (MB) 및 max server memory (MB)를 사용하여 SQL Server Memory Manager가 관리하는 SQL Server 인스턴스의 메모리 양을 다시 구성할 수 있습니다.
개체 탐색기에서 서버를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
서버 속성 창의 메모리 페이지를 선택합니다. 최소 서버 메모리 및 최대 서버 메모리의 현재 값이 표시됩니다.
서버 메모리 옵션에서 최소 서버 메모리 및 최대 서버 메모리에 원하는 숫자를 입력합니다. 권장 사항은 이 문서의 min server memory (MB) 및 max server memory (MB)를 참조하세요.
다음 스크린샷은 세 단계를 모두 보여 줍니다.
LPIM(메모리에 페이지 잠금)
Windows 기반 애플리케이션은 Windows AWE(Windows Address Windowing Extensions) API를 사용하여 실제 메모리를 프로세스 주소 공간에 할당하고 매핑할 수 있습니다. LPIM Windows 정책은 API에 액세스할 수 있는 계정을 결정하여 데이터를 실제 메모리에 유지하고 시스템이 디스크의 가상 메모리로 데이터를 페이징하지 않도록 방지합니다. AWE를 사용하여 할당된 메모리는 애플리케이션이 명시적으로 해제하거나 종료할 때까지 잠깁니다. 64비트 SQL Server 메모리 관리에 AWE API를 사용하는 것을 잠긴 페이지라고 하는 경우도 많습니다. 메모리에서 페이지를 잠그면 메모리를 디스크에 페이징할 때 서버의 응답성이 유지됩니다. sqlservr.exe
실행 권한이 있는 계정에 Windows LPIM(메모리에 페이지 잠금) 사용자 권한이 부여된 경우 SQL Server Standard 이상 버전의 인스턴스에서 메모리에 페이지 잠금 옵션은 사용으로 설정됩니다.
SQL Server에 대해 메모리에 페이지 잠금 옵션을 사용하지 않도록 설정하려면 권한을 가진 계정에 대해 메모리에 페이지 잠금 사용자 권한을 제거하여 sqlservr.exe
시작 계정(SQL Server 시작 계정)을 실행합니다.
LPIM을 사용해도 SQL Server 동적 메모리 관리에는 영향을 미치지 않으므로 다른 메모리 클럭의 요청에 따라 확장 또는 축소할 수 있습니다. 메모리에 페이지 잠금 사용자 권한을 사용하는 경우 max server memory (MB)의 상한을 설정하는 것이 좋습니다. 자세한 내용은 max server memory (MB)를 참조하세요.
LPIM은 sqlservr
프로세스가 페이징 아웃되고 있다는 징후가 있는 경우에만 사용됩니다. 이 경우 오류 17890이 다음 예제와 유사한 Errorlog에 보고됩니다.
A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.
시스템의 다른 메모리 소비자를 고려하지 않는 잘못 구성된 max server memory (MB) 설정과 함께 LPIM을 사용하면 다른 프로세스에 필요한 메모리 양 또는 max server memory (MB) 범위를 벗어난 SQL Server 메모리 요구 사항에 따라 불안정해질 수 있습니다. 자세한 내용은 max server memory를 참조하세요. LPIM(메모리에 페이지 잠금) 권한이 부여된 경우(32비트 또는 64비트 시스템에서)에는 기본값인 2,147,483,647MB(메가바이트)를 그대로 사용하지 않고 max server memory (MB)를 특정 값으로 설정하는 것이 좋습니다.
참고 항목
SQL Server 2012(11.x)부터 Standard Edition에서 잠긴 페이지를 사용하려면 추적 플래그 845가 필요하지 않습니다.
메모리의 페이지 잠금을 사용하도록 설정합니다.
이전 정보를 고려한 후 SQL Server 인스턴스에 대한 서비스 계정에 권한을 부여하여 메모리에 페이지 잠금 옵션을 사용하도록 설정하려면 메모리에 페이지 잠금 옵션 사용(Windows)을 참조하세요.
SQL Server 인스턴스의 서비스 계정을 확인하려면 SQL Server 구성 관리자를 참조하거나 sys.dm_server_services
에서 service_account
를 쿼리합니다. 자세한 내용은 sys.dm_server_services를 참조하세요.
메모리에 페이지 잠금 상태 보기
메모리에 페이지 잠금 권한이 SQL Server 인스턴스의 서비스 계정에 부여되는지 여부를 확인하려면 다음 쿼리를 사용합니다. 이 쿼리는 SQL Server 2016(13.x) SP1 이상에서 지원됩니다.
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;
sql_memory_model_desc
의 다음 값은 LPIM의 상태를 나타냅니다.
CONVENTIONAL
. 메모리에 페이지 잠금 권한이 부여되지 않습니다.LOCK_PAGES
. 메모리에 페이지 잠금 권한이 부여됩니다.LARGE_PAGES
. 메모리에 페이지 잠금 권한이 추적 플래그 834가 사용하도록 설정된 엔터프라이즈 모드에서 부여됩니다. 고급 구성이며 대부분의 환경에서는 권장되지 않습니다. 자세한 내용과 중요한 주의 사항은 추적 플래그 834를 참조하세요.
다음 메서드를 사용하여 SQL Server 인스턴스가 잠긴 페이지를 사용하고 있는지 여부를 확인합니다.
다음 Transact-SQL 쿼리의 출력은
locked_page_allocations_kb
에 대한 0이 아닌 값을 나타냅니다.SELECT osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb FROM sys.dm_os_memory_nodes omn INNER JOIN sys.dm_os_nodes osn ON (omn.memory_node_id = osn.memory_node_id) WHERE osn.node_state_desc <> 'ONLINE DAC';
현재 SQL Server 오류 로그는 서버를 시작하는 동안 메시지
Using locked pages in the memory manager
를 보고합니다.DBCC MEMORYSTATUS 출력의 메모리 관리자 섹션에는
AWE Allocated
항목에 대한 0이 아닌 값이 표시됩니다.
여러 SQL Server 인스턴스
여러 데이터베이스 엔진 인스턴스를 실행하는 경우 다음과 같은 다양한 접근 방식으로 메모리를 관리할 수 있습니다.
각 인스턴스에서 max server memory (MB)를 사용하여 이전에 설명한 대로 메모리 사용량을 제어합니다. 허용되는 총 메모리가 컴퓨터의 실제 메모리 합계보다 크지 않도록 주의하여 각 인스턴스의 최댓값을 설정합니다. 예상 작업이나 데이터베이스 크기에 비례하여 각 인스턴스에 메모리를 제공할 수 있습니다. 이 방법은 새 프로세스 또는 인스턴스가 시작될 때 사용 가능한 메모리를 즉시 사용할 수 있다는 장점이 있습니다. 단점은 모든 인스턴스를 실행하지 않는 경우 실행 중인 인스턴스가 남은 여유 메모리를 사용할 수 없다는 것입니다.
각 인스턴스에서 min server memory (MB)를 사용하여 이전에 설명한 대로 메모리 사용량을 제어합니다. 최솟값의 합계가 컴퓨터의 실제 메모리 합계보다 1~2GB 작도록 각 인스턴스의 최솟값을 설정합니다. 다시 말하지만, 해당 인스턴스의 예상 부하에 비례하여 이러한 최소값을 설정할 수 있습니다. 이 방법은 모든 인스턴스가 동시에 실행되지 않는 경우 실행 중인 인스턴스에서 사용 가능한 메모리를 다시 기본 사용할 수 있다는 장점이 있습니다. 또한 이 접근 방식은 SQL Server에 적절한 양의 메모리가 최소한 할당되도록 하기 때문에 컴퓨터에 메모리를 많이 사용하는 다른 프로세스가 있을 때 유용합니다. 단점은 새 인스턴스(또는 다른 프로세스)가 시작될 때 실행 중인 인스턴스가 메모리를 해제하는 데 다소 시간이 걸릴 수 있다는 것입니다. 특히 수정된 페이지를 데이터베이스에 다시 작성해야 하는 경우 그렇습니다.
각 인스턴스에서 max server memory (MB) 및 min server memory (MB)를 모두 사용하여 광범위한 잠재적 메모리 사용률 수준 내에서 각 인스턴스의 최대 사용률 및 최소 메모리 보호를 관찰하고 조정하는 방식으로 메모리 사용량을 제어합니다.
아무 작업도 하지 않음(권장되지 않음) 워크로드와 함께 제공되는 첫 번째 인스턴스는 모든 메모리를 할당하는 경향이 있습니다. 유휴 인스턴스나 나중에 시작된 인스턴스는 최소의 사용 가능한 메모리만 사용하여 실행될 수 있습니다. SQL Server는 인스턴스 간에 메모리 사용량의 균형을 맞추려고 시도하지 않습니다. 그러나 모든 인스턴스는 Windows 메모리 알림 신호에 응답하여 메모리 공간의 크기를 조정합니다. Windows는 메모리 알림 API를 통해 애플리케이션에서 메모리 균형을 유지하지 않고 시스템의 메모리 가용성에 대한 글로벌 피드백만 제공합니다.
인스턴스를 다시 시작하지 않고 이러한 설정을 변경할 수 있으므로 사용 패턴에 가장 적합한 설정을 쉽게 찾을 수 있습니다.
예제
A. max server memory 옵션을 4GB로 설정
다음 예제에서는 max server memory (MB) 옵션을 4096MB 또는 4GB로 설정합니다. sp_configure
는 옵션 이름을 max server memory (MB)
로 지정하지만 (MB)
는 생략할 수 있습니다.
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
이렇게 하면 Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install.
과 비슷한 문이 출력됩니다. 새 메모리 한도는 RECONFIGURE
를 실행하면 즉시 적용됩니다. 자세한 내용은 sp_configure를 참조하세요.
B. 현재 메모리 할당 확인
다음 쿼리는 현재 할당된 메모리에 대한 정보를 반환합니다.
SELECT
physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB,
large_page_allocations_kb/1024 AS sql_large_page_allocations_MB,
locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB,
virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB,
virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
page_fault_count AS sql_page_fault_count,
memory_utilization_percentage AS sql_memory_utilization_percentage,
process_physical_memory_low AS sql_process_physical_memory_low,
process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;
C. max server memory (MB)
값 보기
다음 쿼리는 현재 구성된 값과 사용 중인 값에 대한 정보를 반환합니다. 이 쿼리는 sp_configure
옵션 ‘show advanced options’가 사용하도록 설정되었는지 여부에 관계없이 결과를 반환합니다.
SELECT [value], [value_in_use]
FROM sys.configurations WHERE [name] = 'max server memory (MB)';