Chciałbym uzyskać twój wkład w tej sprawie. Mam serwer SQL Server 2008r2 Ent. Ed. 64-bitowy z 16 rdzeniami i 64 GB pamięci RAM. Istnieje jedna instancja całkowicie poprawionego serwera SQL na 20111014.
Maksymalny RAM jest ustawiony na 60000 MB. Ilość darmowego RAMu wynosi 0 według menedżera zadań po kilku dniach online.
Jeśli zmienię maksymalny RAM na poniżej 53 GB, po kilku dniach ustabilizuje się i otrzymam trochę wolnego RAM.
Jest to proces SQL, który alokuje pamięci RAM zgodnie z menedżerem zadań. Jak pogodzić się z tym, na czym tak naprawdę polega problem? Jest rzeczą oczywistą, że przeprowadziłem już wiele testów, ale jeszcze nie rozwiązałem tego według własnych upodobań. i och, nie dostajemy typowego głodu pamięci, gdy dostępny taran spada do 0 za darmo.
Aktualizacja 1:
Zainspirowany innym pytaniem dotyczącym pamięci RAM na tej stronie /dba//a/7062/2744 . Użyłem tych dwóch, aby zobaczyć, do czego używana jest pamięć RAM.
SELECT TOP ( 10 )
[type] AS [Memory Clerk Type] ,
SUM(single_pages_kb) AS [SPA Mem, Kb]
FROM sys.dm_os_memory_clerks
GROUP BY [type]
ORDER BY SUM(single_pages_kb) DESC
OPTION ( RECOMPILE ) ;
SELECT DB_NAME(database_id) AS [Database Name] ,
COUNT(*) * 8 / 1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
--WHERE database_id > 4 -- system databases
-- AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC
OPTION ( RECOMPILE ) ;
Pokazane przez nich kwoty to najpierw wybierz 7948432 Kb drugi 44030 57812 MB, czyli w sumie około 52 GB używane przez serwer sql ... więc gdzie poszła reszta mojej pamięci RAM? :-) Menedżer zadań pokazuje teraz buforowane 363, dostępne 401, wolne 40 i sqlservr.exe ma prywatny zestaw pamięci 64 459 656. Max Ram ustawiony na 60000 MB jak poprzednio.
źródło
Jak wspomniano, pula buforów i pamięć podręczna procedur dotyczą jedynych rzeczy kontrolowanych przez maksymalną pamięć serwera. Istnieje wiele innych rzeczy w SQL Server, które mogą zużywać pamięć poza tym limitem. Obejmują one (ale nie wyłącznie):
źródło
Począwszy od SQL 2012, single_pages_kb został zastąpiony przez pages_kb w tym DMV. https://msdn.microsoft.com/en-us/library/ms175019.aspx?f=255&MSPPError=-2147217396
Jeśli więc chcesz uruchomić zapytanie zawarte w pytaniu, na serwerze 2012+ usuń ciąg single_.
źródło
http://msdn.microsoft.com/en-us/library/ms178067.aspx
Aby zmniejszyć maksymalną pamięć serwera, konieczne może być ponowne uruchomienie programu SQL Server w celu zwolnienia pamięci.
Rozumiem, że jeśli strona w puli buforów nie została zapisana na dysku, nie zostanie zwolniona, dopóki nie zostanie zapisana.
Czy obniżenie ustawienia maksymalnej pamięci powoduje, że SQL Server wypłukuje brudne strony?
Mógł monitorować menedżera buforów w perfmon, aby to sprawdzić. Perfmon -> SQLServer: Menedżer buforów: Strony bazy danych
źródło
CHECKPOINT
operacji na bazach danych, ale opróżnia pamięć podręczną procedur. Jeśli zrestartujesz instancję tylko w celu zmiany ustawień pamięci, pamięć podręczna procedur będzie nie tylko zimna, ale pamięć podręczna danych również będzie zimna. Jeśli nie można zmniejszyć maksymalnej pamięci z powodu brudnych stron w pamięci, uruchomCHECKPOINT
polecenie w bazach danych, aby opróżnić brudne strony na dysk, a następnie zmień ustawienie pamięci w godzinach poza szczytem bez ponownego uruchamiania instancji.