OOM(메모리 부족) 문제 해결Resolve Out Of Memory issues

이 항목 적용 대상: 예SQL Server없습니다Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 메모리 내 OLTPSQL Server In-Memory OLTPSQL ServerSQL Server와 다른 방법으로 더 많은 메모리를 사용합니다. uses more memory and in different ways than does SQL ServerSQL Server. 필요 증가에 따라 메모리 내 OLTPIn-Memory OLTP 에 대해 설치하고 할당한 메모리의 양이 불충분해질 수 있습니다.It is possible that the amount of memory you installed and allocated for 메모리 내 OLTPIn-Memory OLTP becomes inadequate for your growing needs. 이 경우 메모리가 부족해질 수 있습니다.If so, you could run out of memory. 이 항목에서는 OOM 상황에서 복구하는 방법을 설명합니다.This topic covers how to recover from an OOM situation. 여러 OOM 상황을 방지하는 데 도움이 될 수 있는 지침은 메모리 사용량 모니터링 및 문제 해결 을 참조하세요.See Monitor and Troubleshoot Memory Usage for guidance that can help you avoid many OOM situations.

이 항목의 내용Covered in this topic

항목Topic 개요Overview
OOM으로 인한 데이터베이스 복원 실패 해결Resolve database restore failures due to OOM “'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 '<databaseName>' 데이터베이스에 대한 복원 작업이 실패했습니다.”라는 오류 메시지가 나타나는 경우 수행할 작업입니다.What to do if you get the error message, “Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'.”
메모리 부족 또는 OOM 상황이 작업에 미치는 영향 해결Resolve impact of low memory or OOM conditions on the workload 메모리 부족 문제가 성능에 부정적인 영향을 미치고 있음을 발견할 경우 수행할 작업입니다.What to do if you find low memory issues are negatively impacting performance.
사용 가능한 메모리가 충분한 경우 메모리 부족으로 인한 페이지 할당 오류 해결Resolve page allocation failures due to insufficient memory when sufficient memory is available 작업에 사용할 수 있는 메모리가 충분한데 “'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 '<databaseName>' 데이터베이스에 대해 페이지를 할당할 수 없습니다.What to do if you get the error message, “Disallowing page allocations for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'. …”…” 오류 메시지가 나타나는 경우 수행할 작업입니다.when available memory is sufficient for the operation.
최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용Best Practices using In-Memory OLTP in a VM environment 가상화된 환경에서 메모리 내 OLTP를 사용할 때의 참고 사항입니다.What to keep in mind when using In-Memory OLTP in a virtualized environment.

OOM으로 인한 데이터베이스 복원 실패 해결Resolve database restore failures due to OOM

데이터베이스 복원을 시도하면 "'<resourcePoolName>' 리소스 풀의 메모리 부족으로 인해 <databaseName>' 데이터베이스에 대한 복원 작업이 실패했습니다."라는 오류 메시지가 나타날 수 있습니다. 이 오류는 서버에 데이터베이스를 복원하는 데 충분히 사용 가능한 메모리가 없는 것을 나타냅니다.When you attempt to restore a database you may get the error message: “Restore operation failed for database '<databaseName>' due to insufficient memory in the resource pool '<resourcePoolName>'.” This indicates that the server does not have enough available memory for restoring the database.

데이터베이스를 복원할 서버에는 데이터베이스 백업 시 메모리 최적화 테이블에 대해 충분한 사용 가능한 메모리가 있어야 합니다. 그렇지 않으면 데이터베이스가 온라인 상태가 되지 않습니다.The server you restore a database to must have enough available memory for the memory-optimized tables in the database backup, otherwise the database will not come online.

