Mam instancję programu SQL Server 2012 SP2 Enterprise Edition, która zużywa około 20 GB pamięci więcej niż maksimum. limit pamięci. Wystąpienie jest ograniczone do 65 GB, ale pamięć fizyczna używana z poniższego zapytania pokazuje 86 GB
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Serwer jest fizyczny z 2 węzłami NUMA. Czy istnieje sposób, aby dowiedzieć się, co zajmuje pamięć poza pulą buforów (zakładam, że tak się dzieje)?
Oto wynik DBCC MEMORYSTATUS: -
A oto ustawiony limit pamięci: -
Z góry dziękuję.
AKTUALIZACJA: - Uruchomiłem zapytanie zasugerowane przez Aarona
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Oto wynik: -
SUM strony pages_kb wynosi ~ 60 GB
AKTUALIZACJA 2: - Pełna wersja DBCC MEMORYSTATUS znajduje się tutaj: - http://pastebin.com/nGn6kXEc
AKTUALIZACJA 3: - Dane wyjściowe skryptów Shanky w pliku Excel tutaj: - http://jmp.sh/LKRlH4K
AKTUALIZACJA 4: - Zrzut ekranu wyników: -
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
To wydaje się wskazywać, że SQL Server używa więcej niż 65 GB zestawu.
źródło
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Odpowiedzi:
Maksymalna pamięć serwera kontroluje pulę buforów i wszystkie alokacje wielkości strony, ale nadal nie kontroluje takich rzeczy, jak bezpośrednie alokacje Windows (serwery połączone, sp_OA, XP), pamięć wymagana dla stosów wątków / wątków itp .
Prawdopodobnie możesz spodziewać się, że będzie wyższy na NUMA (chociaż nie jestem pewien, czy 20 GB jest normalne); chodzi o to, że nie można oczekiwać, że maksymalna pamięć serwera w pełni kontroluje pamięć używaną przez wystąpienie programu SQL Server. Jeśli chcesz, aby cała instancja (nie tylko pula buforów, plany pamięci podręcznej i CLR) używała nie więcej niż 64 GB, powinieneś ustawić maksymalną pamięć serwera na coś niższego.
Kilka potencjalnych pomysłów na śledzenie tego (normalizuję wszystko do MB):
liczniki wydajności
Sprawdź, czy coś wyskoczy tutaj jako zbyt duże:
20 najlepszych urzędników
Już to zrobiłeś, ale dla kompletności:
rozmiar stosu nici
Najpierw upewnij się, że jest to zero, a nie jakaś niestandardowa liczba (jeśli nie jest to 0, dowiedz się dlaczego i napraw ją):
Ale możesz również zobaczyć, ile pamięci zajmują stosy wątków, używając:
Załadowano moduły innych firm
DMV związane z pamięcią
Możesz także zauważyć coś niezwykłego, patrząc na te DMV:
Ten artykuł został napisany przed SQL Server 2012, więc niektóre nazwy kolumn i obliczenia mogą wymagać dostosowania, ale mogą też dać inne możliwości:
Dobre tło w innym artykule na tej stronie:
Kilka dobrych informacji o rodzajach rzeczy korzystających z pamięci poza
max server memory
(ale brak dobrych danych o tym, jak zebrać faktyczne użycie):źródło
Mam poniżej definicji od Boba Dorra o tym, jaka pamięć Max serwera kontroluje w SQL Server 2012. Możesz również przeczytać Books Online, aby uzyskać więcej informacji
Przydzielona pamięć dla stosu wątków, DLL innej firmy, Połączony dostawca serwerów, który jest inny niż Microsoft (jak MySQL.PostgreSQL itp.) Lub dowolna biblioteka DLL załadowana w przestrzeni adresowej SQL Server, która nie jest SQL Server, jest przydzielana poza maksymalną pamięcią serwera. Operacja tworzenia kopii zapasowych IIRC w programie SQL Server 2012 nadal ma przydzieloną pamięć poza pulą buforów.
Czy używasz połączonego serwera do wysyłania zapytań do innych RDBMS? Wszelkie inne oprogramowanie zainstalowane na tym samym komputerze z systemem Windows. Czy możesz opublikować w jakiejś wspólnej lokalizacji wynik następujących zapytań
Czy możesz również przesłać pełne
DBCC MMEMORYSTATUS
dane wyjściowe do udostępnionej lokalizacji i opublikować link tutaj. Pomogłoby to zrozumieć, który składnik zajmuje pamięćEdycja: Zgodnie z danymi wyjściowymi memorystatus dbcc widzę 2 węzły NUMA, a pamięć wykorzystywana przez każdy węzeł wynosi około
Znowu, jeśli widzisz Memory Manager w memorystatus wyprowadza go
Zatwierdzona maszyna wirtualna jest faktycznie pamięcią wirtualną zatwierdzoną przez program SQL Server, a ponieważ pamięć ta została zatwierdzona, tak się stało
physical memory backing it
. To znowu sprawia, że myślę, że SQL Server używa 65 G ustawionego w maksymalnej pamięci serweraTo jest maksymalna pamięć serwera. Więc pamięć jest dobrze rozdzielona między oba węzły. Możesz również dodać dane wyjściowe poniżej zapytania jutro, aby sprawdzić. Dodaj zrzut ekranu
źródło
select * from sys.dm_so_process_memory