次の方法で共有


メモリ使用量の監視とトラブルシューティング

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)」を参照してください。

インスタンス全体でインメモリ OLTP エンジンによって消費されるメモリ

インメモリ OLTP エンジンとメモリ最適化オブジェクトに割り当てられたメモリは、SQL Server インスタンス内の他のメモリ コンシューマーと同様に管理されます。 MEMORYCLERK_XTP 型のクラークによって、インメモリ OLTP エンジンに割り当てられたすべてのメモリについて確認できます。 次のクエリを使用して、インメモリ 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%'

サンプル出力は、割り当てられたメモリの合計が 18 MB のシステム レベルのメモリ消費量と、データベース ID 5 に割り当てられた 1358 MB であることを示しています。 このデータベースは専用のリソース プールにマップされるため、このメモリはそのリソース プールに反映されます。

サンプル出力

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_statssys.dm_os_memory_clerksなどです。

  2. メモリ消費がどのように拡大し、どれぐらいの余裕が残されているかを確認します。 メモリ消費を定期的に監視することで、メモリの使用がどのように拡大しているかを確認できます。 たとえば、名前付きリソース プールにデータベースをマップしている場合は、パフォーマンス カウンターの Used Memory (KB) を監視して、メモリの使用量がどのように拡大しているかを確認することができます。

  3. 発生する可能性があるメモリの問題を軽減するアクションを実行します。 詳細については、「メモリ不足の問題の解決」を参照してください。

こちらもご覧ください

Memory-Optimized テーブルを持つデータベースをリソース プールにバインドする既存のプールで MIN_MEMORY_PERCENT と MAX_MEMORY_PERCENT を変更する