Jak uzyskać program SQL Server, aby zwolnił pamięć?

19

Wiem, że SQL lubi pamięć RAM, ale zwalnia ją, gdy Windows pyta. Wiem, że tak powinien działać SQL. Ale mam administratora systemu Windows, który nie jest przekonany, że SQL faktycznie zwróci pamięć RAM, a na tym konkretnym (wirtualnym) serwerze SQL nie potrzebuje wiele po zakończeniu usług Analysis Services, ale na tym serwerze nie ma nic, co by przeszkadzało zapytaj SQL za dużo.

Próbuję więc uspokoić administratorów systemu Windows, że problemy ze środowiskiem wirtualnym nie polegają na tym, że „SQL używa zbyt dużo pamięci RAM”, ale nie wydaje mi się, aby przekonać SQL do zwolnienia go bez ponownego uruchomienia usługi.

Podczas przetwarzania kostek usługa SQL szczęśliwie zajmuje 8 GB pamięci RAM, ale ponieważ nie ma na nią presji, nie uwalnia jej dużo w ciągu normalnego dnia. Faceci z Windows krzyczą i byłoby znacznie przyjemniej, gdyby SQL to wydał.

Nie chcę używać ustawienia maksymalnej pamięci, ponieważ tak naprawdę chcę, aby SQL zużywał tyle pamięci RAM podczas przetwarzania. Chcę tylko, żeby potem znów się obniżyło.

Jest to potencjalnie duplikat zarówno programu SQL Server, który nie zwalnia pamięci, ani odzyskuje pamięć z programu SQL Server , ale zastanawiam się, czy istnieje inna odpowiedź. Oczekiwanie na odzyskanie systemu Windows nie przekonuje tutaj facetów z Windows. Ponowne uruchomienie usługi jest opcją, ale tak naprawdę nie jestem fanem tego pomysłu.

Chcę wiedzieć, jak zmusić system Windows do żądania zwrotu ...

Rob Farley
źródło
2
Co ... sysadmin narzeka na użycie pamięci RAM? Robię się gówno, gdy RAM NIE JEST używany, ponieważ jeśli nie zostanie użyty, po prostu zmarnuje ...
Mark Henderson
Ja też tego nie rozumiem, jeśli maszyna nie potrzebuje pamięci - gdzie jest problem? W ten sposób normalnie działa system operacyjny i jego aplikacje ... zważywszy na to, że bezczynna usługa SQL utrzymuje większość pamięci, gdy nic więcej jej nie potrzebuje, może to wydłużyć czas odpowiedzi i / lub wydajność następnego zadania SQL?
Oskar Duveborn
Administrator systemu Windows uważa, że ​​SQL stresuje maszynę, ponieważ proces ma tak dużo pamięci RAM. Wiem, że pole nie jest obciążone przez SQL i mogę to zademonstrować poprzez ponowne uruchomienie usługi SQL, co pokazuje, że zużywa dużo pamięci RAM podczas pobierania danych do przetwarzania SSAS. Chcę więc, aby SQL zwolnił pamięć, aby pokazać ilość pamięci RAM, której SQL używa do końca dnia. Nie chodzi o to, aby zapewnić im więcej pamięci RAM, tylko po to, aby przestali obwiniać SQL za rzeczy.
Rob Farley,
2
Zgadzam się z Farseeker, sysadmin powinien być szczęśliwy, że używana jest pamięć RAM. Jeśli nie zostanie odzyskany, serwer go nie potrzebuje. Może poproś administratora systemu o sprawdzenie błędów strony, aby pokazać, że system nie jest obciążony?
Nick Kavadias
2
Jeśli Twój administrator nie rozumie, co oznaczają błędy stronicowania i dlaczego zużycie pamięci, ale nie ma prawdziwych błędów stronicowania, nie stanowi problemu, nie wiem, jak ci pomóc. Nie możesz naprawić głupka. Jedną rzeczą, którą możesz zrobić, to użyć sp_configure, aby skonfigurować maksymalną pamięć w dół, gdy nie korzystasz z systemu, i skonfigurować ją ponownie, gdy będziesz jej potrzebować. Wydaje się to jednak dość głupie. sp_configurejest ogólnie rzeczą, którą powinieneś ustawić raz i zostawić w spokoju.
Bacon Bits

Odpowiedzi:

12

Uważam, że jedyną opcją jest ponowne uruchomienie usługi SQL lub uruchomienie aplikacji, która zużywa dużo pamięci, aby zmusić SQL do jej zwolnienia.

Podoba mi się sugestia @Nick Kavadias: monitoruj licznik wydajności Pamięć: Błędy stron / s, aby pokazać, że SQL nie naruszył pamięci systemu operacyjnego.

Mitch Pszenica
źródło
2
Dzięki Mitch ... Pozwól mi znaleźć ten plik tekstowy 10 GB dla Notatnika.
Rob Farley,
lol !, właściwie to nie jest zły pomysł!
Mitch Wheat
może użyć pliku 2 GB ...
Mitch Wheat
5

