SQL Server'ın belleğini serbest bırakmasını nasıl sağlayabilirim?


19

SQL'in RAM'i sevdiğini biliyorum, ancak Windows sorduğunda serbest bırakır. SQL'in bu şekilde çalışması gerektiğini biliyorum. Ancak SQL'in RAM'i gerçekten döndüreceğine ikna olmayan bir Windows Yöneticim var ve bu belirli (sanal) sunucuda, Analysis Services bittikten sonra SQL'in fazla bir şeye ihtiyacı yok, ancak bu sunucuda rahatsız edici başka bir şey yok SQL'den çok isteyin.

Bu yüzden, Windows yöneticilerine sanal ortamla ilgili sorunların "SQL çok fazla RAM kullandığından" olmadığı konusunda güvence vermeye çalışıyorum, ancak hizmeti yeniden başlatmadan SQL'i serbest bırakmaya ikna edemiyorum.

Küpleri işlerken, SQL hizmeti mutlu bir şekilde 8GB RAM alır, ancak üzerinde baskı olmadığından, normal bir gün boyunca bunun çoğunu serbest bırakmaz. Windows çocuklar çığlık atıyor ve SQL'in bunu yayınlaması çok daha hoş olurdu.

Ben maksimum bellek ayarı kullanmak istemiyorum, çünkü aslında SQL işleme sırasında bu kadar RAM kullanmak istiyorum. Daha sonra tekrar aşağı inmesini istiyorum.

Bu, muhtemelen SQL Server'ın belleği serbest bırakmaması ve SQL Server'dan belleği geri almasının bir kopyasıdır , ancak farklı bir cevap olup olmadığını merak ediyorum. Windows'un geri almasını beklemek, burada Windows adamlarını ikna etmeyecek. Hizmeti yeniden başlatmak bir seçenektir, ancak gerçekten bu fikrin hayranı değilim.

Windows'u geri istemesini nasıl sağlayacağımı bilmek istiyorum ...


2
Sysadmin, kullanılan RAM'den şikayet ediyor mu? RAM kullanılmadığında boktan oluyorum, çünkü kullanılmıyorsa boşa harcanacak ...
Mark Henderson

Makinenin belleğe ihtiyacı yoksa da anlamıyorum - sorun nerede? Bu, işletim sistemi ve uygulamaları normalde nasıl çalışır ... boşta SQL hizmetine sahip iş yükü, başka hiçbir şeye ihtiyaç duymadığında en fazla belleği tuttuğunda, bir sonraki SQL işi için tepki süresini ve / veya performansı artırabilir mi?
Oskar Duveborn

Windows yöneticisi, işlemin çok fazla RAM içerdiği için SQL'in makineyi strese soktuğunu hissediyor. Kutunun SQL'den stres altında olmadığını biliyorum ve sadece SSAS işleme için veri alırken çok fazla RAM tüketen gösteren SQL hizmetini yeniden başlatarak gösterebilir. Bu yüzden SQL'in günün geri kalanını kullandığı RAM miktarını göstermek için belleği serbest bırakmasını istiyorum. Bu, daha fazla RAM sağlamalarını sağlamak değil, sadece şeyler için SQL'i suçlamayı bırakmalarıyla ilgili değildir.
Rob Farley

2
Farseeker ile hemfikir olun, sysadmin mutlu olmalı RAM kullanılıyor. Geri kazanılmıyorsa, sunucunun buna ihtiyacı yoktur. Belki sistemden stresli olmadığını göstermek için sysadmin'den sayfa hatalarına bakmasını isteyebilirsiniz?
Nick Kavadias

2
Sistem yöneticiniz Sayfa Hatalarının neyi temsil ettiğini ve belleğin neden tükendiğini anlamıyorsa, ancak gerçek Sayfa Hatalarının gerçekleşmesi sorun değilse, size nasıl yardımcı olacağımı bilmiyorum. Aptalý tamir edemezsin. Ancak yapabileceğiniz bir şey, sistemi kullanmadığınızda maksimum belleği yapılandırmak için sp_configure kullanmak ve ihtiyacınız olduğunda yedeklemeyi yapılandırmaktır. Ancak bu oldukça aptalca görünüyor. sp_configuregenellikle bir kez ayarlamanız ve yalnız bırakmanız gereken bir şeydir.
Bacon Bits

Yanıtlar:


12

Tek seçeneğinizin SQL Hizmeti'ni yeniden başlatmak veya SQL'i serbest bırakmaya zorlamak için çok fazla bellek tüketen bir uygulama çalıştırmak olduğuna inanıyorum.

@Nick Kavadias'ın önerisini beğendim: SQL'in işletim sisteminin belleğini baskı altına almadığını göstermek için Memory: Page Faults / Sec performans sayacını izleyin.


2
Teşekkürler Mitch ... Notepad için 10GB'lık metin dosyasını bulalım.
Rob Farley

lol !, aslında bu kötü bir fikir değil!
Mitch Wheat

belki bir 2GB dosya kullanın ...
Mitch Wheat

5

