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:
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.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 geheugenconsumertypenVARHEAP
enLOOKASIDE
.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 waarObject_ID
,XTP_Object_ID
enIndex_ID
zijnNULL
.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 waarObject_ID
dat nietNULL
is. 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
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.
Verhoog het maximale servergeheugen om voldoende geheugen te laten werken in aanwezigheid van tempdb-zware workloads.
Voer
sys.sp_xtp_force_gc
regelmatig uit.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 8Onder 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.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 uHkTempDB
.
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.