Geheugengeoptimeerde tempdb-metagegevens (HkTempDB) geheugenfouten

Dit artikel bevat oplossingen voor het oplossen van problemen met onvoldoende geheugen met betrekking tot de functie voor voor geheugen geoptimaliseerde tempdb metagegevens.

Symptomen

Nadat u de functie voor voor geheugen geoptimaliseerde tempdb metagegevens (HkTempDB) hebt ingeschakeld, ziet u mogelijk de fout 701 die aangeeft dat er uitzonderingen voor onvoldoende geheugen zijn voor tempdb toewijzingen en SQL Server Service vastloopt. Bovendien ziet u mogelijk dat de geheugenmedewerker MEMORYCLERK_XTP voor In-Memory OLTP (Hekaton) geleidelijk of snel groeit en niet terugklinkt. Naarmate het XTP-geheugen toeneemt zonder bovengrens, ziet u het volgende foutbericht in SQL Server:

Toewijzing van paginatoewijzingen voor database 'tempdb' wordt ongedaan gemaakt vanwege onvoldoende geheugen in de resourcegroep 'default'. Zie 'http://go.microsoft.com/fwlink/?LinkId=510837' voor meer informatie.

Wanneer u een query uitvoert op de DMV-dm_os_memory_clerks, ziet u dat het toegewezen geheugen van pagina's hoog is voor geheugenmedewerker MEMORYCLERK_XTP. Bijvoorbeeld:

SELECT type, memory_node_id, pages_kb 
FROM sys.dm_os_memory_clerks
WHERE type = 'MEMORYCLERK_XTP'

Resultaat:

type                    memory_node_id                     pages_kb
------------------------------------------------------------ -------------- --------------------
MEMORYCLERK_XTP         0                                  60104496
MEMORYCLERK_XTP         64                                 0

Het probleem vaststellen

Voer de volgende stappen uit om gegevens te verzamelen om het probleem vast te stellen:

  1. Verzamel een lichtgewicht tracering of uitgebreide gebeurtenis (XEvent) om de workload te begrijpen tempdb en te achterhalen of de workload langlopende expliciete transacties heeft met DDL-instructies voor tijdelijke tabellen.

  2. Verzamel de uitvoer van de volgende DMV's om verder te analyseren.

    SELECT * FROM sys.dm_os_memory_clerks
    SELECT * FROM sys.dm_exec_requests
    SELECT * FROM sys.dm_exec_sessions
    
    -- from tempdb
    SELECT * FROM tempdb.sys.dm_xtp_system_memory_consumers 
    SELECT * FROM tempdb.sys.dm_db_xtp_memory_consumers
    
    SELECT * FROM tempdb.sys.dm_xtp_transaction_stats
    SELECT * FROM tempdb.sys.dm_xtp_gc_queue_stats
    SELECT * FROM tempdb.sys.dm_db_xtp_object_stats
    
    SELECT * FROM tempdb.sys.dm_db_xtp_transactions
    SELECT * FROM tempdb.sys.dm_tran_session_transactions
    SELECT * FROM tempdb.sys.dm_tran_database_transactions
    SELECT * FROM tempdb.sys.dm_tran_active_transactions
    

Oorzaak en oplossing

Als u de DMV's gebruikt om de oorzaak te verifiëren, ziet u mogelijk verschillende scenario's van het probleem. Deze scenario's kunnen worden onderverdeeld in de volgende twee categorieën. U kunt het probleem oplossen door de bijbehorende oplossing voor elk scenario te gebruiken. Zie Stappen voor beperking om geheugengeoptimeerd tempdb-metagegevensgeheugen onder controle te houden voor meer informatie over het oplossen van het probleem.