서버에 충분한 실제 메모리가 있지만 이 오류가 계속 나타나면 다른 프로세스에서 너무 많은 메모리를 사용하거나, 구성 문제로 복원에 사용할 수 있는 메모리가 충분하지 않을 수 있습니다.If the server does have enough physical memory, but you are still seeing this error, it could be that other processes are using too much memory or a configuration issue causes not enough memory to be available for restore. 이 문제 유형의 경우 다음 조치를 수행하여 복원 작업에 필요한 메모리를 더 많이 확보하세요.For this class of issues, use the following measures to make more memory available to the restore operation:

  • 실행 중인 응용 프로그램을 일시적으로 닫습니다.Temporarily close running applications.
    실행 중인 응용 프로그램을 하나 이상 닫거나 현재 필요 없는 서비스를 중지하여 해당 응용 프로그램에서 사용 중인 메모리를 복원 작업에 사용할 수 있습니다.By closing one or more running applications or stopping services not needed at the moment, you make the memory they were using available for the restore operation. 성공적으로 복원한 후 해당 응용 프로그램을 다시 시작할 수 있습니다.You can restart them following the successful restore.

  • MAX_MEMORY_PERCENT의 값을 늘립니다.Increase the value of MAX_MEMORY_PERCENT.
    데이터베이스가 리소스 풀에 바인딩된경우 복원에 사용할 수 있는 메모리는 MAX_MEMORY_PERCENT에서 관리됩니다(모범 사례).If the database is bound to a resource pool, which is best practice, the memory available to restore is governed by MAX_MEMORY_PERCENT. 값이 너무 작으면 복원이 실패합니다.If the value is too low, restore will fail. 이 코드 조각은 PoolHk 리소스 풀에 대한 MAX_MEMORY_PERCENT를 설치된 메모리의 70%로 변경합니다.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

    중요

    서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 값을 MAX_MEMORY_PERCENT와 동일한 값으로 설정합니다.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT to the same value as MAX_MEMORY_PERCENT.
    자세한 내용은 최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용 항목을 참조하세요.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

    -- 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의 최대값에 대한 자세한 내용은 항목 섹션 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율을 참조하세요.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

  • 최대 서버 메모리를 늘립니다.Increase max server memory.
    최대 서버 메모리 구성에 대한 자세한 내용은 서버 메모리 서버 구성 옵션 항목을 참조하세요.For information on configuring max server memory see the topic Server Memory Server Configuration Options.

메모리 부족 또는 OOM 상황이 작업에 미치는 영향 해결Resolve impact of low memory or OOM conditions on the workload

물론 OOM(메모리 부족) 상황에 빠지지 않는 것이 최선입니다.Obviously, it is best to not get into a low memory or OOM (Out of Memory) situation. 적절한 계획과 모니터링을 통해 OOM 상황을 방지할 수 있습니다.Good planning and monitoring can help avoid OOM situations. 그렇지만 최상의 계획을 세우더라도 실제 발생하는 상황을 항상 예측할 수 있는 것은 아니며 결국 메모리 부족 또는 OOM 상황에 도달할 수 있습니다.Still, the best planning does not always foresee what actually happens and you might end up with low memory or OOM. 다음 두 가지 방법으로 OOM에서 복구할 수 있습니다.There are two steps to recovering from OOM:

  1. DAC(관리자 전용 연결) 열기Open a DAC (Dedicated Administrator Connection)

  2. 수정 조치 수행Take corrective action

DAC(관리자 전용 연결) 열기Open a DAC (Dedicated Administrator Connection)

SQL ServerSQL Server 는 DAC(관리자 전용 연결)를 제공합니다. provides a dedicated administrator connection (DAC). DAC를 사용하면 관리자는 서버가 다른 클라이언트 연결에 응답하지 않는 경우에도 실행 중인 SQL Server 데이터베이스 엔진 인스턴스에 액세스하여 서버에서 문제를 해결할 수 있습니다.The DAC allows an administrator to access a running instance of SQL Server Database Engine to troubleshoot problems on the server—even when the server is unresponsive to other client connections. DAC는 sqlcmd 유틸리티 및 SQL Server Management StudioSQL Server Management Studio를 통해 사용할 수 있습니다.The DAC is available through the sqlcmd utility and SQL Server Management StudioSQL Server Management Studio.

