Condividi tramite


Monitorare e risolvere i problemi relativi all'utilizzo della memoria

SQL Server In-Memory OLTP utilizza memoria in modelli diversi rispetto alle tabelle basate su disco. È possibile monitorare la quantità di memoria allocata e usata da tabelle e indici ottimizzati per la memoria nel database usando le DMV o i contatori delle prestazioni forniti per la memoria e il sottosistema di Garbage Collection. Ciò offre visibilità sia a livello di sistema che a livello di database e consente di evitare problemi dovuti all'esaurimento della memoria.

Questo argomento illustra il monitoraggio dell'utilizzo della memoria OLTP In-Memory.

Creare un database di esempio con tabelle ottimizzate per la memoria

È possibile ignorare questa sezione se si dispone già di un database con tabelle ottimizzate per la memoria.

La procedura seguente consente di creare un database con tre tabelle ottimizzate per la memoria che è possibile usare nella parte restante di questo argomento. Nell'esempio è stato eseguito il mapping del database a un pool di risorse in modo da poter controllare la quantità di memoria che può essere utilizzata dalle tabelle ottimizzate per la memoria.

  1. Avviare SQL Server Management Studio.

  2. Fare clic su Nuova query.

  3. Incollare questo codice nella nuova finestra di query ed eseguire ogni sezione.

    -- 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
    

Monitoraggio dell'utilizzo della memoria

Uso di SQL Server Management Studio

SQL Server 2014 viene fornito con report standard predefiniti per monitorare la memoria utilizzata dalle tabelle in memoria. È possibile accedere a questi report usando Esplora oggetti. È anche possibile usare Esplora oggetti per monitorare la memoria utilizzata da singole tabelle ottimizzate per la memoria.

Consumo a livello di database

È possibile monitorare l'uso della memoria a livello di database come indicato di seguito.

  1. Avviare SQL Server Management Studio e connettersi a un server.

  2. In Esplora oggetti fare clic con il pulsante destro del mouse sul database in cui si desidera creare report.

  3. Nel menu di scelta rapida selezionare Reports ->Reports standard ->Utilizzo della memoria per oggetti ottimizzati per la memoria

HK_MM_SSMS

Questo report mostra l'utilizzo della memoria dal database creato in precedenza.

HK_MM_SSMS

Utilizzo dei DMV

Sono disponibili numerose DMV per monitorare la memoria utilizzata da tabelle ottimizzate per la memoria, indici, oggetti di sistema e strutture di runtime.

Utilizzo della memoria per tabelle e indici ottimizzati per la memoria

È possibile trovare l'utilizzo della memoria per tutte le tabelle utente, gli indici e gli oggetti di sistema eseguendo sys.dm_db_xtp_table_memory_stats query come illustrato di seguito.

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

Output di esempio

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

Per altre informazioni, vedere sys.dm_db_xtp_table_memory_stats.

Utilizzo della memoria in base alle strutture di sistema interne

La memoria viene utilizzata anche da oggetti di sistema, ad esempio strutture transazionali, buffer per dati e file delta, strutture di raccolta dei rifiuti e altro ancora. È possibile trovare la memoria usata per questi oggetti di sistema eseguendo sys.dm_xtp_system_memory_consumers query come illustrato di seguito.

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

Output di esempio

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

Per altre informazioni, vedere sys.dm_xtp_system_memory_consumers (Transact-SQL).

Utilizzo della memoria in fase di esecuzione durante l'accesso alle tabelle ottimizzate per la memoria

È possibile determinare la memoria utilizzata dalle strutture di runtime, ad esempio la cache delle procedure con la query seguente: eseguire questa query per ottenere la memoria usata dalle strutture di runtime, ad esempio per la cache delle procedure. Tutte le strutture di runtime vengono contrassegnate con XTP.

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

Output di esempio

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

Per altre informazioni, vedere sys.dm_os_memory_objects (Transact-SQL).

Memoria consumata dal motore OLTP In-Memory nell'istanza

La memoria allocata al motore OLTP In-Memory e agli oggetti ottimizzati per la memoria viene gestita come qualsiasi altro consumer di memoria all'interno di un'istanza di SQL Server. Gli impiegati di tipo MEMORYCLERK_XTP si occupano della memoria allocata al motore OLTP In-Memory. Usare la query seguente per trovare tutta la memoria usata dal motore 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%'

L'output di esempio mostra che la memoria totale allocata è di 18 MB di consumo di memoria a livello di sistema e 1358 MB allocati all'ID del database pari a 5. Poiché questo database viene mappato a un pool di risorse dedicato, questa memoria viene accountata in tale pool di risorse.

Output di esempio

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

Per altre informazioni, vedi sys.dm_os_memory_clerks (Transact-SQL).

Gestione della memoria utilizzata dagli oggetti ottimizzati per la memoria

È possibile controllare la memoria totale utilizzata dalle tabelle ottimizzate per la memoria associandola a un pool di risorse denominato, come descritto nell'argomento Associare un database a tabelle Memory-Optimized a un pool di risorse.

Risoluzione dei problemi di memoria

La risoluzione dei problemi di memoria è un processo in tre passaggi:

  1. Identificare la quantità di memoria utilizzata dagli oggetti nel database o nell'istanza. È possibile usare un set completo di strumenti di monitoraggio disponibili per le tabelle ottimizzate per la memoria, come descritto in precedenza. Ad esempio, le DMV sys.dm_db_xtp_table_memory_stats o sys.dm_os_memory_clerks.

  2. Determinare come cresce il consumo di memoria e quanto margine disponibile rimane. Monitorando periodicamente l'utilizzo della memoria, è possibile sapere come aumenta l'utilizzo della memoria. Ad esempio, se è stato eseguito il mapping del database a un pool di risorse denominato, è possibile monitorare il contatore delle prestazioni Memoria usata (KB) per verificare la crescita dell'utilizzo della memoria.

  3. Intervenire per attenuare i potenziali problemi di memoria. Per ulteriori informazioni, vedere Risolvere i problemi di memoria insufficiente.

Vedere anche

Associare un database con Memory-Optimized tabelle a un pool di risorseModificare MIN_MEMORY_PERCENT e MAX_MEMORY_PERCENT in un pool esistente