Поделиться через


Мониторинг и устранение неполадок использования памяти

SQL Server In-Memory OLTP использует память в разных шаблонах, отличных от таблиц на основе дисков. Объем памяти, выделенный и используемый оптимизированными для памяти таблицами и индексами в базе данных, можно отслеживать с помощью динамических административных представлений или счетчиков производительности, предоставляемых для памяти и подсистемы сборки мусора. Это обеспечивает видимость на уровне системы и базы данных и позволяет предотвратить проблемы из-за нехватки памяти.

В этом разделе рассматривается мониторинг использования памяти OLTP In-Memory.

Создание примера базы данных с оптимизированными для памяти таблицами

Этот раздел можно пропустить, если у вас уже есть база данных с оптимизированными для памяти таблицами.

Следующие шаги по созданию базы данных с тремя оптимизированными для памяти таблицами, которые можно использовать в оставшейся части этого раздела. В примере мы сопоставили базу данных с пулом ресурсов, чтобы управлять количеством памяти, используемой таблицами, оптимизированными для обработки памяти.

  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

В этом отчете показано потребление памяти базой данных, созданной выше.

HK_MM_SSMS

Использование динамических административных представлений

Существует ряд динамических представлений, доступных для мониторинга памяти, используемой оптимизированными для памяти таблицами, индексами, системными объектами и структурами времени выполнения.

Потребление памяти оптимизированными для памяти таблицами и индексами

Вы можете найти потребление памяти для всех пользовательских таблиц, индексов и системных объектов, выполнив запрос 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 In-Memory во всем экземпляре

Память, выделенная подсистеме OLTP In-Memory, и оптимизированные для памяти объекты управляются так же, как и любой другой потребитель памяти в экземпляре SQL Server. Менеджеры памяти типа MEMORYCLERK_XTP учитывают всю память, выделенную для движка OLTP In-Memory. Используйте следующий запрос, чтобы найти всю память, используемую подсистемой OLTP In-Memory.

-- 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 МБ системного уровня потребления памяти и 1358 МБ, выделенные для идентификатора базы данных 5. Так как эта база данных сопоставляется с выделенным пулом ресурсов, эта память учитывается в этом пуле ресурсов.

Образец вывода

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 таблицами к пулу ресурсов".

Устранение неполадок с памятью

Устранение неполадок с памятью — это три этапа.

  1. Определите, сколько памяти потребляется объектами в базе данных или экземпляре. Вы можете использовать широкий набор средств мониторинга, доступных для оптимизированных для памяти таблиц, как описано ранее. Например, DMVs sys.dm_db_xtp_table_memory_stats или sys.dm_os_memory_clerks.

  2. Определите, как увеличивается потребление памяти и сколько свободного объема памяти у вас осталось. Периодически отслеживая потребление памяти, вы можете узнать, как растет использование памяти. Например, если база данных сопоставлена с именованным пулом ресурсов, можно отслеживать счетчик производительности, используемый памятью (КБ), чтобы узнать, как растет использование памяти.

  3. Выполните действия, чтобы устранить потенциальные проблемы с памятью. Дополнительные сведения см. в разделе "Устранение проблем с нехваткой памяти".

См. также

Привязка базы данных с Memory-Optimized таблицами к пулу ресурсовИзменение параметров MIN_MEMORY_PERCENT и MAX_MEMORY_PERCENT в существующем пуле