SSMS 또는 sqlcmd를 통한 DAC 사용에 대한 지침은 데이터베이스 관리자를 위한 진단 연결을 참조하세요.For guidance on using DAC through SSMS or sqlcmd, refer to Diagnostic Connection for Database Administrators.

수정 조치 수행Take corrective action

OOM 상태를 해결하려면 사용을 축소하여 기존 메모리를 확보하거나 더 많은 메모리를 메모리 내 테이블에 사용할 수 있게 만들어야 합니다.To resolve your OOM condition you need to either free up existing memory by reducing usage, or make more memory available to your in-memory tables.

기존 메모리 확보Free up existing memory

필수적이지 않은 메모리 액세스에 최적화된 테이블 행을 삭제하고 가비지 수집 대기Delete non-essential memory optimized table rows and wait for garbage collection

메모리 액세스에 최적화된 테이블에서 필수적이지 않은 행을 제거할 수 있습니다.You can remove non-essential rows from a memory optimized table. 가비지 수집기는 이러한 행에 사용되는 메모리를 사용 가능한 메모리로 되돌립니다.The garbage collector returns the memory used by these rows to available memory. 메모리 내 OLTP 엔진은 가비지 행을 적극적으로 수집합니다.In-memory OLTP engine collects garbage rows aggressively. 그러나 장기 실행 트랜잭션으로 인해 가비지가 수집되지 않을 수 있습니다.However, a long running transaction can prevent garbage collection. 예를 들어, 5분간 실행되는 트랜잭션이 있는 경우 트랜잭션이 활성 상태인 동안 수행되는 업데이트/삭제 작업으로 생성된 모든 행 버전에 대해 가비지 수집이 수행되지 않을 수 있습니다.For example, if you have a transaction that runs for 5 minutes, any row versions created due to update/delete operations while the transaction was active can’t be garbage collected.

디스크 기반 테이블로 하나 이상의 행 이동Move one or more rows to a disk-based table

다음 TechNet 문서에는 메모리 최적화 테이블에서 디스크 기반 테이블로 행을 이동하는 방법이 나와 있습니다.The following TechNet articles provide guidance on moving rows from a memory-optimized table to a disk-based table.

사용 가능한 메모리 늘리기Increase available memory

리소스 풀에서 MAX_MEMORY_PERCENT의 값 늘리기Increase value of MAX_MEMORY_PERCENT on the resource pool

메모리 내 테이블에 대한 명명된 리소스 풀을 만들지 않은 경우 이 리소스 풀을 만들고 메모리 내 OLTPIn-Memory OLTP 데이터베이스를 이 리소스 풀에 바인딩해야 합니다.If you have not created a named resource pool for your in-memory tables you should do that and bind your 메모리 내 OLTPIn-Memory OLTP databases to it. 리소스 풀을 만들고 데이터베이스를 리소스 풀에 바인딩하는 방법에 대한 지침은 메모리 액세스에 최적화된 테이블이 있는 데이터베이스를 리소스 풀에 바인딩 메모리 내 OLTPIn-Memory OLTP 항목을 참조하세요.See the topic Bind a Database with Memory-Optimized Tables to a Resource Pool for guidance on creating and binding your 메모리 내 OLTPIn-Memory OLTP databases to a resource pool.

메모리 내 OLTPIn-Memory OLTP 데이터베이스가 리소스 풀에 바인딩된 경우 풀에서 액세스할 수 있는 메모리 비율을 늘릴 수 있습니다.If your 메모리 내 OLTPIn-Memory OLTP database is bound to a resource pool you may be able to increase the percent of memory the pool can access. 리소스 풀을 위한 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 값 변경에 대한 지침은 하위 항목 기존 풀에서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 변경 을 참조하세요.See the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool for guidance on changing the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT for a resource pool.

MAX_MEMORY_PERCENT의 값을 늘립니다.Increase the value of MAX_MEMORY_PERCENT.
이 코드 조각은 PoolHk 리소스 풀에 대한 MAX_MEMORY_PERCENT를 설치된 메모리의 70%로 변경합니다.This code snippet changes MAX_MEMORY_PERCENT for the resource pool PoolHk to 70% of installed memory.