Onlara bunu göstermenin bir yolu, SQL Server'ın tüm belleği çiğnemesidir. Sonra büyük bir dosyayı ağ üzerinden kopyalayın (büyük SQL Yedekleme dosyaları bunun için harika çalışır). Bu, sistem önbelleğinin dolmasına neden olur ve Windows SQL'den belleği geri istemeye başlar. SQL, minimum bellek ayarınıza ulaşana kadar belleği işletim sistemine geri döndürmeye başlar.

(Üzgünüm soruyu Twitter üzerinden alamadım, görünüşe göre 140'tan fazla karaktere ihtiyaç vardı.)


1
Ben (tamponlar temizlendikten ve düştükten sonra), ancak bellek yapmak için kutuyu sakatlamak zorunda kalmadan bellek geri SQL isteyecek bazı süreç için umuyorum.
Rob Farley

Sorunu başka bir yolla zorlamadan, Windows bellek yöneticisini belleği geri istemeye zorlamanın bir yolu olduğunu düşünmüyorum. Muhtemelen bunu yapmak için doğrudan win32 API'sine çarpan bir şey yazabilirsiniz, ancak bildiğim kadarıyla Windows'u bellek geri istemesi için tetiklemenin tek yolu, başka bir işlem için daha fazla belleğe ihtiyaç duymasıdır. Bob veya Paul ile kontrol edin, daha fazla bilgiye sahip olabilirler.
mrdenny

3
VMware'in balon sürücüsü tam olarak bunu yapar - SQL Server'ın (veya başka bir uygulamanın) belleklerinden vazgeçmesini sağlamak için Windows'tan daha fazla bellek ister.
Brent Ozar

Evet - böyle bir şey yapmak zorunda kalmamamı umuyordum.
Rob Farley

@BrentOzar, VMware'in ballon sürücüsü gerçek işlem belleğini değil, yalnızca sistem önbelleğinden belleği geri alır; İşletim Sistemine "tüm hafızanızı önemsiz şeyler için kullanmayın" demenin bir yolu olarak tasarlanmıştır.
Massimo

2

'Küpler' den bahsediyorsunuz, bu yüzden AS motorundan mı yoksa ilişkisel motordan mı bahsedeceğiniz belli değil. İlişkisel motor talep üzerine hafızayı boşaltabilir:

DBCC FREESYSTEMCACHE('<cache name>');

'Önbellek adı' sys.dm_os_memory_clerks adresinden alınır . DBCC FREESYSTEMCACHE spesifikasyonu sadece vali havuzlarından bahseder, ancak aslında daha birçok önbellek çıkarılabilir.

Ancak tüm bellek tampon havuzu tarafından kullanılıyorsa, tüm tampon havuzunu boşaltmak muazzam performans düşüşüne ve büyük IO yüküne neden olacaktır. Daha iyi SQL bunu kendisi halletsin.


1
Merhaba Remus, ilişkisel tampon önbellek bir küp işlendikten sonra büyük. Bundan sonra, önbelleklerin gerçekten temizlenmesini, düşürülmesini ve belleğin Windows'a geri dönmesini istiyorum. DBCC DROPCLEANBUFFERS ve FREESYSTEMCACHE önbelleği boşaltır, ancak belleği Windows'a geri döndürmez, bu yüzden tam olarak istediğim şey değil.
Rob Farley

2
Teorik olarak bellek baskısını taklit edebilirsiniz (örn. QueryMemoryResourceNotification trambolinini yapabilirsiniz, msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ) ama gerçekten oraya gerçekten gitmezdim . SQL kaydedilmiş belleği serbest bırakmazsa işletim sisteminin buna ihtiyacı yoktur. İşletim sistemi belleğe ihtiyaç duymaz çünkü SQL ana bilgisayardaki tek uygulamadır ( stackoverflow.com/questions/1401834/… ), değil mi? SQL boyunca başka bir uygulama çalıştırırsanız, uygulamaya başladınız.
Remus Rusanu

2

Hem AS hem de DS motorlarında, güvenli bir eşiğin altında kalmaları için belleğe bir kapak koyabilirsiniz; bu, çok fazla RAM ve / veya birden çok SQL örneği olan 64 bith makinede önerilir. En azından veritabanı motoru için, bellek kapağını mevcut kullanımın altına değiştirirseniz, SSAS hakkında emin değilsiniz.


Kapakta sorun yok, ama işlemden sonra maksimum belleği aşağı çekmek ve sonra arabelleği temizlemeyi tercih ettiğimde, onları düşürdüğümde ve biraz bellek baskısı istediğinde geri itmek isteyeceğim.
Rob Farley

1

Bulduğum en kolay şey, sunucu belleği özelliklerine gitmek, daha küçük bir değer girmek, uygulamak, birkaç dakika beklemek ve yapılandırmayı yedeklemektir.

Ayrıca, kısıtlama sql sunucularının bellek kullanımının aslında pencerelerin önbellekleme için daha fazla koç verdiği için sunucunun performansını artırabildiğini bulduk.

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.