다음을 통해 공유


메모리 사용량 모니터링 및 문제 해결

SQL Server In-Memory OLTP는 디스크 기반 테이블과 다른 패턴으로 메모리를 사용합니다. 메모리 및 가비지 수집 하위 시스템에 제공된 DMV 또는 성능 카운터를 사용하여 데이터베이스의 메모리 최적화 테이블 및 인덱스에서 할당하고 사용하는 메모리 양을 모니터링할 수 있습니다. 이렇게 하면 시스템 및 데이터베이스 수준에서 가시성을 제공하고 메모리 소모로 인한 문제를 방지할 수 있습니다.

이 항목에서는 In-Memory OLTP 메모리 사용량 모니터링에 대해 설명합니다.

메모리 최적화 테이블을 사용하여 샘플 데이터베이스 만들기

메모리 최적화 테이블이 있는 데이터베이스가 이미 있는 경우 이 섹션을 건너뛸 수 있습니다.

다음 단계에서는 이 항목의 나머지 부분에서 사용할 수 있는 3개의 메모리 최적화 테이블이 있는 데이터베이스를 만듭니다. 이 예제에서는 메모리 최적화 테이블에서 사용할 수 있는 메모리 양을 제어할 수 있도록 데이터베이스를 리소스 풀에 매핑했습니다.

  1. SQL Server Management Studio를 시작합니다.

  2. 새 쿼리를 클릭합니다.

  3. 이 코드를 새 쿼리 창에 붙여넣고 각 섹션을 실행합니다.

    -- create a database to be used
    CREATE DATABASE IMOLTP_DB
    GO
    
    ALTER DATABASE IMOLTP_DB ADD FILEGROUP IMOLTP_DB_xtp_fg CONTAINS MEMORY_OPTIMIZED_DATA
    ALTER DATABASE IMOLTP_DB ADD FILE( NAME = 'IMOLTP_DB_xtp' , FILENAME = 'C:\Data\IMOLTP_DB_xtp') TO FILEGROUP IMOLTP_DB_xtp_fg;
    GO
    
    USE IMOLTP_DB
    GO
    
    -- create the resoure pool
    CREATE RESOURCE POOL PoolIMOLTP WITH (MAX_MEMORY_PERCENT = 60);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    GO
    
    -- bind the database to a resource pool
    EXEC sp_xtp_bind_db_resource_pool 'IMOLTP_DB', 'PoolIMOLTP'
    
    -- you can query the binding using the catalog view as described here
    SELECT d.database_id
         , d.name
         , d.resource_pool_id
    FROM sys.databases d
    GO
    
    -- take database offline/online to finalize the binding to the resource pool
    USE master
    GO
    
    ALTER DATABASE IMOLTP_DB SET OFFLINE
    GO
    ALTER DATABASE IMOLTP_DB SET ONLINE
    GO
    
    -- create some tables
    USE IMOLTP_DB
    GO
    
    -- create table t1
    CREATE TABLE dbo.t1 (
           c1 int NOT NULL CONSTRAINT [pk_t1_c1] PRIMARY KEY NONCLUSTERED
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    
    -- load t1 150K rows
    DECLARE @i int = 0
    BEGIN TRAN
    WHILE (@i <= 150000)
       BEGIN
          INSERT t1 VALUES (@i, 'a', replicate ('b', 8000))
          SET @i += 1;
       END
    Commit
    GO
    
    -- Create another table, t2
    CREATE TABLE dbo.t2 (
           c1 int NOT NULL CONSTRAINT [pk_t2_c1] PRIMARY KEY NONCLUSTERED
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    
    -- Create another table, t3 
    CREATE TABLE dbo.t3 (
           c1 int NOT NULL CONSTRAINT [pk_t3_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 1000000)
         , c2 char(40) NOT NULL
         , c3 char(8000) NOT NULL
         ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
    GO
    

메모리 사용량 모니터링

SQL Server Management Studio 사용

SQL Server 2014에는 기본 제공 표준 보고서가 제공되어 메모리 내 테이블에서 사용하는 메모리를 모니터링합니다. 개체 탐색기를 사용하여 이러한 보고서에 액세스할 수 있습니다. 개체 탐색기를 사용하여 개별 메모리 최적화 테이블에서 사용하는 메모리를 모니터링할 수도 있습니다.

데이터베이스 수준의 사용량

다음과 같이 데이터베이스 수준에서 메모리 사용을 모니터링할 수 있습니다.

  1. SQL Server Management Studio를 시작하고 서버에 연결합니다.

  2. 개체 탐색기에서 보고서를 얻고자 하는 데이터베이스를 마우스 오른쪽 버튼으로 클릭합니다.

  3. 상황에 맞는 메뉴에서 보고서 ->표준 보고서 ->메모리 최적화 개체별 메모리 사용량 선택

HK_MM_SSMS

이 보고서는 위에서 만든 데이터베이스의 메모리 사용량을 보여줍니다.

HK_MM_SSMS

DMV 사용

메모리 최적화 테이블, 인덱스, 시스템 개체 및 런타임 구조에서 사용하는 메모리를 모니터링하는 데 사용할 수 있는 여러 DMV가 있습니다.

메모리 최적화 테이블 및 인덱스의 메모리 사용량

여기에 표시된 대로 쿼리하여 모든 사용자 테이블, 인덱스 및 시스템 개체에 대한 메모리 사용량을 sys.dm_db_xtp_table_memory_stats 찾을 수 있습니다.

SELECT object_name(object_id) AS Name
     , *
   FROM sys.dm_db_xtp_table_memory_stats

샘플 출력

Name       object_id   memory_allocated_for_table_kb memory_used_by_table_kb memory_allocated_for_indexes_kb memory_used_by_indexes_kb
---------- ----------- ----------------------------- ----------------------- ------------------------------- -------------------------
t3         629577281   0                             0                       128                             0
t1         565577053   1372928                       1200008                 7872                            1942
t2         597577167   0                             0                       128                             0
NULL       -6          0                             0                       2                               2
NULL       -5          0                             0                       24                              24
NULL       -4          0                             0                       2                               2
NULL       -3          0                             0                       2                               2
NULL       -2          192                           25                      16                              16

자세한 내용은 sys.dm_db_xtp_table_memory_stats 참조하세요.

내부 시스템 구조별 메모리 사용량

또한 메모리는 트랜잭션 구조, 데이터 및 델타 파일용 버퍼, 가비지 수집 구조 등과 같은 시스템 개체에서 사용됩니다. 다음과 같이 쿼리하여 이러한 시스템 개체에 사용되는 메모리를 sys.dm_xtp_system_memory_consumers 찾을 수 있습니다.

SELECT memory_consumer_desc
     , allocated_bytes/1024 AS allocated_bytes_kb
     , used_bytes/1024 AS used_bytes_kb
     , allocation_count
   FROM sys.dm_xtp_system_memory_consumers

샘플 출력

memory_consumer_ desc allocated_bytes_kb   used_bytes_kb        allocation_count
------------------------- -------------------- -------------------- ----------------
VARHEAP                   0                    0                    0
VARHEAP                   384                  0                    0
DBG_GC_OUTSTANDING_T      64                   64                   910
ACTIVE_TX_MAP_LOOKAS      0                    0                    0
RECOVERY_TABLE_CACHE      0                    0                    0
RECENTLY_USED_ROWS_L      192                  192                  261
RANGE_CURSOR_LOOKSID      0                    0                    0
HASH_CURSOR_LOOKASID      128                  128                  455
SAVEPOINT_LOOKASIDE       0                    0                    0
PARTIAL_INSERT_SET_L      192                  192                  351
CONSTRAINT_SET_LOOKA      192                  192                  646
SAVEPOINT_SET_LOOKAS      0                    0                    0
WRITE_SET_LOOKASIDE       192                  192                  183
SCAN_SET_LOOKASIDE        64                   64                   31
READ_SET_LOOKASIDE        0                    0                    0
TRANSACTION_LOOKASID      448                  448                  156
PGPOOL:256K               768                  768                  3
PGPOOL: 64K               0                    0                    0
PGPOOL:  4K               0                    0                    0

자세한 내용은 sys.dm_xtp_system_memory_consumers(Transact-SQL)를 참조하세요.

메모리 최적화 테이블에 액세스할 때 런타임에 메모리 사용량

다음 쿼리를 사용하는 프로시저 캐시와 같은 런타임 구조에서 사용되는 메모리를 확인할 수 있습니다. 이 쿼리를 실행하여 프로시저 캐시와 같은 런타임 구조에서 사용되는 메모리를 가져옵니다. 모든 런타임 구조에는 XTP로 태그가 지정됩니다.

SELECT memory_object_address
     , pages_in_bytes
     , bytes_used
     , type
   FROM sys.dm_os_memory_objects WHERE type LIKE '%xtp%'

샘플 출력

memory_object_address pages_ in_bytes bytes_used type
--------------------- ------------------- ---------- ----
0x00000001F1EA8040    507904              NULL       MEMOBJ_XTPDB
0x00000001F1EAA040    68337664            NULL       MEMOBJ_XTPDB
0x00000001FD67A040    16384               NULL       MEMOBJ_XTPPROCCACHE
0x00000001FD68C040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD284040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD302040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD382040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD402040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD482040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD502040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001FD67E040    16384               NULL       MEMOBJ_XTPPROCPARTITIONEDHEAP
0x00000001F813C040    8192                NULL       MEMOBJ_XTPBLOCKALLOC
0x00000001F813E040    16842752            NULL       MEMOBJ_XTPBLOCKALLOC

자세한 내용은 sys.dm_os_memory_objects(Transact-SQL)를 참조하세요.

인스턴스 전반에 걸쳐 In-Memory OLTP 엔진에 의해 소모된 메모리

In-Memory OLTP 엔진 및 메모리 최적화 개체에 할당된 메모리는 SQL Server 인스턴스 내의 다른 메모리 소비자와 동일한 방식으로 관리됩니다. MEMORYCLERK_XTP 유형의 클럭은 In-Memory OLTP 엔진에 할당된 모든 메모리를 차지합니다. 다음 쿼리를 사용하여 In-Memory OLTP 엔진에서 사용하는 모든 메모리를 찾습니다.

-- this DMV accounts for all memory used by the hek_2 engine
SELECT type
     , name
     , memory_node_id
     , pages_kb/1024 AS pages_MB 
   FROM sys.dm_os_memory_clerks WHERE type LIKE '%xtp%'

샘플 출력은 할당된 총 메모리가 18MB 시스템 수준 메모리 사용량이며 데이터베이스 ID 5에 할당된 1358MB임을 보여줍니다. 이 데이터베이스는 전용 리소스 풀에 매핑되므로 이 메모리는 해당 리소스 풀에서 고려됩니다.

샘플 출력

type                 name       memory_node_id pages_MB
-------------------- ---------- -------------- --------------------
MEMORYCLERK_XTP      Default    0              18
MEMORYCLERK_XTP      DB_ID_5    0              1358
MEMORYCLERK_XTP      Default    64             0

자세한 내용은 sys.dm_os_memory_clerks(Transact-SQL)를 참조 하세요.

메모리 최적화 객체가 사용하는 메모리 관리하기

Memory-Optimized 테이블을 사용하여 데이터베이스를 리소스 풀에 바인딩하는 항목에 설명된 대로 명명된 리소스 풀에 바인딩하여 메모리 최적화 테이블에서 사용하는 총 메모리 를 제어할 수 있습니다.

메모리 문제 해결

메모리 문제 해결은 3단계 프로세스입니다.

  1. 데이터베이스 또는 인스턴스의 개체에서 사용 중인 메모리 양을 식별합니다. 앞에서 설명한 대로 메모리 최적화 테이블에 사용할 수 있는 다양한 모니터링 도구 집합을 사용할 수 있습니다. 예를 들어 DMV sys.dm_db_xtp_table_memory_stats 또는 sys.dm_os_memory_clerks.

  2. 메모리 사용량이 증가하는 방법과 남은 헤드룸의 양을 결정합니다. 메모리 사용량을 주기적으로 모니터링하면 메모리 사용량이 증가하는 방식을 알 수 있습니다. 예를 들어 데이터베이스를 명명된 리소스 풀에 매핑한 경우 성능 카운터 KB(사용된 메모리)를 모니터링하여 메모리 사용량이 증가하는 방식을 확인할 수 있습니다.

  3. 잠재적인 메모리 문제를 완화하기 위한 조치를 취합니다. 자세한 내용은 메모리 부족 문제 해결을 참조하세요.

또한 참조하십시오

Memory-Optimized 테이블이 있는 데이터베이스를 리소스 풀변경 MIN_MEMORY_PERCENT 바인딩하고 기존 풀에서 MAX_MEMORY_PERCENT