Bu güncelleştirmeyi uyguladıktan sonra, bu değişikliği etkinleştirmek için Trace bayrağı-T8075 ' u başlangıç parametresi olarak eklemeniz gerekir.
Belirtiler
Microsoft SQL Server 2012 'in 64 bit sürümünde bir sorgu çalıştırdığınızda, SQL Server hata günlüğünde aşağıdakine benzer bir bellek yetersiz hata iletisi alırsınız:
Sayfa ayrılamadı: FAIL_PAGE_ALLOCATION 513
Sorgunun yürütmeyi tamamlaması uzun sürer ve SOS_MEMORY_TOPLEVELBLOCKALLOCATOR bekler. Aşağıdaki bilgi noktalarını incelediğinizde, çok az kullanılabilir sanal adres alanı olduğunu fark edebilirsiniz:
-
DBCC MEMORYSTATUS-Process/System Counts 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 8 terabayt (TB) etrafında başlıyor ve biraz daha Kullanılabilir sanal adres alanının çok az olduğu bir aşamada olduğunuzda, bellek ayırmayı gerçekleştirmeye çalışan sorgular da CMEMTHREAD türünün bir 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-Memory Manager bölümü-VM ayrıldı
Bu değerler genellikle "Max Server Memory" değerinin neredeyse 8 TB kadar artar.
Neden
SQL Server işlemi Toplam Server Memory = hedef sunucu belleği = hedef sunucu belleği = Max Server Memory değerine ulaştığında, SQL Server bellek yöneticisinde, yeni ayırmaya izin vermek Böyle bir koşulda tekrarlanan ayırma düzeni, bellek bloklarının parçalanmasına ve sanal adres alanının tüketimine neden olabilir. Bu işlem birçok defa yinelenirse, SQL Server sanal adres alanı tükendi ve yukarıda belirtilen belirtileri fark edebilirsiniz.
Çözüm
Toplu güncelleştirme bilgileri
Sorun ilk olarak SQL Server 'ın aşağıdaki toplu güncelleştirmesinde giderilmiştir.
Her bir SQL Server toplu güncelleştirmesi, önceki toplu güncelleştirmeyle birlikte gelen tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. En son SQL Server güncelleştirmelerini indirip yüklemenizi öneririz:
Bu düzeltme, hem bellek dışında hem de karşılaşabileceğiniz kullanılabilir sanal adres alanının sürekli azalmalarını engeller.
Durum
Microsoft bu sorunun "Aşağıdakilere Uygulanır" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.
Ek Bilgi
-
Windows 2012 R2, sanal adres alanının 128 TB kadar genişmesine olanak tanır. Bu nedenle, Windows 2012 R2 ortamlarında bu sorunla karşılaşabilirsiniz. Daha fazla bilgi için Windows Geliştirme Merkezi 'nde aşağıdaki konuya bakın:Windows ve Windows Server sürümleri Için bellek sınırları
-
Düzeltmeyi uyguladıktan sonra bile sanal adres alanında sürekli büyüme görüyorsanız, Page_allocated genişletilmiş olayı kullanarak hangi sorguların veya işlemlerin büyük miktarda bellek istediğini belirleyebilirsiniz. Örnek bir komut dosyası şuna benzer:
CREATE EVENT SESSION [memory_tracking] ON SERVERADD 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 günlük yedekleri ve Dizin bakımı işlemleri ile sık karşılaşılan operasyonlardır.