Jednym ze sposobów, aby pokazać im, że to zrobi, jest sprawienie, by SQL Server sprawdził całą pamięć. Następnie skopiuj ogromny plik przez sieć (duże pliki SQL Backup świetnie nadają się do tego). Spowoduje to zapełnienie pamięci podręcznej systemu, a system Windows zacznie pytać SQL o pamięć. SQL zacznie zwracać pamięć z powrotem do systemu operacyjnego, dopóki nie osiągnie minimalnego ustawienia pamięci.

(Niestety nie dostałem całego pytania za pośrednictwem Twittera, najwyraźniej potrzeba było ponad 140 znaków).

mrdenny
źródło
1
Mam nadzieję na pewien proces, który mogę użyć, który poprosi SQL o odzyskanie pamięci (po wyczyszczeniu i upuszczeniu buforów), ale bez konieczności okaleczania skrzynki, aby to zrobić.
Rob Farley
Nie sądzę, że istnieje sposób, aby zmusić menedżera pamięci systemu Windows do żądania zwrotu pamięci bez wymuszania problemu w inny sposób. Prawdopodobnie możesz napisać coś, co trafi bezpośrednio w interfejs API win32, aby to zrobić, ale o ile wiem, jedynym sposobem, aby uruchomić system Windows w celu żądania pamięci, jest spowodowanie, że będzie potrzebował więcej pamięci na inny proces. Skontaktuj się z Bobem lub Paulem, mogą mieć więcej informacji.
mrdenny
3
Sterownik balonowy VMware właśnie to robi - prosi system Windows o coraz więcej pamięci, aby SQL Server (lub inna aplikacja) zrezygnował z pamięci.
Brent Ozar
Tak - miałem nadzieję, że nie będę musiał robić czegoś takiego.
Rob Farley
@BrentOzar, sterownik Ballon VMware odzyskuje tylko pamięć z pamięci podręcznej systemu , a nie rzeczywistą pamięć procesu; został zaprojektowany jako sposób na powiedzenie systemowi operacyjnemu „nie zużywaj całej dostępnej pamięci na trywialne rzeczy”, a nie na obniżenie jej poziomu.
Massimo,
2

Wspominasz o „kostkach”, więc nie jest jasne, czy mówisz o silniku AS, czy silniku relacyjnym. Silnik relacyjny może zwolnić pamięć na żądanie:

DBCC FREESYSTEMCACHE('<cache name>');

Gdzie „nazwa pamięci podręcznej” jest pobierana z sys.dm_os_memory_clerks . Specyfikacja DBCC FREESYSTEMCACHE wspomina tylko o pulach zarządzających, ale w rzeczywistości można eksmitować wiele innych pamięci podręcznych.

Ale jeśli cała pamięć zostanie wykorzystana przez pulę buforów, wówczas usunięcie całej puli buforów spowoduje ogromny spadek wydajności i ogromne obciążenie IO. Lepiej pozwól SQL sam sobie z tym poradzić.

Remus Rusanu
źródło
1
Cześć Remus, pamięć podręczna bufora relacyjnego jest duża po przetworzeniu kostki. Po tym naprawdę naprawdę chcę, aby pamięci podręczne zostały wyczyszczone, usunięte i pamięć powróciła do systemu Windows. DBCC DROPCLEANBUFFERS i FREESYSTEMCACHE opróżniają pamięć podręczną, ale nie zwracają pamięci do systemu Windows, więc nie jest to dokładnie to, czego chcę.
Rob Farley,
2
Teoretycznie możesz podrobić presję pamięci (np. Możesz trampolinę QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ), ale naprawdę naprawdę naprawdę tam nie pójdę. Jeśli SQL nie zwalnia pamięci zatwierdzonej, to dlatego, że system operacyjny jej nie potrzebuje. System operacyjny nie potrzebuje pamięci, ponieważ SQL jest jedyną aplikacją na hoście ( stackoverflow.com/questions/1401834/... ), prawda? Jeśli uruchamiasz inną aplikację wzdłuż SQL, masz ją wkrótce.
Remus Rusanu
2

Zarówno w silnikach AS, jak i DS można nałożyć ograniczenie na pamięć, aby pozostały poniżej bezpiecznego progu; jest to zalecane na 64-bitowych komputerach z dużą ilością pamięci RAM i / lub wieloma wystąpieniami SQL. Przynajmniej dla silnika bazy danych, jeśli zmienisz limit pamięci na niższy niż bieżące użycie, zmniejszy on ilość pamięci w locie bez konieczności restartowania usługi, ale nie jestem pewien co do SSAS.

Jason Cumberland
źródło
Posiadanie limitu jest w porządku, ale myślę, że będę chciał zmniejszyć maksymalną pamięć po przetworzeniu, a następnie wypchnąć ją z powrotem, gdy wolę wyczyścić bufory, upuścić je i poprosić system Windows o trochę pamięci.
Rob Farley
1

Najłatwiejszy do znalezienia jest przejście do właściwości pamięci serwera, wprowadzenie mniejszej wartości, zastosowanie, odczekanie kilku minut i dostosowanie kopii zapasowej konfiguracji.

Odkryliśmy również, że użycie pamięci przez dławiące serwery SQL może faktycznie poprawić wydajność serwera, ponieważ daje Windows więcej pamięci RAM do buforowania itp.

Nick van Esch
źródło