KB3074434 - DÜZELTME: SQL Server işleminin sanal adres alanı kullanılabilir bellek miktarı çok düşük olduğunda yetersiz bellek hatası

Uygulandığı Öğe
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Bu güncelleştirmeyi uyguladıktan sonra, bu değişikliği etkinleştirmek için izleme bayrağı -T8075'i başlangıç parametresi olarak eklemeniz gerekir.

Belirtiler

Microsoft SQL ServerSQL Server 2012'nin 64 bit sürümünde bir sorgu çalıştırdığınızda, SQL ServerSQL Server hata günlüğündeki aşağıdakine benzer bir yetersiz bellek hata iletisi alırsınız:

Not

Sayfa ayrılamadı: FAIL_PAGE_ALLOCATION 513

Sorguların yürütülmesi uzun zaman alır ve SOS_MEMORY_TOPLEVELBLOCKALLOCATOR beklemelerle karşılaşılır.

Aşağıdaki bilgi noktalarını incelediğinizde, çok düşük kullanılabilir sanal adres alanı olduğunu görürsünüz:

  • DBCC MEMORYSTATUS - İşlem/Sistem Sayıları bölümü - Kullanılabilir Sanal Bellek
  • DMV: sys.dm_os_process_memory - sütun virtual_address_space_available_kb

Bu değerler bir x64 işleminde yaklaşık 8 terabayt (TB) ile başlar ve tırmanmaya devam ederek birkaç gigabayta (GB) ulaşır. 

Kullanılabilir sanal adres alanının çok düşük olduğu aşamadayken, bellek ayırma gerçekleştirmeye çalışan sorgular da bir CMEMTHREAD bekleme türüyle karşılaşabilir.

Aşağıdaki veri noktaları zamanla artmaya devam edecektir:

  • DMV: sys.dm_os_process_memory ve sys.dm_os_memory_nodes - sütun virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - Bellek Yöneticisi bölümü - VM Ayrılmış

Bu değerler genellikle "maksimum sunucu belleği" değerinin katları olarak neredeyse 8 TB'a kadar yükselir.

Neden

SQL Server işlemi Toplam Sunucu Belleği = Hedef Sunucu Belleği = maksimum sunucu belleği durumuna ulaştığında, SQL Server bellek yöneticisinde yeni ayırmaların geçici olarak başarılı olması için birden fazla 8 KB'lık sayfa istemesine izin veren ilkeler vardır. Bu koşul altında tekrarlanan ayırma modeli, bellek bloklarının parçalanmasına ve sanal adres alanının tüketilmesine neden olabilir. Bu işlem birçok kez yinelenirse, SQL Server sanal adres alanı tükenir ve daha önce bahsedilen belirtileri fark edersiniz.

Çözüm

Toplu güncelleştirme bilgileri

Sorun ilk olarak aşağıdaki toplu SQL Server güncelleştirmesinde düzeltilmiştir.

Öneri: SQL Server için en son toplu güncelleştirmeyi yükleyin

SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmeye dahil edilen tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. SQL Server için en son toplu güncelleştirmeleri indirip yüklemenizi öneririz:

Bu düzeltme, bellek yetersizliğini ve karşılaşabileceğiniz kullanılabilir sanal adres alanının sürekli olarak azaltılmasını önler.

Durum

Microsoft bunun, "Şunlar için geçerlidir" bölümünde listelenen Microsoft ürünlerinde sorun olduğunu doğrulamıştır.

Daha Fazla Bilgi

  • Windows 2012 R2, sanal adres alanının 128 TB'a kadar büyümesine izin verir. Dolayısıyla, Windows 2012 R2 ortamlarında bu sorunla karşılaşmayabilirsiniz. Daha fazla bilgi için Windows Geliştirme Merkezi'ndeki aşağıdaki konuya bakın:

    Windows için bellek sınırları ve Windows ServerWindows Server sürümleri

  • Düzeltmeyi uyguladıktan sonra bile sanal adres alanında sürekli büyüme görüyorsanız, Page_allocated genişletilmiş olayını kullanarak hangi sorguların veya işlemlerin büyük bellek parçaları istediğini belirleyebilirsiniz. Örnek bir betik şuna benzer:

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD EVENT sqlos.page_allocated(
        ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text)
        WHERE ([number_pages]>(1)))
    ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
    GO
    
    
    

    Genellikle bunlar, sık sık gerçekleşen günlük yedeklemeleri ve dizin bakım işlemleridir.