메모리 부족 문제 해결

적용 대상: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에서 복구할 수 있습니다.

  1. DAC(관리자 전용 연결) 열기

  2. 수정 작업 수행

DAC(관리자 전용 연결) 열기

SQL Server는 DAC(관리자 전용 연결)를 제공합니다. DAC를 사용하면 서버가 다른 클라이언트 연결에 응답하지 않는 경우에도 관리자가 SQL Server 데이터베이스 엔진의 실행 중인 인스턴스에 액세스하여 서버의 문제를 해결할 수 있습니다. DAC는 유틸리티 및 SQL Server Management Studio를 sqlcmd 통해 사용할 수 있습니다.

SSMS를 통해 DAC를 사용하는 방법에 대한 지침은 sqlcmd데이터베이스 관리자에 대한 진단 연결을 참조하세요.

수정 조치 수행

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.가 나타나는 경우 이는 리소스 관리자를 사용하지 않기 때문일 수 있습니다. 리소스 관리자를 사용하지 않도록 설정하면 MEMORYBROKER_FOR_RESERVE 인공 메모리 압력을 유발합니다.

이 오류를 해결하려면 리소스 관리자를 사용하도록 설정해야 합니다.

제한 및 제한에 대한 정보와 개체 탐색기, 리소스 관리자 속성 또는 Transact-SQL을 사용하여 리소스 관리자를 사용하도록 설정하는 방법에 대한 지침은 리소스 관리자 사용을 참조하세요.

VM 환경에서 메모리 내 OLTP를 사용하는 모범 사례

서버 가상화를 사용하면 애플리케이션 프로비저닝, 유지 관리, 가용성 및 백업/복구 프로세스를 개선하여 IT 자본 및 운영 비용을 절감하고 IT 효율성을 높일 수 있습니다. 최근의 기술 발전으로 복잡한 데이터베이스 워크로드는 가상화를 사용하여 더 쉽게 통합할 수 있습니다. 이 항목에서는 가상화된 환경에서 SQL Server In-Memory OLTP를 사용하기 위한 모범 사례에 대해 설명합니다.

메모리 사전 할당

가상화된 환경의 메모리에 대해 필수적으로 고려해야 할 사항은 더 나은 성능과 향상된 지원 방식입니다. 요구 사항(최고 및 사용량이 낮은 부하)에 따라 가상 머신에 메모리를 신속하게 할당하고 메모리가 낭비되지 않도록 할 수 있어야 합니다. Hyper-V 동적 메모리 기능을 사용하면 호스트에서 실행되는 가상 컴퓨터 간에 메모리를 할당하고 관리하는 작업을 신속하게 수행할 수 있습니다.

메모리 최적화 테이블을 사용하여 데이터베이스를 가상화할 때 SQL Server 가상화 및 관리에 대한 몇 가지 모범 사례를 수정해야 합니다. 메모리 최적화 테이블이 없으면 다음 두 가지 모범 사례가 있습니다.

  • 최소 서버 메모리를 사용하는 경우 필요한 메모리 양만 할당하여 다른 프로세스에 충분한 메모리가 남아 있으므로 페이징을 방지하는 것이 좋습니다.
  • 메모리 사전 할당 값을 너무 높게 설정하지 마세요. 그렇지 않으면 다른 프로세스가 필요할 때 충분한 메모리를 얻지 못할 수 있으며 이로 인해 메모리 페이징이 발생할 수 있습니다.

메모리 최적화 테이블이 있는 데이터베이스에 대해 위의 사례를 따르는 경우 데이터베이스를 복구할 충분한 메모리가 있더라도 데이터베이스를 복원하고 복구하려고 하면 데이터베이스가 "복구 보류 중" 상태가 될 수 있습니다. 그 이유는 시작할 때 메모리 내 OLTP는 동적 메모리 할당이 데이터베이스에 메모리를 할당하는 것보다 더 적극적으로 메모리에 데이터를 가져오기 때문입니다.

해결

이 문제를 완화하기 위해서는 필요할 때 추가 메모리를 제공하기 위한 동적 메모리에 따라 달라지는 최소 값이 아니라 데이터베이스를 복구 또는 다시 시작하기 위한 충분한 메모리를 데이터베이스에 미리 할당하십시오.

참고 항목

메모리 내 OLTP에 대한 메모리 관리
메모리 사용량 모니터링 및 문제 해결
메모리 최적화 테이블이 있는 데이터베이스를 리소스 풀에 바인딩
메모리 관리 아키텍처 가이드
서버 메모리 서버 구성 옵션