중요

서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 동일한 값으로 설정합니다.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
자세한 내용은 최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용 항목을 참조하세요.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

-- 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의 최대값에 대한 자세한 내용은 항목 섹션 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율을 참조하세요.For information on maximum values for MAX_MEMORY_PERCENT see the topic section Percent of memory available for memory-optimized tables and indexes.

추가 메모리 설치Install additional memory

가능한 경우 궁극적으로 가장 좋은 해결 방법은 추가 실제 메모리를 설치하는 것입니다.Ultimately the best solution, if possible, is to install additional physical memory. 이렇게 할 경우 에 더 이상 메모리 부족이 발생하지 않을 것이므로 MAX_MEMORY_PERCENT 값도 늘려서 새로 설치된 메모리 중 전부는 아니라도 대부분을 리소스 풀에 사용하도록 설정할 수 있습니다(하위 항목기존 풀에서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 변경 SQL ServerSQL Server 참조).If you do this, remember that you will probably be able to also increase the value of MAX_MEMORY_PERCENT (see the sub-topic Change MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT on an existing pool) since SQL ServerSQL Server won’t likely need more memory, allowing you to make most if not all of the newly installed memory available to the resource pool.

중요

서버가 VM에서 실행 중이고 전용 서버가 아니면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 동일한 값으로 설정합니다.If the server is running on a VM and is not dedicated, set the value of MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value.
자세한 내용은 최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용 항목을 참조하세요.See the topic Best Practices using In-Memory OLTP in a VM environment for more information.

사용 가능한 메모리가 충분한 경우 메모리 부족으로 인한 페이지 할당 오류 해결Resolve page allocation failures due to insufficient memory when sufficient memory is available

페이지를 할당하는 데 사용할 수 있는 물리적 메모리가 충분할 때 오류 로그에 오류 메시지 Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'http://go.microsoft.com/fwlink/?LinkId=330673' for more information.가 나타나는 경우 이는 리소스 관리자를 사용하지 않기 때문일 수 있습니다.If you get the error message, Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'http://go.microsoft.com/fwlink/?LinkId=330673' for more information. in the error log when the available physical memory is sufficient to allocate the page, it may be due to a disabled Resource Governor. 리소스 관리자를 사용하지 않으면 MEMORYBROKER_FOR_RESERVE가 인위적인 메모리 압력을 유발합니다.When the Resource Governor is disabled MEMORYBROKER_FOR_RESERVE induces artificial memory pressure.

이 오류를 해결하려면 리소스 관리자를 사용하도록 설정해야 합니다.To resolve this you need to enable the Resource Governor.

개체 탐색기, 리소스 관리자 속성 또는 Transact-SQL로 리소스 관리자를 사용하도록 설정하는 지침과 제한 사항에 대한 자세한 내용은 리소스 관리자 사용 을 참조하세요.See Enable Resource Governor for information on Limits and Restrictions as well as guidance on enabling Resource Governor using Object Explorer, Resource Governor properties, or Transact-SQL.

최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용Best Practices using In-Memory OLTP in a VM environment

서버 가상화 기술을 사용하면 IT 자본 및 운영 비용을 줄이고 향상된 응용 프로그램 프로비전, 유지 관리, 가용성 및 백업/복구 프로세스를 통해 IT 효율성을 높일 수 있습니다.Server virtualization can help you lower IT capital and operational costs and attain greater IT efficiency with improved application provisioning, maintenance, availability, and backup/recovery processes. 최근의 기술적 진보에 따라 가상화를 사용하면 복잡한 데이터베이스 작업도 보다 쉽고 간단하게 통합할 수 있습니다.With recent technological advances, complex database workloads can be more readily consolidated using virtualization. 이 항목에서는 가상화된 환경에서 SQL Server In-Memory OLTP를 사용하기 위한 모범 사례에 대해 설명합니다.This topic covers best practices for using SQL Server In-Memory OLTP in a virtualized environment.

