SQL Server 2005: Bu sorguyu çalıştırmak için yeterli sistem belleği yok


13

Uzun süredir (yıl) istikrarlı çalışan SQL Sunucularımızdan biri, son zamanlarda yetersiz bellek hataları atıyor. Uygulama Olay Günlüğünde şunları görüyoruz:

Olay Kimliği: 701

Açıklama: Bu sorguyu çalıştırmak için yeterli sistem belleği yok.

Bu sunucuyu yöneten ekibimiz çoğunlukla sysadmin görevlerini ikiye katlayan geliştiricilerden oluşur. Ancak, birincil uzmanlığımız gelişimdir. Bununla birlikte, bu sorunu nasıl gidereceğimiz konusunda bir kayıptayız. Forumları ve neyi aradık ve eşleşen hiçbir şey bulamadık

Bu nedenle, sorun gidermeye yardımcı olacak bazı ayrıntılar:

  • Minimum sunucu belleğimiz 0 olarak ayarlanmıştır.
  • Maksimum sunucu belleğimiz 2000 olarak ayarlanmıştır.
  • Toplam Fiziksel Bellek 3.325.85 MB'dir (sysinfo'dan).
  • Toplam Sanal Bellek 7.10 GB'dir (sysinfo'dan).
  • Bellek ayırmak için AWE kullanmıyorduk, ancak şimdi bir fark yaratıp yaratmadığını göreceğiz.
  • Bu hata, bir işlem günlüğünü yedekleyen, sorgu çalıştırmayan bir iş tarafından atıldı.
  • Birçok bağlantılı sunucumuz var. Diğer taraftaki RDBMS türleri SQL Server (2005 ve 2000), Oracle 10g ve OSI PI sistemleridir.
  • Bu noktada aralıklıdır. Herhangi bir zaman veya olayı hatalarla ilişkilendiremeyiz.
  • Elbette, yeniden başlatma bir süreliğine ortadan kalkıyor gibi görünüyor, bu da hata mesajının doğası nedeniyle mantıklı.
  • Bu sunucu, uygulama sunucusu (birkaç Windows Hizmeti) ve bir web sunucusu ile veritabanı sunucusu olarak üçe katlanır.

DÜZENLE:

SP3'teyiz. Bulduğumuz gönderilerin çoğu, bizim için geçerli olmayan SP1 öncesi idi.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

İadeler

9.00.4035.00 SP3 Standart Sürüm


Bu hatayla ilgili ek ayrıntılar olabileceğinden SQL Server Hata Günlüğünü inceleyebilir misiniz?
John Sansom

Yanıtlar:


4

Ben de -g başlangıç ​​parametresini kullanmanızı öneririm. Çoğu insan için işe yarıyor gibi görünüyor ve muhtemelen sizin için de işe yarayacak. Tek endişem, altta yatan sorunun çözülmemiş olması olabilir. Örneğin, bağlı bir sunucudan dolayı bellek sızıntısı varsa ve MTL'nin 512Mb'ye yükseltilmesi bellek sorunları arasında daha uzun bir süre mi olacak? Bunun cevabını bilmiyorum ama UndertheFold ile hemfikirim, çünkü bir perfmon iyi bir başlangıç ​​olabilir.


7

"Bu sorguyu çalıştırmak için yeterli sistem belleği yok" hata iletisi . Sanal Adres Alanı'nın (VAS) kullanılamaz olduğunu ve geleneksel anlamda bellek olmadığı anlamına gelir, yani SQL Server işlem alanı içinde.

Bu sunucuda yalnızca 3GB ile çalıştığınız ve SQL Server'ın 2GB'a kadar atandığı göz önüne alındığında, işletim sistemi ve daha da önemlisi kutudaki diğer her şeyin oynayabileceği 1GB'den daha az olduğu anlamına gelir. Bu çok fazla bellek değil.

Bu sorun gerçekten bir bellek sızıntısı sonucu ise, o zaman tüketilen SQL Server işlem alanı (memToLeave) dışında VAS olduğunu.

MemToLeave bölümüne daha fazla bellek atamak için -g startup parametresini kullanmanızı öneririm.

Daha fazla bilgi için aşağıdaki makaleye bakın:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Ayrıca SQL Server maksimum bellek ayarını azaltmak isteyebilirsiniz ama bunu son çare olarak yapardı.


İyi makale. Ayrıca yazdığınız için teşekkürler! SQL günlüklerimizde boşaltılan birkaç AppDomains var. Yalnızca 2 CLR saklı yordamımız var ve bunlar temel olarak bir web hizmetine veri gönderiyor ve bir web hizmetinden veri alıyor. Bu 2 CLR saklı yordamın kutudan çok fazla VAS kullanması garip görünüyor.
Aaron Daniels

Rica ederim. Bildiğiniz gibi memToLeave için varsayılan ayırma yalnızca 256 MB'dir. Bu, özellikle sunucudaki tüm kullanılabilir belleği kullanıyorsanız, AppDomains, tüm CLR / yönetilen kod, Bağlantılı Sunucu sorguları, SSIS vb. İçin oldukça küçük bir sanal alan. -G startup parametresini kullanarak 512MB'ye iki katına çıkarmanızı öneririm.
John Sansom

1

Bu forumlar iş parçacığına göre, bu bağlantılı bir sunucu sürücüsünün bellek sızıntısı ile ilgili olabilir :

Microsoft bize şunları söyledi.

Görünüşe göre bağlı bir sunucu kullanarak veri işleme, özellikle fox pro sürücüsü zamanla biriken bellek sızıntısına neden olur.


0

Bu sunucu, uygulama sunucusu (birkaç Windows Hizmeti) ve bir web sunucusu ile veritabanı sunucusu olarak üçe katlanır.

Min hafızanızı ayarlardım - bu diğer işlemlerin SQL'den "çaldığı" oldukça olasıdır

Bunu onaylamak ve / veya asıl sorunun ne olduğunu belirlemek için kendinize daha fazla bilgi vermek için perfmon kullanarak bir sayaç günlüğü çalıştırabilirsiniz.


0

Referans bu blogdan alınmıştır!

Bu sorunu çözmek için farklı alternatifler var.

İlk olarak, "min sunucu belleği" ve "maksimum sunucu belleği" için SQL Server ayarınızı kontrol edin. Her iki değerde de çok küçük bir fark bulduysanız, “maksimum sunucu belleğinizi” artırın.

İkinci olarak, bellek kullanım bilgileriyle uzun süren sorgular öğrendi ve bu sorgu boştaysa, lütfen bu işlemi doğrulayın ve öldürün. Veritabanı performans optimizasyonu bellek kullanımları için önemli bir şeydir.

Üçüncüsü, sistem DISK I / O artışını düzgün bir şekilde endekslemeden ve doğrudan belleğinizi etkilemediğinden, uzun süren sorgular için dizin kullanımları bulundu.

Dördüncü olarak, Sanal bellek disk belleği dosyasının boyutunu kontrol edin ve bu dosyanın boyutunu artırın.

Beşinci olarak, "sorgu başına minimum bellek" boyutunu kontrol edin, varsayılan olarak 1024 KB'dir ancak nadir durumlarda bu parametrenin boyutunu azaltabilirsiniz. Aslında, bu tavsiye edilmez, ancak deneyebilirsiniz.

Altıncı, Bu DBCC komutunu çalıştırmayı deneyin ve sunucunun genel performansını etkileyebileceği için bu önerilmez. Ama bunu deneyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.