SQL Server'dan belleği geri alma


10

Windows artık vermez kadar bellek kullanımı yavaş yavaş büyüyen bir SQL Server örneği var. Ara sıra büyük sorgu sonucunun örneğin büyümesine neden olması mantıklı görünüyor.

SQL Server'ı artık (hizmeti yeniden başlatma dışında) ihtiyaç duymadığı belleği serbest bırakmaya ikna edebileceğim bir yol var mı?

Düzenleme:
SQL Server 2000 kullanıyorum SQL Server 8.00.2039 - SP4 (Standart Sürüm)

Aşağıdaki sorguyu kullanarak bunu bulmak mümkün:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

Yanıtlar:


19

Bu tam olarak SQL Server'ın çalışması gerekiyor .

Bu makinede başka hizmetleriniz varsa ve SQL'in kullanılabilir tüm belleği kullanmasını istemiyorsanız, maksimum sunucu belleğini ayarlamanız gerekir. MSDN'de SQL Server Bellek Seçenekleri konusuna bakın .


1
Bir özellikten daha çok bir hata gibi geliyor ... başıma geliyor. SQL Server, bir şey yapmak için kullanılabilir RAM'in% 95'ini alır ve tamamlandığında serbest bırakmaz.
Simya

1
@Alchemical Ne demek istediğinizi " tam " olarak gösterir. SQL Server edebilir bir bilgisayardaki tüm RAM faydalanmak; disk önbelleği olarak kullanma. SQL Server ile işiniz bitene kadar disk önbelleği olarak " tamamlanmaz ".
Ian Boyd

8

Diğer posterler bunun tasarım gereği doğrudur, ancak maksimum belleği sunucunuzun RAM'inden biraz daha azıyla sınırlamak istersiniz. Bu olaylar dizisini düşünün:

  • SQL 2000, sunucunuzun RAM'inin tümünü tüketerek mutlu bir şekilde çalışır
  • Birisi RDP içeriyor veya bir yama indirmek için IE'yi çekmeniz gerekiyor veya yedekleriniz ne olursa olsun
  • SQL, işletim sisteminin çalışması için yeterli miktarda belleği ayırmalı ve boşaltmalıdır
  • Bellek boşaltırken ve diske disk belleği kaydedilirken performans berbat
  • Kararlı olduğunda işler yeterince iyi gidiyor
  • Diğer işlem tamamlanır ve SQL yavaş yavaş RAM'i geri alır
  • Tekrar et

Bundan kaçınmak için, maksimum sunucu belleği sınırınızı gerçek fiziksel belleğinizin yaklaşık% 80-90'ına ayarlayın. SQL 2000 için talimatlar: http://msdn.microsoft.com/en-us/library/ms178067.aspx


Bu davranışın 2005 ve 2008 - 2000 işletim sistemine talep üzerine bellek bırakmadığını unutmayın.
Paul Randal

2
Tam olarak talep üzerine değil, ancak belleği işletim sistemine geri bırakıyor. Gönderdiğim bağlantıdan: "SQL Server belleği dinamik olarak kullandığında, boş fiziksel bellek miktarını belirlemek için sistemi periyodik olarak sorgular. Microsoft Windows 2000'de SQL Server, boş fiziksel belleği 4 MB arasında tutmak için arabellek önbelleğini büyütür veya küçültür ve sunucu etkinliğine bağlı olarak 10 MB. Bu boş belleği korumak, Windows 2000'in disk belleği olmasını engeller. Daha az bellek yoksa, SQL Server belleği Windows 2000'e bırakır. Daha fazla bellek yoksa, SQL Server belleği arabellek havuzuna ayırır. "
sh-beta

Ah - doğru - biraz fiziksel belleği bırakma hilesi var - haklısın!
Paul Randal

4

Yalnızca işletim sistemi RAM'in aç olduğunu bildirirse veya hizmeti durdurup yeniden başlatırsanız serbest bırakır; yapılacak şey, SQL'in 'maksimum sunucu belleği' değerini yapılandırarak kullanacağı maksimum miktarı sınırlamaktır. Sunucuda RAM'e ihtiyaç duyan başka bir şey yoksa (ve umarım yoktur) bu konuda endişelenmezdim.


4

Yani, cevapları özetlemek gerekirse:

MS SQL Server'dan hemen ihtiyaç duymadığı belleği serbest bırakmasını istemenin bir yolu yoktur. SQL Server gerektiğinde otomatik olarak belleği serbest bırakmalıdır, ancak daha önce değil. Ve bellek sorunları yaşıyorsanız, "maksimum sunucu belleği" bellek optin değerini azaltmalısınız.


3

SQL Server belleği tüketecek ve işletim sistemi tarafından bellek baskısı olmadığı söylenmedikçe geri vermeyecektir. Portman'ın belirttiği gibi, bu tasarım gereğidir ve bellek tüketimini sınırlamak istiyorsanız, SQL Server'ın kullanacağı maksimum sunucu belleğini ayarlamanız gerekir.


2

Tüm açıkladığınız davranışın, bellek yöneticisinin yeniden yazıldığı (diğer şeylerin yanı sıra) işletim sisteminin bellek basıncı isteklerine yanıt verdiği SQL Server 2005'ten geldiğini unutmayın.

SQL Server 2000 ve öncesi için, bellek aldığında, işletim sistemi ne kadar bağırırsa yapsın, geri vermez.

CodeSlave - 2000, 2005 veya 2008'de mi çalışıyorsunuz?


Ah ha ... evet gerçekten SQL 2000.
BIBD

3
İşletim sistemi bağırdığında geri vermez, ancak işletim sisteminin boş fiziksel bellek için belirli bir eşiğin altında olduğunu görürse geri verir. Bkz. Msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta

Ve sh-beta'nın söylediklerini güçlendirmek için SQL Server 2000, yalnızca işletim sisteminin fiziksel bellekte düşük olduğunu fark ettiğinde belleği serbest bırakır, çünkü Windows XP'ye (2001) kadar Windows işletim sisteminin " it "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005, Windows'un bu yeni özelliğinden yararlanır. Ancak SQL Server 2000 yazıldığında, işletim sisteminin bunun için bağırması mümkün değildi, bu da SQL Server'ı düzenli olarak bellek basıncını kontrol etmeye zorladı.
Ian Boyd

0

Eski soru, biliyorum, ama SQL'i belleği serbest bırakmak için (en azından daha yeni) zorlamanın bir yolu, 15 saniye (örneğin, Uyku (15000)) bekleyerek, yığınlarda olabildiğince fazla bellek ayıran bir uygulama yazmaktır. ve tahsis edilen hafızayı boşaltmak ve çıkmak; Bunu denedim ve sistem belleği geri alır böylece SQL belleği serbest bırakır; Yukarıdaki gibi kod yazmak, C / C ++ kullanarak neredeyse önemsizdir, sadece bellek bloğu zincirini (işaretçi ve boyut) tutmak için bir zincir zinciri kurma meselesi, bir "malloc ()" ulaşana kadar boyutu giderek azalır minimum (1024'ten az diyelim) ve ardından tahsis edilen blokları geri serbest bırakmak için bağlantılı listeyi hareket ettirin

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.