Aracılığıyla paylaş


Bellek için iyileştirilmiş tempdb meta verileri (HkTempDB) yetersiz bellek hataları

Bu makalede, bellek için iyileştirilmiş tempdb meta veri özelliğiyle ilgili yetersiz bellek sorunlarını gidermeye yönelik çözümler sağlanır.

Belirtiler

Bellek için iyileştirilmiş tempdb meta veriler (HkTempDB) özelliğini etkinleştirdikten sonra, ayırmalar ve SQL Server Hizmeti kilitlenmeleri için tempdb yetersiz bellek özel durumlarını belirten 701 hatasını görebilirsiniz. Buna ek olarak, In-Memory 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 aşağıdaki hata iletisini görürsünüz:

'varsayılan' kaynak havuzundaki yetersiz bellek nedeniyle 'tempdb' veritabanı için sayfa ayırmalarına izin verilemiyor. http://go.microsoft.com/fwlink/?LinkId=510837Daha fazla bilgi için '' bölümüne bakın.

DMVdm_os_memory_clerks bir sorgu çalıştırdığınızda ayrılan sayfaların bellek katibi MEMORYCLERK_XTPiçin 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:

  1. İş yükünü anlamak tempdb için basit bir izleme veya genişletilmiş olay (XEvent) toplayın ve iş yükünün geçici tablolarda DDL deyimleriyle uzun süre çalışan açık işlemleri olup olmadığını öğrenin.

  2. 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 hafifletme 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 aşamalı artış

  • Senaryo 1

    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, SQL Server2022 CU1 veya ayrılmış ancak kullanılmayan baytları boşaltmaya yönelik yeni bir yordama sys.sp_xtp_force_gc sahip sonraki bir sürümde aşağıdaki komutları çalıştırabilirsiniz.

    Not

    SQL Server 2022 CU1'den başlayarak saklı yordamı yalnızca bir kez yürütmeniz gerekir.

    /* 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
    
  • Senaryo 2

    DMV tempdb.sys.dm_xtp_system_memory_consumers , bellek tüketici türleri VARHEAPLOOKASIDEve için ayrılan ve kullanılan baytlar için yüksek değerler gösterir.

    Çözüm: Geçici tablolarda DDL deyimlerini 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 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.

  • Senaryo 3

    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; burada Object_ID, XTP_Object_IDve Index_ID olur NULL.

    Çözüm: Sorun 14535149 için SQL Server 2019 CU16'yı uygulayın.

  • Senaryo 4

    Sürekli büyüyen "VARHEAP\Storage iç yığını" XTP veritabanı bellek tüketicisi bellek yetersiz hatası 41805'e yol açar.

    Çözüm: SQL Server17 CU25 ve sonraki sürümlerde zaten tanımlanmış ve çözülmüş 14087445 sorun SQL Server 2019'a geçirilecek şekilde incelenmektedir.

XTP bellek tüketiminde ani ani artış veya hızlı artış

  • Senaryo 5

    DMV tempdb.sys.dm_db_xtp_memory_consumers , olmayan bir tablo yığınında Object_IDNULLayrılan veya kullanılan baytlar için yüksek değerler gösterir. 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)
        …
        …
    COMMIT
    

    Geçici tablolarda DDL deyimlerine sahip açıkça açık bir işlem, tablo yığınının ve lookaside yığınının meta veriler kullanılarak tempdb sonraki işlemler için serbest edilmesine izin vermez.

    Çözüm: Geçici tablolarda DDL deyimlerini 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 kontrol altında tutmak için azaltma adımları

  1. Geçici tablolarda DDL deyimlerini kullanan uzun süre çalışan işlemlerden kaçınmak veya çözmek için genel kılavuz işlemleri kısa tutmaktır.

  2. 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.

  3. Düzenli aralıklarla çalıştırın sys.sp_xtp_force_gc .

  4. 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ş tempdb meta veriler zaten etkin olsa bile bu değişikliğin etkili olması için yeniden başlatma gerekir. Daha fazla bilgi için bkz.:

    Uyarı

    HktempDB bir havuza bağlandıktan sonra havuz en yüksek ayarına ulaşabilir ve kullanan tempdb tüm sorgular yetersiz bellek hatalarıyla başarısız olabilir. Örneğin:

    'HkTempDB' kaynak havuzundaki yetersiz bellek nedeniyle 'tempdb' veritabanı için sayfa ayırmalarına izin verilemiyor. http://go.microsoft.com/fwlink/?LinkId=510837Daha fazla bilgi için '' bölümüne bakın. XTP bellek baskısı nedeniyle sayfa ayırma işlemi başarısız oldu: FAIL_PAGE_ALLOCATION 8

    Bazı durumlarda, bellek yetersiz hatası oluşursa SQL Server hizmeti durdurulabilir. Bunun olma olasılığını azaltmak için bellek havuzunun MAX_MEMORY_PERCENT değerini yüksek bir değere ayarlayın.

  5. Bellek için iyileştirilmiş tempdb meta veriler ö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 sürelerini denetleyemezseniz, bu özellik ortamınız için uygun değildir. kullanmadan HkTempDBö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ı

In-Memory OLTP'deki Lookaside, hızlı işlem işlemeye yardımcı olan iş parçacığı yerel bellek ayırıcısıdır. Her iş parçacığı nesnesi, bir lookaside bellek ayırıcı koleksiyonu içerir. Her iş parçacığıyla ilişkili her lookaside, ayrılabileceği bellek miktarı üzerinde önceden tanımlanmış bir üst sınıra sahiptir. Sınıra ulaşıldığında, iş parçacığı bir paylaşımlı bellek havuzundan (VARHEAP) bellek ayırır. DMV sys.dm_xtp_system_memory_consumers , her lookaside 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

Yaklaşık 25 benzer bellek tüketici türü üst sınırdır. İş parçacıklarının bu görünümlerden daha fazla belleğe ihtiyacı olduğunda, bellek üzerine dökülür ve lookaside yığınından memnun olur. 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ı, 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.