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) GOGenellikle bunlar, sık sık gerçekleşen günlük yedeklemeleri ve dizin bakım işlemleridir.