메모리 사전 할당Memory pre-allocation

가상화된 환경의 메모리에 대해 필수적으로 고려해야 할 사항은 더 나은 성능과 향상된 지원 방식입니다.For memory in a virtualized environment, better performance and enhanced support are essential considerations. 요구 사항(최대 및 최소 부하)에 따라 가상 컴퓨터에 메모리를 신속하게 할당하면서도 메모리가 낭비되지 않도록 방지하는 두 마리 토끼를 모두 잡아야 합니다.You must be able to both quickly allocate memory to virtual machines depending on their requirements (peak and off-peak loads) and ensure that the memory is not wasted. Hyper-V 동적 메모리 기능을 사용하면 호스트에서 실행되는 가상 컴퓨터 간에 메모리를 할당하고 관리하는 작업을 신속하게 수행할 수 있습니다.The Hyper-V Dynamic Memory feature increases agility in how the memory is allocated and managed between virtual machines running on a host.

메모리 최적화 테이블이 포함된 데이터베이스를 가상화할 때는 SQL Server 가상화 및 관리를 위한 일부 모범 사례에 대한 수정이 필요합니다.Some best practices for virtualizing and managing SQL Server need to be modified when virtualizing a database with memory-optimized tables. 메모리 최적화 테이블이 없는 경우의 모범 사례 중 두 가지는 다음과 같습니다.Without memory-optimized tables, two of the best practices are:

  • min server memory를 사용하는 경우에는 다른 프로세스용으로 메모리가 충분히 남아 있도록 필요한 양의 메모리만 할당하여 페이징이 수행되지 않도록 하는 것이 좋습니다.If you use min server memory, it is better to assign only the amount of memory that is required so sufficient memory remains for other processes (thereby avoiding paging).
  • 메모리 미리 할당 값은 너무 높게 설정하지 마십시오.Do not set the memory pre-allocation value too high. 그렇지 않으면 다른 프로세스에 메모리가 필요할 때 충분한 메모리를 사용하지 못하게 되어 메모리 페이징이 발생할 수 있습니다.Otherwise, other processes may not get sufficient memory at the time when they require it, and this can result in memory paging.

메모리 최적화 테이블이 포함된 데이터베이스에서 위와 같은 방식을 따를 경우, 데이터베이스 복구에 사용할 수 있는 메모리가 충분하더라도 데이터베이스를 복원 및 복구하려고 하면 데이터베이스가 "복구 보류 중" 상태가 될 수 있습니다.If you follow the above practices for a database with memory-optimized tables, an attempt to restore and recover a database could result in the database being in a “Recovery Pending” state, even if you have sufficient memory to recover the database. 그 이유는 In-Memory OLTP는 시작 시 동적 메모리 할당이 데이터베이스에 메모리를 할당하는 것보다 더 많은 데이터를 메모리로 가져오기 때문입니다.The reason for this is that, when starting up, In-Memory OLTP brings data into memory more aggressively than dynamic memory allocation allocates memory to the database.

해결 방법Resolution

이 문제를 완화하기 위해서는 필요할 때 추가 메모리를 제공하기 위한 동적 메모리에 따라 달라지는 최소 값이 아니라 데이터베이스를 복구 또는 다시 시작하기 위한 충분한 메모리를 데이터베이스에 미리 할당하십시오.To mitigate this, pre-allocate sufficient memory to the database to recover or restart the database, not a minimum value relying on dynamic memory to provide the additional memory when needed.

관련 항목:See Also

메모리 내 OLTP의 메모리 관리 Managing Memory for In-Memory OLTP
메모리 사용량 모니터링 및 문제 해결 Monitor and Troubleshoot Memory Usage
메모리 액세스에 최적화된 테이블이 있는 데이터베이스를 리소스 풀에 바인딩 Bind a Database with Memory-Optimized Tables to a Resource Pool
메모리 관리 아키텍처 가이드Memory Management Architecture guide
서버 메모리 서버 구성 옵션Server Memory Server Configuration Options