Freigeben über


Überwachen und Behandeln von Problemen mit der Speicherauslastung

SQL Server In-Memory OLTP verbraucht Arbeitsspeicher in unterschiedlichen Mustern als datenträgerbasierte Tabellen. Mit den für den Arbeitsspeicher und das Garbage Collection-Subsystem bereitgestellten DMVs oder Leistungsindikatoren können Sie die Menge an zugeordnetem und verwendetem Speicher von speicheroptimierten Tabellen und Indizes in Ihrer Datenbank überwachen. Dadurch erhalten Sie sowohl auf System- als auch auf Datenbankebene Sichtbarkeit und können Probleme aufgrund der Speicherauslastung verhindern.

In diesem Thema wird die Überwachung der In-Memory OLTP-Speicherauslastung behandelt.

Erstellen einer Beispieldatenbank mit speicheroptimierten Tabellen

Sie können diesen Abschnitt überspringen, wenn Sie bereits über eine Datenbank mit speicheroptimierten Tabellen verfügen.

Die folgenden Schritte erstellen eine Datenbank mit drei speicheroptimierten Tabellen, die Sie im restlichen Teil dieses Themas verwenden können. Im Beispiel haben wir die Datenbank einem Ressourcenpool zugeordnet, sodass wir steuern können, wie viel Arbeitsspeicher von speicheroptimierten Tabellen belegt werden kann.

  1. Starten Sie SQL Server Management Studio.

  2. Klicken Sie auf "Neue Abfrage".

  3. Fügen Sie diesen Code in das neue Abfragefenster ein, und führen Sie jeden Abschnitt aus.

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

Überwachen der Speicherauslastung

Verwendung von SQL Server Management Studio

SQL Server 2014 wird mit integrierten Standardberichten ausgeliefert, um den von Speichertabellen verbrauchten Speicher zu überwachen. Sie können mithilfe des Objekt-Explorers auf diese Berichte zugreifen. Sie können auch den Objekt-Explorer verwenden, um den von einzelnen speicheroptimierten Tabellen verbrauchten Speicher zu überwachen.

Verbrauch auf Datenbankebene

Sie können die Speichernutzung auf Datenbankebene wie folgt überwachen.

  1. Starten Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit einem Server her.

  2. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Datenbank, zu der Berichte erstellt werden sollen.

  3. Wählen Sie im Kontextmenü Berichte -Standardberichte ->>Speicherauslastung durch speicheroptimierte Objekte aus.

HK_MM_SSMS

In diesem Bericht wird der Speicherverbrauch der oben erstellten Datenbank angezeigt.

HK_MM_SSMS

Verwenden von DMVs

Es stehen eine Reihe von DMVs zur Verfügung, um speicheroptimierte Tabellen, Indizes, Systemobjekte und Laufzeitstrukturen zu überwachen.

Arbeitsspeicherverbrauch durch speicheroptimierte Tabellen und Indizes

Sie können den Arbeitsspeicherverbrauch für alle Benutzertabellen, Indizes und Systemobjekte ermitteln, indem Sie wie hier gezeigt abfragen sys.dm_db_xtp_table_memory_stats .

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

Beispielausgabe

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

Weitere Informationen finden Sie unter sys.dm_db_xtp_table_memory_stats.

Speicherverbrauch durch interne Systemstrukturen

Arbeitsspeicher wird auch von Systemobjekten wie Transaktionsstrukturen, Puffern für Daten und Deltadateien, Garbage Collection-Strukturen und mehr genutzt. Sie finden den für diese Systemobjekte verwendeten Arbeitsspeicher, indem Sie wie hier gezeigt abfragen 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

Beispielausgabe

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

Weitere Informationen finden Sie unter sys.dm_xtp_system_memory_consumers (Transact-SQL).

Arbeitsspeicherverbrauch zur Laufzeit beim Zugriff auf speicheroptimierte Tabellen

Sie können den von Laufzeitstrukturen verbrauchten Arbeitsspeicher ermitteln, z. B. den Prozedurcache mit der folgenden Abfrage: Führen Sie diese Abfrage aus, um den von Laufzeitstrukturen verwendeten Arbeitsspeicher abzurufen, z. B. für den Prozedurcache. Alle Laufzeitstrukturen werden mit XTP markiert.

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

Beispielausgabe

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

Weitere Informationen finden Sie unter sys.dm_os_memory_objects (Transact-SQL).

Der von der In-Memory OLTP-Engine über die Instanz hinweg verbrauchte Arbeitsspeicher

Der dem OLTP-Modul In-Memory zugeordnete Arbeitsspeicher und die speicheroptimierten Objekte werden auf die gleiche Weise verwaltet wie jeder andere Speicherverbraucher in einer SQL Server-Instanz. Die MEMORYCLERK_XTP-Speicherbuchhalter stellen den gesamten Speicher bereit, der dem In-Memory OLTP-Engine zugeordnet ist. Verwenden Sie die folgende Abfrage, um den gesamten Vom In-Memory OLTP-Modul verwendeten Arbeitsspeicher zu finden.

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

Die Beispielausgabe zeigt, dass der zugeordnete Gesamtspeicher 18 MB Arbeitsspeicherverbrauch auf Systemebene und 1358 MB für die Datenbank-ID von 5 beträgt. Da diese Datenbank einem dedizierten Ressourcenpool zugeordnet ist, wird dieser Speicher in diesem Ressourcenpool berücksichtigt.

Beispielausgabe

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

Weitere Informationen finden Sie unter sys.dm_os_memory_clerks (Transact-SQL).

Verwalten des von speicheroptimierten Objekten verbrauchten Arbeitsspeichers

Sie können den gesamt von speicheroptimierten Tabellen verbrauchten Arbeitsspeicher steuern, indem Sie ihn an einen benannten Ressourcenpool binden, wie im Thema "Binden einer Datenbank mit Memory-Optimized Tabellen an einen Ressourcenpool" beschrieben.

Problembehandlung bei Speicherproblemen

Die Behandlung von Speicherproblemen ist ein dreistufiger Prozess:

  1. Identifizieren Sie, wie viel Arbeitsspeicher von den Objekten in der Datenbank oder Instanz beansprucht wird. Sie können eine vielzahl von Überwachungstools verwenden, die für speicheroptimierte Tabellen verfügbar sind, wie zuvor beschrieben. Zum Beispiel die DMVs sys.dm_db_xtp_table_memory_stats oder sys.dm_os_memory_clerks.

  2. Bestimmen Sie, wie der Arbeitsspeicherverbrauch wächst und wie viel Spielraum Sie noch haben. Indem Sie die Speicherauslastung regelmäßig überwachen, können Sie wissen, wie die Speichernutzung wächst. Wenn Sie die Datenbank z. B. einem benannten Ressourcenpool zugeordnet haben, können Sie den Leistungsindikator "Verwendeter Arbeitsspeicher (KB)" überwachen, um zu sehen, wie die Speicherauslastung wächst.

  3. Ergreifen Sie Maßnahmen, um die potenziellen Speicherprobleme zu mindern. Weitere Informationen finden Sie unter Beheben von Speicherproblemen.

Siehe auch

Bind eine Datenbank mit Memory-Optimized Tabellen an einen RessourcenpoolÄndern Sie MIN_MEMORY_PERCENT und MAX_MEMORY_PERCENT in einem vorhandenen Pool