Delen via


Voor geheugen geoptimaliseerde tempdb-metagegevens (HkTempDB) uit geheugenfouten

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

Symptomen

Nadat u de functie Voor geheugen geoptimaliseerde tempdb metagegevens (HkTempDB) hebt ingeschakeld, ziet u mogelijk de fout 701 die uit de geheugenuitzonderingen voor toewijzingen en crashes van tempdb de SQL Server-service aangeeft. Bovendien ziet u mogelijk dat de geheugenbediende MEMORYCLERK_XTP voor In-Memory OLTP (Hekaton) geleidelijk of snel groeit en niet terugklinkt. Naarmate het XTP-geheugen groeit zonder een bovengrens, ziet u het volgende foutbericht in SQL Server:

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

Wanneer u een query uitvoert op de DMV-dm_os_memory_clerks, kunt u zien dat het toegewezen paginageheugen hoog is voor geheugenbediende.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 inzicht te tempdb krijgen in de workload en kijk of de workload langdurige expliciete transacties met DDL-instructies voor tijdelijke tabellen bevat.

  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

Door de DMV's te gebruiken om de oorzaak te controleren, 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. Voor meer informatie over hoe u het probleem kunt verhelpen, raadpleegt u De oplossingsstappen voor het controleren van geheugengeoptimeerd tempdb-metagegevensgeheugen.

Geleidelijke toename van het 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 nieuwere versie met een nieuwe procedure sys.sp_xtp_force_gc om toegewezen maar ongebruikte bytes vrij te maken.

    Notitie

    Vanaf SQL Server 2022 CU1 moet u de opgeslagen procedure slechts één keer uitvoeren.

    /* 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 van de toepassing op door transacties kort te houden.

    Notitie

    Als u dit probleem in een testomgeving wilt reproduceren, kunt u een expliciete transactie maken met behulp van DDL-instructies (Data Definition Language) voor tijdelijke tabellen en deze gedurende 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 groot object (LOB) allocator of tabel heap waar Object_ID, XTP_Object_IDen Index_ID zijn NULL.

    Oplossing: PAS SQL Server 2019 CU16 toe voor het probleem 14535149.

  • Scenario 4

    Continu groeiende "VARHEAP\Storage interne heap" XTP database geheugen consument leidt tot onvoldoende geheugen fout 41805.

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

Plotselinge piek of snelle toename in 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 waar Object_ID dat niet NULLis. De meest voorkomende oorzaak van dit probleem is een langlopende, expliciet geopende transactie met DDL-instructies voor tijdelijke tabellen. Bijvoorbeeld:

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

    Een expliciet geopende transactie met DDL-instructies voor tijdelijke tabellen staat niet toe dat de tabel heap en lookaside heap 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 van de toepassing op door transacties kort te houden.

Risicobeperkingsstappen om geheugen geoptimaliseerd voor tempdb-metagegevens in controle te houden

  1. Om langlopende transacties die gebruikmaken van DDL-instructies in tijdelijke tabellen te voorkomen of op te lossen, is de algemene richtlijnen om transacties kort te houden.

  2. Verhoog het maximale servergeheugen om voldoende geheugen te laten werken in aanwezigheid van tempdb-zware workloads.

  3. Voer sys.sp_xtp_force_gc regelmatig uit.

  4. Als u de server wilt beschermen tegen mogelijke onvoldoende geheugenomstandigheden, kunt u tempdb binden aan een Resource Governor-resourcegroep. Maak bijvoorbeeld een resourcegroep met behulp van MAX_MEMORY_PERCENT = 30. Gebruik vervolgens de volgende opdracht ALTER SERVER CONFIGURATION om de resourcegroep te binden aan tempdb-metagegevens die zijn geoptimaliseerd voor geheugen.

    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 aan een pool is gekoppeld, kan de pool de maximale instelling bereiken en kunnen query's die worden gebruikt tempdb mislukken met fouten met onvoldoende geheugen. Bijvoorbeeld:

    Toewijzing van paginatoewijzingen voor database tempdb wordt niet toegewezen vanwege onvoldoende geheugen in de resourcegroep HkTempDB. Zie 'http://go.microsoft.com/fwlink/?LinkId=510837' voor meer informatie. XTP mislukte paginatoewijzing 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 op dit probleem wilt verminderen, stelt u de geheugengroep MAX_MEMORY_PERCENT in op een hoge waarde.

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

Meer informatie

Deze secties bevatten meer informatie over enkele geheugenonderdelen die zijn betrokken bij metagegevens die zijn geoptimaliseerd voor tempdb geheugen.

Lookaside memory allocator

Lookaside in In-Memory OLTP is een thread-local memory allocator om snelle transactieverwerking te bereiken. Elk threadobject bevat een verzameling lookaside geheugentoewijzingen. Elke lookaside die aan elke thread is gekoppeld, heeft een vooraf gedefinieerde bovengrens voor hoeveel geheugen het kan toewijzen. Wanneer de limiet is bereikt, wijst de thread geheugen toe aan een gedeelde geheugengroep (VARHEAP). De DMV sys.dm_xtp_system_memory_consumers verzamelt gegevens voor elk lookaside-type (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 lookaside geheugenconsumertypen zijn de bovengrens. Wanneer threads meer geheugen nodig hebben van deze lookasides, loopt het geheugen over naar en is tevreden met lookaside heap. Hoge waarden voor gebruikte bytes kunnen een indicator zijn van constante zware tempdb werkbelasting 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 constante zware tempdb werkbelasting en/of langlopende open transactie die gebruikmaakt van tijdelijke objecten.