Partager via


Surveiller et résoudre les problèmes d’utilisation de la mémoire

SQL Server In-Memory OLTP consomme de la mémoire dans des modèles différents des tables sur disque. Vous pouvez surveiller la quantité de mémoire allouée et utilisée par les tables et index optimisés pour la mémoire dans votre base de données à l’aide des vues de gestion dynamique (DMV) ou des compteurs de performance fournis pour la mémoire et le sous-système de ramasse-miettes. Cela vous donne une visibilité au niveau du système et de la base de données et vous permet d’éviter les problèmes en raison de l’épuisement de la mémoire.

Cette rubrique traite de la surveillance de votre utilisation de la mémoire OLTP In-Memory.

Créer un exemple de base de données avec des tables mémoire optimisées

Vous pouvez ignorer cette section si vous disposez déjà d’une base de données avec des tables mémoire optimisées.

Les étapes suivantes créent une base de données avec trois tables mémoire optimisées que vous pouvez utiliser dans le reste de cette rubrique. Dans l’exemple, nous avons mappé la base de données à un pool de ressources afin de pouvoir contrôler la quantité de mémoire que peuvent prendre les tables optimisées en mémoire.

  1. Lancez SQL Server Management Studio.

  2. Cliquez sur Nouvelle requête.

  3. Collez ce code dans la nouvelle fenêtre de requête et exécutez chaque section.

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

Surveillance de l’utilisation de la mémoire

Utilisation de SQL Server Management Studio

SQL Server 2014 est fourni avec des rapports standard intégrés pour surveiller la mémoire consommée par les tables en mémoire. Vous pouvez accéder à ces rapports à l’aide de l’Explorateur d’objets. Vous pouvez également utiliser l’Explorateur d’objets pour surveiller la mémoire consommée par des tables optimisées en mémoire individuelle.

Consommation au niveau de la base de données

Vous pouvez surveiller l’utilisation de la mémoire au niveau de la base de données comme suit.

  1. Lancez SQL Server Management Studio et connectez-vous à un serveur.

  2. Dans l’Explorateur d’objets, cliquez avec le bouton droit sur la base de données sur laquelle vous souhaitez créer des rapports.

  3. Dans le menu contextuel, sélectionnez Rapports ->Rapports standard ->Utilisation de la mémoire par objets optimisés en mémoire

HK_MM_SSMS

Ce rapport montre la consommation de mémoire par la base de données que nous avons créée ci-dessus.

HK_MM_SSMS HK_MM_SSMS

Utilisation de DMV

Il existe un certain nombre de DMV disponibles pour surveiller la mémoire consommée par les tables optimisées en mémoire, les index, les objets système et les structures d’exécution.

Consommation de mémoire par les tables et index mémoire optimisés

Vous pouvez trouver la consommation de mémoire pour toutes les tables utilisateur, index et objets système en interrogeant sys.dm_db_xtp_table_memory_stats comme indiqué ici.

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

Exemple de sortie

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

Pour plus d’informations, consultez sys.dm_db_xtp_table_memory_stats.

Consommation de mémoire par des structures système internes

La mémoire est également consommée par les objets système, comme les structures transactionnelles, les tampons pour les données et les fichiers delta, les structures de ramasse-miettes, etc. Vous pouvez trouver la mémoire utilisée pour ces objets système en interrogeant sys.dm_xtp_system_memory_consumers comme indiqué ici.

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

Exemple de sortie

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

Pour plus d’informations , consultez sys.dm_xtp_system_memory_consumers (Transact-SQL).

Consommation de mémoire au moment de l’exécution lors de l’accès aux tables mémoire optimisées

Vous pouvez déterminer la mémoire consommée par les structures d’exécution, telles que le cache de procédures avec la requête suivante : exécutez cette requête pour obtenir la mémoire utilisée par les structures d’exécution telles que pour le cache de procédure. Toutes les structures d’exécution sont marquées avec XTP.

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

Exemple de sortie

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

Pour plus d’informations, consultez sys.dm_os_memory_objects (Transact-SQL).

Mémoire consommée par In-Memory moteur OLTP sur l’instance

La mémoire allouée au moteur OLTP In-Memory et les objets à mémoire optimisée sont gérés de la même façon que tout autre consommateur de mémoire au sein d’une instance SQL Server. Les gestionnaires de type MEMORYCLERK_XTP représentent toute la mémoire allouée au moteur OLTP In-Memory. Utilisez la requête suivante pour rechercher toutes les mémoires utilisées par le moteur 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’exemple de sortie indique que la mémoire totale allouée est de 18 Mo de consommation de mémoire au niveau du système et de 1358 Mo allouée à l’ID de base de données 5. Étant donné que cette base de données est mappée à un pool de ressources dédié, cette mémoire est prise en compte dans ce pool de ressources.

Exemple de sortie

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

Pour plus d’informations, consultez sys.dm_os_memory_clerks (Transact-SQL).

Gestion de la mémoire consommée par les objets à mémoire optimisée

Vous pouvez contrôler la mémoire totale consommée par les tables optimisées en mémoire en la liant à un pool de ressources nommé, comme décrit dans la rubrique Lier une base de données avec Memory-Optimized tables à un pool de ressources.

Résolution des problèmes de mémoire

La résolution des problèmes de mémoire est un processus en trois étapes :

  1. Identifiez la quantité de mémoire consommée par les objets dans votre base de données ou dans votre instance. Vous pouvez utiliser un ensemble complet d’outils de surveillance disponibles pour les tables mémoire optimisées, comme décrit précédemment. Par exemple, les DMVs sys.dm_db_xtp_table_memory_stats ou sys.dm_os_memory_clerks.

  2. Déterminez comment évolue la consommation de mémoire et combien de marge vous avez encore. En surveillant régulièrement la consommation de mémoire, vous pouvez savoir comment l’utilisation de la mémoire augmente. Par exemple, si vous avez mappé la base de données à un pool de ressources nommé, vous pouvez surveiller le compteur de performances Mémoire utilisée (Ko) pour voir comment l’utilisation de la mémoire augmente.

  3. Prenez des mesures pour atténuer les problèmes de mémoire potentiels. Pour plus d’informations, consultez Résoudre les problèmes de mémoire insuffisante.

Voir aussi

Lier une base de données avec des tables Memory-Optimized à une modification de pool de ressources MIN_MEMORY_PERCENT et MAX_MEMORY_PERCENT sur un pool existant