메모리 부족 문제 해결
적용 대상: SQL Server
메모리 내 OLTP는 SQL Server와 다른 방법으로 더 많은 메모리를 사용합니다. 요구 사항의 증가에 따라 메모리 내 OLTP에 대해 설치하고 할당한 메모리의 양이 불충분해질 수 있습니다. 이 경우 메모리가 부족해질 수 있습니다. 이 항목에서는 OOM 상황에서 복구하는 방법을 설명합니다. 여러 OOM 상황을 방지하는 데 도움이 될 수 있는 지침은 메모리 사용량 모니터링 및 문제 해결 을 참조하세요.
이 주제에서 다루는 내용
항목 | 개요 |
---|---|
OOM으로 인한 데이터베이스 복원 실패 해결 | "'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 '<databaseName>' 데이터베이스에 대한 복원 작업이 실패했습니다"라는 오류 메시지가 나타나는 경우 수행할 작업입니다. |
메모리 부족 또는 OOM 상황이 작업에 미치는 영향 해결 | 메모리 부족 문제가 성능에 부정적인 영향을 미치고 있음을 발견할 경우 수행할 작업입니다. |
사용 가능한 메모리가 충분한 경우 메모리 부족으로 인한 페이지 할당 오류 해결 | 작업에 사용할 수 있는 메모리가 충분한데 "'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 '<databaseName>' 데이터베이스에 대해 페이지를 할당할 수 없습니다"라는 오류 메시지가 나타나는 경우 수행할 작업입니다. |
VM 환경에서 메모리 내 OLTP를 사용하는 모범 사례 | 가상화된 환경에서 메모리 내 OLTP를 사용할 때 유의해야 할 사항입니다. |
OOM으로 인한 데이터베이스 복원 실패 해결
데이터베이스 복원을 시도하면 "'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 '<databaseName>' 데이터베이스에 대한 복원 작업이 실패했습니다"라는 오류 메시지가 나타날 수 있습니다. 이는 서버에 데이터베이스 복원에 사용 가능한 메모리가 충분하지 않음을 나타냅니다.
데이터베이스를 복원할 서버에는 데이터베이스 백업 시 메모리 최적화 테이블에 대해 사용 가능한 메모리가 충분히 있어야 합니다. 그렇지 않으면 데이터베이스가 온라인 상태가 되지 않고 의심되는 것으로 표시됩니다.
서버에 실제 메모리가 충분하지만 이 오류가 계속 표시되는 경우 다른 프로세스에서 메모리를 너무 많이 사용하거나 구성 문제로 인해 복원에 사용 가능한 메모리가 부족한 것일 수 있습니다. 이러한 클래스의 문제에서는 다음 측정값을 사용하여 복원 작업에 더 많은 메모리를 사용할 수 있도록 합니다.
실행 중인 애플리케이션을 일시적으로 닫습니다.
실행 중인 애플리케이션을 하나 이상 닫거나 현재 필요 없는 서비스를 중지하여 해당 애플리케이션에서 사용 중인 메모리를 복원 작업에 사용할 수 있습니다. 복원에 성공한 후 다시 시작할 수 있습니다.MAX_MEMORY_PERCENT의 값을 늘립니다.
데이터베이스가 리소스 풀에 바인딩되어 있는 경우 복원에 사용 가능한 메모리는 MAX_MEMORY_PERCENT로 제어됩니다. 이 값이 너무 낮으면 복원이 실패합니다. 이 코드 조각은 리소스 풀 PoolHk의 MAX_MEMORY_PERCENT를 설치된 메모리의 70%로 변경합니다.Important
서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 값을 MAX_MEMORY_PERCENT와 동일한 값으로 설정합니다.
자세한 내용은 VM 환경에서 메모리 내 OLTP 사용 모범 사례를 참조하세요.-- disable resource governor ALTER RESOURCE GOVERNOR DISABLE -- change the value of MAX_MEMORY_PERCENT ALTER RESOURCE POOL PoolHk WITH ( MAX_MEMORY_PERCENT = 70 ) GO -- reconfigure the Resource Governor -- RECONFIGURE enables resource governor ALTER RESOURCE GOVERNOR RECONFIGURE GO
MAX_MEMORY_PERCENT의 최대값에 대한 자세한 내용은 항목 섹션 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율을 참조하세요.
최대 서버 메모리를 늘립니다.
최대 서버 메모리 구성에 대한 자세한 내용은 서버 메모리 서버 구성 옵션을 참조하세요.
메모리 부족 또는 OOM 상황이 작업에 미치는 영향 해결
물론 메모리가 부족하거나 OOM(메모리 부족) 상황에 빠지지 않는 것이 가장 좋습니다. 적절한 계획과 모니터링을 통해 OOM 상황을 방지할 수 있습니다. 여전히 최고의 계획으로도 실제로 일어나는 일을 항상 예측하지는 못하며 낮은 메모리 또는 OOM 상황이 발생할 수 있습니다. 다음 두 가지 방법으로 OOM에서 복구할 수 있습니다.
DAC(관리자 전용 연결) 열기
SQL Server는 DAC(관리자 전용 연결)를 제공합니다. DAC를 사용하면 서버가 다른 클라이언트 연결에 응답하지 않는 경우에도 관리자가 SQL Server 데이터베이스 엔진 실행 인스턴스에 액세스하여 서버의 문제를 해결할 수 있습니다. DAC는 sqlcmd
유틸리티 및 SQL Server Management Studio를 통해 사용할 수 있습니다.
SSMS 또는 sqlcmd
를 통해 DAC를 사용하는 방법에 대한 지침은 데이터베이스 관리자를 위한 진단 연결을 참조하세요.
정정 작업 수행
OOM 조건을 해결하려면 사용량을 줄여 기존 메모리를 확보하거나 메모리 내 테이블에서 더 많은 메모리를 사용할 수 있도록 해야 합니다.
기존 메모리 확보
필수가 아닌 메모리 최적화 테이블 행을 삭제하고 가비지 수집을 기다립니다.
메모리 최적화 테이블에서 필수가 아닌 행을 제거할 수 있습니다. 가비지 수집기는 이러한 행에서 사용하는 메모리를 사용 가능한 메모리로 반환합니다. 메모리 내 OLTP 엔진은 가비지 행을 공격적으로 수집합니다. 그러나 장기 트랜잭션은 가비지 수집을 방해할 수 있습니다. 예를 들어 5분 동안 실행되는 트랜잭션이 있는 경우 트랜잭션이 활성 상태인 동안 업데이트/삭제 작업으로 인해 생성된 행 버전은 가비지 수집이 불가능합니다.
하나 이상의 행을 디스크 기반 테이블로 이동
다음 TechNet 문서에서는 메모리 최적화 테이블에서 디스크 기반 테이블로 행을 이동하는 방법에 대한 지침을 제공합니다.
사용 가능한 메모리 늘리기
리소스 풀에서 MAX_MEMORY_PERCENT의 값 늘리기
메모리 내 테이블에 대해 명명된 리소스 풀을 만들지 않은 경우 이를 수행하고 메모리 내 OLTP 데이터베이스를 바인딩해야 합니다. 메모리 내 OLTP 데이터베이스를 만들고 리소스 풀에 바인딩하는 방법에 대한 지침은 메모리 최적화 테이블이 있는 데이터베이스를 리소스 풀에 바인딩 항목을 참조하세요.
메모리 내 OLTP 데이터베이스가 리소스 풀에 바인딩된 경우 풀에서 액세스할 수 있는 메모리 비율을 늘릴 수 있습니다. 리소스 풀의 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 변경하는 방법에 대한 지침은 하위 항목 기존 풀의 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 변경을 참조하세요.
MAX_MEMORY_PERCENT의 값을 늘립니다.
이 코드 조각은 리소스 풀 PoolHk의 MAX_MEMORY_PERCENT를 설치된 메모리의 70%로 변경합니다.
Important
서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 값을 동일하게 설정합니다.
자세한 내용은 VM 환경에서 메모리 내 OLTP 사용 모범 사례를 참조하세요.
-- disable resource governor
ALTER RESOURCE GOVERNOR DISABLE
-- change the value of MAX_MEMORY_PERCENT
ALTER RESOURCE POOL PoolHk
WITH
( MAX_MEMORY_PERCENT = 70 )
GO
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
MAX_MEMORY_PERCENT의 최대값에 대한 자세한 내용은 항목 섹션 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율을 참조하세요.
추가 메모리 설치
궁극적으로 최상의 솔루션은 가능한 경우 실제 메모리를 추가로 설치하는 것입니다. 이렇게 하면 SQL Server에 더 많은 메모리가 필요하지 않으므로 MAX_MEMORY_PERCENT 값도 늘릴 수 있으며(하위 항목 기존 풀의 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 변경 참조) 리소스 풀에 새로 설치된 메모리를 모두 사용할 수 없는 경우 최대한 활용할 수 있습니다.
Important
서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 값을 동일하게 설정합니다.
자세한 내용은 VM 환경에서 메모리 내 OLTP 사용 모범 사례를 참조하세요.
사용 가능한 메모리가 충분한 경우 메모리 부족으로 인한 페이지 할당 오류 해결
페이지를 할당하는 데 사용할 수 있는 물리적 메모리가 충분할 때 오류 로그에 오류 메시지 Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information.
가 나타나는 경우 이는 리소스 관리자를 사용하지 않기 때문일 수 있습니다. Resource Governor를 사용하지 않도록 설정하면 MEMORYBROKER_FOR_RESERVE가 인공 메모리 압력을 유발합니다.
이 오류를 해결하려면 리소스 관리자를 사용하도록 설정해야 합니다.
한도 및 제한에 대한 정보와 개체 탐색기, Resource Governor 속성 또는 Transact-SQL을 사용하여 Resource Governor를 사용하도록 설정하는 방법에 대한 지침은 Resource Governor 사용을 참조하세요.
VM 환경에서 메모리 내 OLTP를 사용하는 모범 사례
서버 가상화를 사용하면 애플리케이션 프로비저닝, 유지 관리, 가용성, 백업/복구 프로세스를 개선하여 IT 자본 및 운영 비용을 절감하고 IT 효율성을 높일 수 있습니다. 최근의 기술 발전으로 복잡한 데이터베이스 워크로드는 가상화를 사용하여 더 쉽게 통합할 수 있습니다. 이 항목에서는 가상화된 환경에서 SQL Server In-Memory OLTP를 사용하기 위한 모범 사례에 대해 설명합니다.
메모리 사전 할당
가상화된 환경의 메모리에 대해 필수적으로 고려해야 할 사항은 더 나은 성능과 향상된 지원 방식입니다. 요구 사항(최고 로드 및 사용량이 적은 로드)에 따라 가상 머신에 메모리를 신속하게 할당하고 메모리가 낭비되지 않게 할 수 있어야 합니다. Hyper-V 동적 메모리 기능을 사용하면 호스트에서 실행되는 가상 컴퓨터 간에 메모리를 할당하고 관리하는 작업을 신속하게 수행할 수 있습니다.
메모리 최적화 테이블이 포함된 데이터베이스를 가상화할 때는 SQL Server 가상화 및 관리를 위한 일부 모범 사례를 수정해야 합니다. 메모리 최적화 테이블이 없는 경우 두 가지 모범 사례는 다음과 같습니다.
- 최소 서버 메모리를 사용하는 경우 필요한 메모리 양만 할당하여 다른 프로세스에 충분한 메모리가 남아 있게 하여 페이징을 방지하는 것이 좋습니다.
- 메모리 사전 할당 값을 너무 높게 설정하지 않습니다. 그렇지 않으면 다른 프로세스에서 필요할 때 충분한 메모리를 얻지 못할 수 있으며 이로 인해 메모리 페이징이 발생할 수 있습니다.
메모리 최적화 테이블이 포함된 데이터베이스에서 위와 같은 방식을 따를 경우 데이터베이스 복구에 사용할 수 있는 메모리가 충분하더라도 데이터베이스를 복원 및 복구하려고 하면 데이터베이스가 "복구 보류 중" 상태가 될 수 있습니다. 그 이유는 시작할 때 메모리 내 OLTP는 동적 메모리 할당이 데이터베이스에 메모리를 할당하는 것보다 더 공격적으로 메모리에 데이터를 가져오기 때문입니다.
해결
이 문제를 완화하기 위해서는 필요할 때 추가 메모리를 제공하기 위한 동적 메모리에 따라 달라지는 최소 값이 아니라 데이터베이스를 복구 또는 다시 시작하기 위한 충분한 메모리를 데이터베이스에 미리 할당하십시오.
참고 항목
메모리 내 OLTP에 대한 메모리 관리
메모리 사용량 모니터링 및 문제 해결
메모리 최적화 테이블이 있는 데이터베이스를 리소스 풀에 연결
메모리 관리 아키텍처 가이드
서버 메모리 서버 구성 옵션