2016-08-17 10 views
14

Jaki jest dobry sposób sprawdzenia, ile (rzeczywistej) pamięci jest obecnie używane? W porównaniu do tego, ile jest przydzielonego sobie serwera SQL Server?Jak zmusić serwer SQL do zwolnienia pamięci?

byłem uciekania się do memory_utilization_ procentach ale które nie wydają się zmienić po uruchomieniu następujące czynności, aby zwolnić pamięć.

SELECT [Memory_usedby_Sqlserver_MB] = (physical_memory_in_use_kb/1024) , 
     [Memory_utilization_percentage] = memory_utilization_percentage 
FROM sys.dm_os_process_memory; 

DBCC FREESYSTEMCACHE ('ALL') 
DBCC FREESESSIONCACHE 
DBCC FREEPROCCACHE 

SELECT [Memory_usedby_Sqlserver_MB] = (physical_memory_in_use_kb/1024) , 
     [Memory_utilization_percentage] = memory_utilization_percentage 
FROM sys.dm_os_process_memory; 

Rozwiązanie jest spadek maks pamięci serwera dla SQL Server i zwiększać go ponownie, aby wymusić SQL Server, aby zwolnić nieużywane ale przydzieloną pamięć. Jednak problem z tym podejściem polega na tym, że nie możemy być pewni, jak daleko zmniejszyć maksymalną pamięć serwera, a tym samym uruchomić ryzyko zabicia SQL Server. Dlatego ważne jest, aby zrozumieć, ile SQL Server "faktycznie" używa przed zmniejszeniem wartości dla maksymalnej pamięci serwera.

+2

DBCC darmowe rozmowy nie są zaprojektowane, aby zwolnić pamięć z powrotem do systemu operacyjnego, ale jedynie zaznaczyć stron związane z ich funkcją jako dostępną. Gdy serwer przydzieli pamięć, zachowuje ją, nie ma powodu, aby przeprowadzała kosztowną reorganizację i opróżnianie, opcja maksymalnej pamięci jest wyjątkiem. Prawdziwe pytanie brzmi być może * dlaczego * musisz to zrobić? –

+0

W przypadku aktywnych aktywnych wystąpień SQL Server czasami będzie trzymać więcej pamięci niż potrzeba i będzie ograniczać inne wystąpienia, które potrzebują ich rozpaczliwie. Czy istnieje lepszy sposób adresowania tego innego niż mniej instancji na węzeł i zwiększenie pamięci fizycznej? – Tigerjz32

+3

1) To pytanie należy do DBA. 2) Nie rób tego. Poinformuj program SQL Server o tym, ile pamięci może używać, i na ogół zużywa tyle, ile potrzebuje, aż do tego limitu ... Zasadniczo będzie to rozmiar całej bazy danych plus niektóre, chyba że baza danych jest większy niż limit pamięci. Jeśli nie chcesz tego robić, musisz ustawić limit, używając ustawienia 'max server memory'. – Ben

Odpowiedz

0

Musisz ustawić "Maks. Pamięć serwera" na wartość z zakresu 1-2 GB. Ten zakres jest w większości przypadków bezpieczny. może upłynąć czas, aby zwolnić pamięć po wykonaniu poniżej:

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'max server memory', 1024; 
GO 
RECONFIGURE; 
GO 

To ustawienie pozwala wyczyścić basen, kompilacji pamięć, wszystkie bufory, clr pamięć itd

Minimalna wartość „max pamięć serwera "ma 128 MB, ale nie jest zalecana, ponieważ SQL Server może nie uruchamiać się w niektórych konfiguracjach. Jeśli tak się stanie, użyj przełącznika "-f", aby wymusić uruchomienie SQL z minimalną konfiguracją, a następnie zmień wartość na oryginalną.

+0

Dziękujemy! Jednak czy istnieje sposób, aby dowiedzieć się, najniższy numer powinien opuścić "pamięć max sever", a nie zakładając, że 1-2GB jest bezpieczne? – Tigerjz32

+0

Nie wydaje mi się, ponieważ zależy to od wielu parametrów i konfiguracji, dlatego nie ma opcji, aby wyczyścić ją bezpiecznie do minimalnej wartości. Nawet MS ustawione 128 MB jest minimum, ale nie polecają go. Dlaczego musisz go zwolnić? Czy uruchamiasz cokolwiek innego na serwerze, który zużywa dużo pamięci? – Anton

+0

Serwery działają w aktywnym klastrze, co oznacza, że ​​każda instancja może działać w dowolnym węźle w danym czasie. Jeśli instancja A przydzieliła więcej pamięci niż potrzebuje w tym czasie, instancja B może nie mieć wystarczającej ilości alokacji do siebie lub po prostu ma mniej pamięci do pracy. Aby tego uniknąć, chcemy ręcznie zwolnić pamięć z instancji A. Najlepszym sposobem na zwolnienie pamięci jest zmniejszenie ilości pamięci i zwiększenie jej. Aby upaść, musimy wiedzieć, jak daleko można upuścić, bez wpływu na trwające procesy. – Tigerjz32

0

nie mam rozwiązanie, jak zwolnić przydzieloną pamięć. Jednak dla naszych celów udało nam się dowiedzieć, jak zezwolić na bezpieczne uruchamianie aktywnych klastrów. Zdecydowaliśmy się ustawić minimalną pamięć serwera na ~ 2 GB. Jest to pomocne, ponieważ bez względu na to, jak dużo pamięci i instancji zdecyduje się użyć, nigdy nie uruchomi innych instancji poza pamięcią. Znowu to rozwiązuje nasz cel, ale wciąż nie odpowiada na pytanie, ile pamięci jest faktycznie używane, jak nisko możemy upuścić maksymalną pamięć serwera, itd ...

0

Nie sądzę, że SQL Server zwalnia pamięć, chyba że system operacyjny aktywnie jej zażąda. Jeśli istnieje przypadek innych procesów żądających większej ilości pamięci i jeśli ich nie ma wcale, SQL Server samodzielnie zwolni nieużywaną pamięć. Zamiast próbować wyleczyć unusued pamięci, prawdopodobnie idę z ograniczeniem maksymalnej dozwolonej pamięci SQL.

sp_configure 'show advanced options', 1 
GO 

RECONFIGURE 
GO 

sp_configure 'max server memory', 512; --or some other value 
GO 

RECONFIGURE 
GO 

W celu uzyskania dalszych informacji, można sprawdzić ten artykuł MSDN: https://msdn.microsoft.com/en-us/library/ms178067.aspx

1

SQL Server zawsze zakłada, że ​​jest podstawowym uruchomionej aplikacji. Nie jest przeznaczony do współdzielenia zasobów. Zawsze zajmie całą dostępną pamięć i zwolni ją tylko dla systemu operacyjnego, chyba że nastąpi dławienie z "maksymalną pamięcią serwera".

Zgodnie z projektem serwer SQL nie jest dobrze zgodny z innymi.

Ten sqlskills artykuł zaleca odniesienia dla dławienia następuje poprzez monitorowanie i podnoszenie przepustnicę jak potrzebne:

https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/

Powiązane problemy