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:
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.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 geheugenconsumertypenVARHEAP
enLOOKASIDE
.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 waarbijObject_ID
,XTP_Object_ID
enIndex_ID
zijnNULL
.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 waarbijObject_ID
nietNULL
. 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
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.
Verhoog het maximum aantal servergeheugens zodat er voldoende geheugen kan worden gebruikt in de aanwezigheid van tempdb-zware workloads.
Voer regelmatig uit
sys.sp_xtp_force_gc
.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 8Onder 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.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.
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor