메모리 최적화 테이블이 있는 데이터베이스를 리소스 풀에 연결
적용 대상: SQL Server
리소스 풀은 관리할 수 있는 물리적 리소스의 하위 집합을 나타냅니다. 기본적으로 SQL Server 데이터베이스는 기본 리소스 풀의 리소스에 바인딩되고 이 리소스를 사용합니다. 하나 이상의 메모리 최적화 테이블이 SQL Server의 리소스를 사용하지 않게 하고 다른 메모리 사용자가 메모리 최적화 테이블에 필요한 메모리를 사용하지 않게 하려면 별도의 리소스 풀을 만들어 메모리 최적화 테이블이 있는 데이터베이스의 메모리 사용을 관리해야 합니다.
데이터베이스는 하나의 리소스 풀에만 바인딩할 수 있습니다. 하지만 동일한 풀에 여러 데이터베이스를 바인딩할 수 있습니다. SQL Server에서는 메모리 최적화 테이블이 없는 리소스 풀에 바인딩할 수 있지만 이렇게 하는 것은 아무 효과도 없습니다. 나중에 데이터베이스에 메모리 최적화 테이블을 만들려면 명명된 리소스 풀에 데이터베이스를 바인딩합니다.
데이터베이스를 리소스 풀에 바인딩하려면 먼저 데이터베이스와 리소스 풀이 있어야 합니다. 바인딩은 다음에 데이터베이스가 온라인 상태가 될 때 적용됩니다. 자세한 내용은 데이터베이스 상태를 참조하세요.
리소스 풀에 대한 자세한 내용은 Resource Governor 리소스 풀을 참조하세요.
데이터베이스를 리소스 풀에 바인딩하는 단계
이 주제의 다른 콘텐츠
데이터베이스 및 리소스 풀 만들기
데이터베이스 및 리소스 풀은 어떤 순서로든 만들 수 있습니다. 중요한 것은 데이터베이스를 리소스 풀에 바인딩하기 전에 둘 다 존재한다는 것입니다.
데이터베이스 생성
다음 Transact-SQL은 하나 이상의 메모리 최적화 테이블을 포함하는 IMOLTP_DB라는 이름의 데이터베이스를 만듭니다. 이 명령을 실행하기 전에 <driveAndPath> 경로가 있어야 합니다.
CREATE DATABASE IMOLTP_DB
GO
ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_fg CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_fg' , FILENAME = 'c:\data\IMOLTP_DB_fg') TO FILEGROUP IMOLTP_DB_fg;
GO
MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 최솟값 결정
메모리 최적화 테이블에 필요한 메모리 요구 사항을 결정한 뒤 필요한 사용 가능한 메모리의 비율을 결정하고 메모리 비율을 해당 값 이상으로 설정해야 합니다.
예제:
이 예제에서는 계산을 통해 메모리 최적화 테이블 및 인덱스에 16GB의 메모리가 필요하다고 판단했음을 가정합니다. 그리고 사용하기 위해 커밋된 메모리가 32GB라고 가정합니다.
언뜻 보기에는 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT를 50(16은 32의 50%)으로 설정해야 하는 것처럼 보일 수 있습니다. 그러나 이렇게 하면 메모리 최적화 테이블에 충분한 메모리를 제공하지 않습니다. 아래 표(메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율)를 살펴보면 커밋된 메모리가 32GB인 경우, 그 중 80%만 메모리 최적화 테이블 및 인덱스에 사용할 수 있음을 알 수 있습니다. 따라서 커밋된 메모리가 아닌 사용 가능한 메모리를 기준으로 최소 및 최대 백분율을 계산합니다.
memoryNeedeed = 16
memoryCommitted = 32
availablePercent = 0.8
memoryAvailable = memoryCommitted * availablePercent
percentNeeded = memoryNeeded / memoryAvailable
실제 수에 연결한 내용:
percentNeeded = 16 / (32 * 0.8) = 16 / 25.6 = 0.625
따라서 메모리 최적화 테이블 및 인덱스의 16GB 요구 사항을 충족하려면 사용 가능한 메모리의 62.5% 이상이 필요합니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 값은 정수여야 하므로 최소 63%로 설정합니다.
리소스 풀 만들기 및 메모리 구성
메모리 최적화 테이블에 대한 메모리를 구성할 때 용량 계획은 MAX_MEMORY_PERCENT가 아니라 MIN_MEMORY_PERCENT를 기준으로 수행해야 합니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT에 대한 자세한 내용은 ALTER RESOURCE POOL (Transact-SQL)을 참조하세요. 이렇게 하면 MIN_MEMORY_PERCENT가 이를 적용하기 위해 다른 리소스 풀에 메모리 압력을 가하기 때문에 메모리 최적화 테이블에 대해 더욱 예측 가능한 메모리 가용성이 제공됩니다. 메모리 사용 가능성을 보장하고 메모리 부족 상태를 방지하려면 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT의 값이 동일해야 합니다. 커밋된 메모리의 양에 따라 메모리 최적화 테이블에 사용 가능한 메모리의 비율은 아래 메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율 을 참조하세요.
VM 환경에서 작업할 때 자세한 내용은 최선의 구현 방법: VM 환경에서 메모리 내 OLTP 사용 을 참조하세요.
다음 Transact-SQL 코드는 메모리의 절반을 사용할 수 있는 Pool_IMOLTP라는 이름의 리소스 풀을 만듭니다. 풀이 만들어진 후 Pool_IMOLTP를 포함하도록 리소스 관리자가 다시 구성됩니다.
-- set MIN_MEMORY_PERCENT and MAX_MEMORY_PERCENT to the same value
CREATE RESOURCE POOL Pool_IMOLTP
WITH
( MIN_MEMORY_PERCENT = 63,
MAX_MEMORY_PERCENT = 63 );
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
풀에 데이터베이스 바인딩
시스템 함수 sp_xtp_bind_db_resource_pool
를 사용하여 데이터베이스를 리소스 풀에 바인딩합니다. 이 함수는 데이터베이스 이름과 리소스 풀 이름의 2개의 매개 변수를 사용합니다.
다음 Transact-SQL은 데이터베이스 IMOLTP_DB를 리소스 풀 Pool_IMOLTP에 바인딩하는 것을 정의합니다. 데이터베이스를 온라인 상태로 만들기 전까지는 이 바인딩이 적용되지 않습니다.
EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'Pool_IMOLTP'
GO
시스템 함수 sp_xtp_bind_db_resourece_pool은 database_name과 pool_name이라는 두 개의 문자열 매개 변수를 사용합니다.
바인딩 확인
IMOLTP_DB에 대한 리소스 풀 ID를 기록하여 바인딩을 확인합니다. NULL이 아니어야 합니다.
SELECT d.database_id, d.name, d.resource_pool_id
FROM sys.databases d
GO
바인딩 적용
바인딩을 적용하려면 데이터베이스를 리소스 풀에 바인딩한 후 오프라인으로 전환했다가 다시 온라인 상태로 전환해야 합니다. 데이터베이스가 이전에 다른 풀에 바인딩되었던 경우 이 작업은 이전 리소스 풀에서 할당된 메모리를 제거합니다. 그리고 메모리 최적화 테이블 및 인덱스에 대한 메모리 할당은 이제 데이터베이스와 새로 바인딩된 리소스 풀에서 가져옵니다.
USE master
GO
ALTER DATABASE IMOLTP_DB SET OFFLINE
GO
ALTER DATABASE IMOLTP_DB SET ONLINE
GO
USE IMOLTP_DB
GO
이제 데이터베이스가 리소스 풀에 바인딩되었습니다.
기존 풀에서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 변경
서버에 메모리를 더 추가하거나 메모리 최적화 테이블 변경에 필요한 양의 메모리를 추가하는 경우 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 변경해야 할 수 있습니다. 다음 단계에서는 리소스 풀에서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 변경하는 방법을 보여 줍니다. MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT에 사용할 값에 대한 지침은 아래 섹션을 참조하십시오. 자세한 내용은 모범 사례: VM 환경에서 메모리 내 OLTP 사용 항목을 참조하세요.
ALTER RESOURCE POOL
을 사용해서 MIN_MEMORY_PERCENT 및 MAX_MEMORY_PERCENT 값을 모두 변경합니다.ALTER RESOURCE GOVERNOR
를 사용하여 새 값으로 리소스 관리자를 다시 구성합니다.
예제 코드
ALTER RESOURCE POOL Pool_IMOLTP
WITH
( MIN_MEMORY_PERCENT = 70,
MAX_MEMORY_PERCENT = 70 )
GO
-- reconfigure the Resource Governor
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
메모리 최적화 테이블 및 인덱스에 사용 가능한 메모리 비율
메모리 최적화 테이블이 있는 데이터베이스와 SQL Server 워크로드를 동일한 리소스 풀에 매핑하면 Resource Governor는 풀 사용자 간 풀 사용량에 대한 충돌이 발생하지 않도록 메모리 내 OLTP 사용에 대한 내부 임계값을 설정합니다. 일반적으로 메모리 내 OLTP 사용에 대한 임계값은 풀의 약 80%입니다. 다음 표에서는 다양한 메모리 크기에 대한 실제 임계값을 보여 줍니다.
메모리 내 OLTP 데이터베이스의 전용 리소스 풀을 만들 때는 행 버전 및 데이터 증가를 고려한 후 메모리 내 테이블에 필요한 실제 메모리의 양을 예측해야 합니다. 필요한 메모리를 예측했으면 DMV sys.dm_os_sys_info
의 'committed_target_kb' 열에 나타난 대로 SQL 인스턴스의 목표 커밋 메모리 백분율로 리소스 풀을 만듭니다. 예를 들어 인스턴스에서 사용할 수 있는 총 메모리의 40%를 사용하여 리소스 풀 P1을 만들 수 있습니다. 이 40% 중 메모리 내 OLTP 엔진은 메모리 내 OLTP 데이터를 저장하는 데 더 작은 백분율을 사용합니다. 이는 메모리 내 OLTP가 이 풀의 모든 메모리를 사용하지 않도록 하기 위한 것입니다. 더 작은 이 백분율 값은 목표 커밋된 메모리에 따라 달라집니다. 다음 표에서는 OOM 오류가 발생하기 전에 리소스 풀(명명된 리소스 풀 또는 기본값)에서 메모리 내 OLTP 데이터베이스에 사용할 수 있는 메모리에 대해 설명합니다.
목표 커밋된 메모리 | 메모리 내 테이블에서 사용할 수 있는 비율 |
---|---|
<= 8 GB | 70% |
<= 16 GB | 75% |
<= 32 GB | 80% |
<= 96GB | 85% |
>96 GB | 90% |
예를 들어, ‘목표 커밋된 메모리’가 100GB이고 메모리 최적화 테이블과 인덱스에 60GB의 메모리가 필요한 것으로 예측하는 경우, MAX_MEMORY_PERCENT = 67(필요량 60GB / 0.90 = 66.667GB - 67GB로 반올림, 67GB / 설치량 100GB = 67%)인 리소스 풀을 만들어 메모리 내 OLTP 개체에 필요한 60GB를 확보하도록 할 수 있습니다.
데이터베이스가 명명된 리소스 풀에 바인딩되면 다음 쿼리를 사용하여 여러 리소스 풀의 메모리 할당을 확인할 수 있습니다.
SELECT pool_id
, Name
, min_memory_percent
, max_memory_percent
, max_memory_kb/1024 AS max_memory_mb
, used_memory_kb/1024 AS used_memory_mb
, target_memory_kb/1024 AS target_memory_mb
FROM sys.dm_resource_governor_resource_pools
이 샘플 출력은 메모리 최적화 개체가 리소스 풀인 PoolIMOLTP에서 사용하는 메모리가 1356MB이고 상한이 2307MB임을 보여줍니다. 이 상한은 이 풀에 매핑된 사용자 및 시스템 메모리 최적화 개체가 사용할 수 있는 총 메모리를 제어합니다.
샘플 출력
다음은 위에서 만든 데이터베이스 및 테이블의 결과입니다.
pool_id Name min_memory_percent max_memory_percent max_memory_mb used_memory_mb target_memory_mb
----------- ----------- ------------------ ------------------ ------------- -------------- ----------------
1 internal 0 100 3845 125 3845
2 default 0 100 3845 32 3845
259 Pool_IMOLTP 0 100 3845 1356 2307
자세한 내용은 sys.dm_resource_governor_resource_pools(Transact-SQL)를 참조하세요.
데이터베이스를 명명된 리소스 풀에 바인딩하지 않으면 '기본' 풀에 바인딩됩니다. SQL Server는 대부분의 다른 할당에 기본 리소스 풀을 사용하므로 관심 있는 데이터베이스에 대해 DMV sys.dm_resource_governor_resource_pools를 사용하여 메모리 최적화 테이블이 사용하는 메모리를 정확하게 모니터링할 수 없습니다.
참고 항목
sys.sp_xtp_bind_db_resource_pool(Transact-SQL)
sys.sp_xtp_unbind_db_resource_pool(Transact-SQL)
Resource Governor
리소스 관리자 리소스 풀
리소스 풀 만들기
리소스 풀 설정 변경
리소스 풀 삭제