Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, bellek-iyileştirilmiş tempdb meta veri özelliğiyle ilgili yetersiz bellek sorunlarını çözmek için çözümler sunar.
Belirtiler
Bellek için iyileştirilmiş tempdb meta veriler (HkTempDB) özelliğini etkinleştirdikten sonra, ayırmalar ve SQL Server Hizmeti kilitlenmeleri için bellek yetersiz özel durumlarını belirten 701tempdbgörebilirsiniz. Buna ek olarak, Bellek İçi OLTP (Hekaton) için bellek katibinin MEMORYCLERK_XTP kademeli veya hızlı bir şekilde büyüdüğünü ve geri küçülmediğini görebilirsiniz. XTP belleği üst sınır olmadan büyüdükçe SQL Server'da aşağıdaki hata iletisini görürsünüz:
Bellek kaynak havuzu 'default' içinde yetersiz olduğu için 'tempdb' veritabanı için sayfa ayırmalarına izin verilmiyor. Daha fazla bilgi için '
http://go.microsoft.com/fwlink/?LinkId=510837' bölümüne bakın.
DMV dm_os_memory_clerks üzerinde bir sorgu çalıştırdığınızda, MEMORYCLERK_XTP için ayrılan sayfaların belleğinin yüksek olduğunu görebilirsiniz. Örneğin:
SELECT type, memory_node_id, pages_kb
FROM sys.dm_os_memory_clerks
WHERE type = 'MEMORYCLERK_XTP'
Sonuç.
type memory_node_id pages_kb
------------------------------------------------------------ -------------- --------------------
MEMORYCLERK_XTP 0 60104496
MEMORYCLERK_XTP 64 0
Sorunu tanılama
Sorunu tanılamak üzere veri toplamak için şu adımları izleyin:
Basit bir izleme veya genişletilmiş olay (XEvent) toplayarak iş yükü
tempdbhakkında bilgi sahibi olun ve iş yükünün geçici tablolarda DDL ifadeleri ile uzun süreli açık işlemleri olup olmadığını öğrenin.Daha fazla analiz etmek için aşağıdaki DMV'lerin çıkışını toplayın.
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
Neden ve çözüm
Nedeni doğrulamak için DMV'leri kullanarak sorunun farklı senaryolarını görebilirsiniz. Bu senaryolar aşağıdaki iki kategoriye ayrılabilir. Sorunu çözmek için her senaryo için ilgili çözümü kullanabilirsiniz. Sorunu giderme hakkında daha fazla bilgi için bkz . Bellek için iyileştirilmiş tempdb meta veri belleğini kontrol altında tutmak için azaltma adımları.
XTP bellek tüketiminde kademeli artış
1. Senaryo
DMV tempdb.sys.dm_xtp_system_memory_consumers veya tempdb.sys.dm_db_xtp_memory_consumers , ayrılan baytlar ile kullanılan baytlar arasında büyük bir fark gösterir.
Çözüm: Sorunu çözmek için SQL Server 2019 CU13
sys.sp_xtp_force_gcçalıştırabilirsiniz./* 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_gc2. Senaryo
DMV
tempdb.sys.dm_xtp_system_memory_consumers, bellek tüketici türleriVARHEAPLOOKASIDEve için ayrılan ve kullanılan baytlar için yüksek değerler gösterir.Çözüm: Geçici tablolarda DDL deyimleri içeren uzun süre çalışan açık işlemleri denetleyin ve işlemleri kısa tutarak uygulama tarafından çözümleyin.
Not
Bu sorunu bir test ortamında yeniden oluşturmak için geçici tablolarda Veri Tanım Dili (DDL) deyimlerini kullanarak açık bir işlem oluşturabilir ve diğer etkinlikler gerçekleştiğinde uzun süre açık bırakabilirsiniz.
3. Senaryo
DMV
tempdb.sys.dm_db_xtp_memory_consumers, büyük bir nesne (LOB) ayırıcısında veya tablo yığınında ayrılmış ve kullanılan baytlar için yüksek değerler gösterir; buradaObject_ID,XTP_Object_IDveIndex_IDolurNULL.Çözüm: Sorun 14535149 için SQL Server 2019 CU16'yı uygulayın.
4\. Senaryo
Sürekli büyüyen "VARHEAP\Storage iç yığını" XTP veritabanı bellek tüketicisi bellek yetersiz hatası 41805'e yol açıyor.
Çözüm: SQL Server 17 CU25 ve sonraki sürümlerde zaten tanımlanmış ve çözülmüş 14087445 sorun SQL Server 2019'a geçirilecek şekilde incelenmektedir.
XTP belleğinin tüketiminde ani artış veya hızlı artış
Senaryo 5
DMV
tempdb.sys.dm_db_xtp_memory_consumers, tablo yığınında ayrılan veya kullanılan baytlar için yüksek değerler gösterir; buradaObject_IDdeğildirNULL. Bu sorunun en yaygın nedeni, geçici tablolarda DDL deyimleriyle uzun süre çalışan ve açıkça açık bir işlemdir. Örneğin:BEGIN TRAN CREATE TABLE #T(sn int) … … COMMITGeçici tablolarda DDL deyimleriyle açıkça açık bir işlem, tablo yığınının ve lookaside yığınının meta veriler kullanılarak
tempdbsonraki işlemler için serbest edilmesine izin vermez.Çözüm: Geçici tablolarda DDL deyimleri içeren uzun süre çalışan açık işlemleri denetleyin ve işlemleri kısa tutarak uygulama tarafından çözümleyin.
Bellek için iyileştirilmiş tempdb meta veri belleğini denetim altında tutmak için azaltma adımları
Geçici tablolarda DDL ifadeleri kullanan uzun süreli işlemleri önlemek veya çözmek için genel öneri, işlemleri kısa tutmaktır.
Tempdb ağır iş yüklerinin varlığında yeterli belleğin çalışmasına izin vermek için maksimum sunucu belleğini artırın.
Düzenli aralıklarla çalıştırın
sys.sp_xtp_force_gc.Sunucuyu olası yetersiz bellek koşullarına karşı korumak için tempdb'yi bir Resource Governor kaynak havuzuna bağlayabilirsiniz. Örneğin, kullanarak
MAX_MEMORY_PERCENT = 30bir kaynak havuzu oluşturun. Ardından, kaynak havuzunu bellek için iyileştirilmiş tempdb meta verilerine bağlamak için aşağıdaki ALTER SERVER CONFIGURATION komutunu kullanın.ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON (RESOURCE_POOL = '<PoolName>');Bellek için iyileştirilmiş
tempdbmeta veriler zaten etkin olsa bile bu değişikliğin yeniden başlatılması gerekir. Daha fazla bilgi için bkz.Bellek optimize edilmiş tempdb meta veriyi yapılandırın ve kullanın.
Kaynak Havuzu oluşturun.
Uyarı
HktempDB bir havuza bağlandıktan sonra havuz en yüksek ayarına ulaşabilir ve kullanan
tempdbtüm sorgular yetersiz bellek hatalarıyla başarısız olabilir. Örneğin:'tempdb' veritabanı için sayfa ayırmaları, 'HkTempDB' kaynak havuzundaki yetersiz bellek nedeniyle engelleniyor. Daha fazla bilgi için '
http://go.microsoft.com/fwlink/?LinkId=510837' bölümüne bakın. XTP bellek baskısı nedeniyle sayfa ayırma başarısız oldu: FAIL_PAGE_ALLOCATION 8Belirli durumlarda, bellek yetersiz hatası oluşursa SQL Server hizmeti durabilir. Bunun gerçekleşme olasılığını azaltmak için bellek havuzunun
MAX_MEMORY_PERCENTdeğerini yüksek bir değere ayarlayın.Bellek için iyileştirilmiş
tempdbmeta veri özelliği her iş yükünü desteklemez. Örneğin, uzun süre çalışan geçici tablolarda DDL deyimleriyle açık işlemlerin kullanılması, açıklanan senaryolara yol açar. İş yükünüzde bu tür işlemler varsa ve bunların süresini denetleyemezseniz, bu özellik ortamınız için uygun değildir. kullanmadanHkTempDBönce kapsamlı bir şekilde test etmelisiniz.
Daha Fazla Bilgi
Bu bölümler, bellek için iyileştirilmiş tempdb meta verilerde yer alan bazı bellek bileşenleri hakkında daha fazla ayrıntı sağlar.
Lookaside bellek ayırıcısı
Bellek İçi OLTP'deki Lookaside, hızlı işlem gerçekleştirmeye yardımcı olan bir iş parçacığı yerel bellek ayırıcısıdır. Her iş parçacığı nesnesi, bir lookaside bellek ayırıcıları koleksiyonu içerir. Her iş parçacığıyla ilişkilendirilmiş her bir önbellek, ayırabileceği bellek miktarı konusunda önceden tanımlanmış bir üst sınıra sahiptir. Sınıra ulaşıldığında, iş parçacığı bir taşma durumunda kullanılan paylaşılan bellek havuzundan (VARHEAP) bellek ayırır. DMV sys.dm_xtp_system_memory_consumers , her bir görünüm türü (memory_consumer_type_desc = 'LOOKASIDE') ve paylaşılan bellek havuzu (memory_consumer_type_desc = 'VARHEAP' ve memory_consumer_desc = 'Lookaside heap') için verileri toplar.
Sistem düzeyinde tüketiciler: tempdb.sys.dm_xtp_system_memory_consumers
Üst sınır yaklaşık 25 lookaside bellek tüketici türüdir. İş parçacıklarının bu görünümlerden daha fazla belleğe ihtiyacı olduğunda, bellek lookaside yığınına taşar ve lookaside yığınıyla karşılanır. Kullanılan baytlar için yüksek değerler, sabit ağır tempdb iş yükünün ve/veya geçici nesneler kullanan uzun süre çalışan açık işlemin göstergesi olabilir.
-- 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
Veritabanı düzeyinde tüketiciler: tempdb.sys.dm_db_xtp_memory_consumers
LOB ayırıcısı, sistem tabloları LOB/Satır dışı veriler için kullanılır.
Tablo yığını, sistem tabloları satırları için kullanılır.
Kullanılan baytlar için yüksek değerler, sabit ağır tempdb iş yükünün ve/veya geçici nesneler kullanan uzun süre çalışan açık işlemin göstergesi olabilir.