Geleidelijke toename van XTP-geheugenverbruik

  • Scenario 1

    De DMV tempdb.sys.dm_xtp_system_memory_consumers of tempdb.sys.dm_db_xtp_memory_consumers toont een groot verschil tussen toegewezen bytes en gebruikte bytes.

    Oplossing: u kunt het probleem oplossen door de volgende opdrachten uit te voeren in SQL Server 2019 CU13, SQL Server 2022 CU1 of een latere versie met een nieuwe procedure sys.sp_xtp_force_gc voor het vrijmaken van toegewezen maar ongebruikte bytes.

    Opmerking

    Vanaf SQL Server 2022 CU1 hoeft u de opgeslagen procedure slechts eenmaal uit te voeren.

    /* Yes, 2 times for both*/
    EXEC sys.sp_xtp_force_gc 'tempdb'
    GO
    EXEC sys.sp_xtp_force_gc 'tempdb'
    GO
    EXEC sys.sp_xtp_force_gc
    GO
    EXEC sys.sp_xtp_force_gc
    
  • Scenario 2

    De DMV tempdb.sys.dm_xtp_system_memory_consumers toont hoge waarden voor toegewezen en gebruikte bytes voor geheugenconsumertypen VARHEAP en LOOKASIDE.

    Oplossing: controleer op langlopende expliciete transacties met betrekking tot DDL-instructies in tijdelijke tabellen en los deze op vanuit de toepassingszijde door transacties kort te houden.

    Opmerking

    Als u dit probleem wilt reproduceren in een testomgeving, kunt u een expliciete transactie maken met behulp van DDL-instructies (Data Definition Language) op tijdelijke tabellen en deze lange tijd open laten wanneer andere activiteiten plaatsvinden.

  • Scenario 3

    De DMV tempdb.sys.dm_db_xtp_memory_consumers toont hoge waarden voor toegewezen en gebruikte bytes in een lob-allocator (large object) of tabel heap waarbij Object_ID, XTP_Object_IDen Index_ID zijn NULL.

    Oplossing: pas SQL Server 2019 CU16 toe op het probleem 14535149.

  • Scenario 4

    De continu groeiende 'VARHEAP\Storage internal heap' XTP-databasegeheugenconsumer leidt tot geheugenfout 41805.

    Oplossing: Het probleem 14087445 al geïdentificeerd en opgelost in SQL Server 17 CU25 en latere versies, wordt onderzocht om te worden overgedragen naar SQL Server 2019.

Plotselinge piek of snelle toename van XTP-geheugenverbruik

  • Scenario 5

    De DMV tempdb.sys.dm_db_xtp_memory_consumers toont hoge waarden voor toegewezen of gebruikte bytes in een tabel heap waarbij Object_ID niet NULL. De meest voorkomende oorzaak van dit probleem is een langlopende, expliciet geopende transactie met DDL-instructies op tijdelijke tabellen. Bijvoorbeeld:

    BEGIN TRAN
        CREATE TABLE #T(sn int)
        …
        …
    COMMIT
    

    Een expliciet geopende transactie met DDL-instructies in tijdelijke tabellen staat niet toe dat de heap en lookaside heap van de tabel worden vrijgemaakt voor volgende transacties met behulp van tempdb metagegevens.

    Oplossing: controleer op langlopende expliciete transacties met betrekking tot DDL-instructies in tijdelijke tabellen en los deze op vanuit de toepassingszijde door transacties kort te houden.

Risicobeperkingsstappen om geheugengeoptimeerd tempdb-metagegevensgeheugen onder controle te houden

  1. Als u langlopende transacties wilt voorkomen of oplossen die gebruikmaken van DDL-instructies in tijdelijke tabellen, is de algemene richtlijn om transacties kort te houden.

  2. Verhoog het maximum aantal servergeheugens zodat er voldoende geheugen kan worden gebruikt in de aanwezigheid van tempdb-zware workloads.

  3. Voer regelmatig uit sys.sp_xtp_force_gc .

  4. Om de server te beschermen tegen mogelijk onvoldoende geheugen, kunt u tempdb binden aan een Resource Governor resourcegroep. Maak bijvoorbeeld een resourcegroep met behulp van MAX_MEMORY_PERCENT = 30. Gebruik vervolgens de volgende ALTER SERVER CONFIGURATION-opdracht om de resourcegroep te verbinden met voor geheugen geoptimaliseerde tempdb-metagegevens.

    ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON (RESOURCE_POOL = '<PoolName>');
    

    Voor deze wijziging moet opnieuw worden opgestart, zelfs als voor geheugen geoptimaliseerde tempdb metagegevens al zijn ingeschakeld. Zie voor meer informatie:

    Waarschuwing

    Nadat hktempDB is gebonden aan een pool, bereikt de groep mogelijk de maximale instelling en kunnen query's die worden gebruikt tempdb mislukken met fouten in het geheugen. Bijvoorbeeld:

    Toewijzing van paginatoewijzingen voor database 'tempdb' wordt ongedaan gemaakt vanwege onvoldoende geheugen in de resourcegroep HkTempDB. Zie 'http://go.microsoft.com/fwlink/?LinkId=510837' voor meer informatie. XTP-paginatoewijzing is mislukt vanwege geheugendruk: FAIL_PAGE_ALLOCATION 8

    Onder bepaalde omstandigheden kan de SQL Server-service mogelijk stoppen als er een fout met onvoldoende geheugen optreedt. Als u de kans hierop wilt verkleinen, stelt u de geheugengroep MAX_MEMORY_PERCENT in op een hoge waarde.

  5. De functie voor geoptimaliseerde tempdb metagegevens biedt geen ondersteuning voor elke workload. Het gebruik van expliciete transacties met DDL-instructies voor tijdelijke tabellen die lang worden uitgevoerd, leidt bijvoorbeeld tot de beschreven scenario's. Als u dergelijke transacties in uw workload hebt en u de duur ervan niet kunt bepalen, is deze functie mogelijk niet geschikt voor uw omgeving. U moet uitgebreid testen voordat u .HkTempDB

Meer informatie

In deze secties vindt u meer informatie over enkele geheugenonderdelen die betrokken zijn bij metagegevens die zijn geoptimaliseerd tempdb voor geheugen.

Lookaside-geheugentoewijzing

Lookaside in In-Memory OLTP is een thread-lokale geheugentoewijzing voor snelle transactieverwerking. Elk thread-object bevat een verzameling aan de achterzijde van geheugentoewijzingen. Elke lookaside die aan elke thread is gekoppeld, heeft een vooraf gedefinieerde bovengrens voor de hoeveelheid geheugen die kan worden toegewezen. Wanneer de limiet is bereikt, wijst de thread geheugen toe vanuit een overloopgroep voor gedeeld geheugen (VARHEAP). De DMV sys.dm_xtp_system_memory_consumers verzamelt gegevens voor elk type lookaside (memory_consumer_type_desc = 'LOOKASIDE') en de gedeelde geheugengroep (memory_consumer_type_desc = 'VARHEAP' en memory_consumer_desc = 'Lookaside heap').

Gebruikers op systeemniveau: tempdb.sys.dm_xtp_system_memory_consumers

Ongeveer 25 typen consumenten van uiterlijk geheugen zijn de bovengrens. Wanneer threads meer geheugen van die lookasides nodig hebben, loopt het geheugen over naar en is het tevreden met lookaside heap. Hoge waarden voor gebruikte bytes kunnen een indicator zijn van een constante zware tempdb workload en/of langlopende open transactie die gebruikmaakt van tijdelijke objecten.

-- system memory consumers @ instance  
SELECT memory_consumer_type_desc, memory_consumer_desc, allocated_bytes, used_bytes
FROM sys.dm_xtp_system_memory_consumers 
memory_consumer_type_desc     memory_consumer_desc                   allocated_bytes      used_bytes
------------------------- ------------------------------------------ -------------------- --------------------
VARHEAP                       Lookaside heap                             0                    0
PGPOOL                        256K page pool                             0                    0
PGPOOL                        4K page pool                               0                    0
VARHEAP                       System heap                                458752               448000
LOOKASIDE                     Transaction list element                   0                    0
LOOKASIDE                     Delta tracker cursor                       0                    0
LOOKASIDE                     Transaction delta tracker                  0                    0
LOOKASIDE                     Creation Statement Id Map Entry            0                    0
LOOKASIDE                     Creation Statement Id Map                  0                    0
LOOKASIDE                     Log IO proxy                               0                    0
LOOKASIDE                     Log IO completion                          0                    0
LOOKASIDE                     Sequence object insert row                 0                    0
LOOKASIDE                     Sequence object map entry                  0                    0
LOOKASIDE                     Sequence object values map                 0                    0
LOOKASIDE                     Redo transaction map entry                 0                    0
LOOKASIDE                     Transaction recent rows                    0                    0
LOOKASIDE                     Heap cursor                                0                    0
LOOKASIDE                     Range cursor                               0                    0
LOOKASIDE                     Hash cursor                                0                    0
LOOKASIDE                     Transaction dependent ring buffer          0                    0
LOOKASIDE                     Transaction save-point set entry           0                    0
LOOKASIDE                     Transaction FK validation sets             0                    0
LOOKASIDE                     Transaction partially-inserted rows set    0                    0
LOOKASIDE                     Transaction constraint set                 0                    0
LOOKASIDE                     Transaction save-point set                 0                    0
LOOKASIDE                     Transaction write set                      0                    0
LOOKASIDE                     Transaction scan set                       0                    0
LOOKASIDE                     Transaction read set                       0                    0
LOOKASIDE                     Transaction                                0                    0

Gebruikers op databaseniveau: tempdb.sys.dm_db_xtp_memory_consumers

  • LOB-allocator wordt gebruikt voor systeemtabellen LOB-/off-row-gegevens.

  • Tabel heap wordt gebruikt voor systeemtabellen rijen.

Hoge waarden voor gebruikte bytes kunnen de indicator zijn van een constante zware tempdb werkbelasting en/of langlopende open transactie die gebruikmaakt van tijdelijke objecten.