SQL Server 2008 R2 „Ghost Memory”?

12

Mamy dedykowaną maszynę SQL Server 2008 R2, w której występują dziwne problemy z pamięcią. Sam maszyna ma wiele zasobów, w tym dwa czterordzeniowe procesory, 16 GB pamięci RAM i 64-bitowy Windows Server 2008 R2 Enterprise (jest to Dell PowerEdge 2950) .

Dziwny problem polega na tym, że system zgłasza 82% używanej pamięci, ale sqlservr.exe zgłasza tylko 155 MB w użyciu. Powodem, dla którego podejrzewam, że jest to problem z serwerem SQL, jest to, że jeśli zrestartuję proces sqlservr.exe, zużycie pamięci powróci do normy na pewien czas.

Czy ktoś ma jakieś pomysły na to, jak mogę rozpocząć śledzenie tego problemu?

Dzięki, Jason

maszyna do pisania
źródło
3
Czy używasz użytkownika Zablokuj strony w pamięci, prawda? Jeśli tak, zablokowana pamięć nie będzie zgłaszana przez menedżera zadań. Aby uzyskać więcej informacji, zobacz blogs.technet.com/b/askperf/archive/2008/03/25/ ...
Mark S. Rasmussen
Mamy prawo użytkownika Zablokuj strony w pamięci na „Brak”. Mamy również ustawienie „Maksymalna pamięć serwera (w MB)” w domyślnej wartości int. MaxValue - czy uważasz, że może to powodować problem?
typefragger
4
Jedyne, co mnie martwi, to kiedy mój serwer SQL używa mniej niż 82%!
SqlACID

Odpowiedzi:

15

Nie uzyskasz prawdziwego obrazu wykorzystania pamięci od Menedżera zadań, jeśli konto, pod którym działa usługa, ma uprawnienia do blokowania stron (edycja: zgodnie z komentarzem / linkiem Marka Rasmussena). Aby określić, ile pamięci jest używane, możesz spojrzeć na:

  • SQLServer: Memory Manager \ Total Server Memory counter counter
  • DMV

Nie mogę sobie przypomnieć, czy istnieje DMV lub kombinacja, która da ci całkowity przydział pamięci, ale poniższe pokażą większość.

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);

Drugi jest zwykle najciekawszym, alokacja puli buforów według bazy danych. W tym miejscu zostanie wykorzystany udział lwów i przydatne może być zrozumienie, które z twoich baz danych są największymi konsumentami.

Mark Storey-Smith
źródło
Wow, bardzo dziękuję! To (szczególnie drugie) wyjaśniło mi to całkowicie!
typefragger
8

Jest ostatni artykuł z naszego własnego Brenta Ozara, który zajmuje się tą sprawą, gdy Menedżer zadań nie pokazuje poprawnie pamięci zajętej przez SQLServer i jego dodatkowe usługi. Można go znaleźć tutaj: Przewodnik Sysadmin po pamięci Microsoft SQL Server .

Cytat: „ Dlaczego SQLServer.exe nie używa dużej ilości pamięci?

Kiedy zdalny pulpit na serwer i patrzysz na Menedżera zadań, użycie Mem w sqlservr.exe zawsze wydaje się zwariowane. To nie wina SQL Servera. Menedżer zadań to brudny, brudny kłamca. (Wiem, wygląda na to, że facet SQL przerzuca winę, ale trzymaj się mnie przez chwilę.) W 64-bitowych urządzeniach liczba ta jest nieco dokładniejsza, ale w 32-bitowych urządzeniach jest to po prostu zupełnie nie na bazie . Aby naprawdę uzyskać dokładny obraz ilości pamięci używanej przez SQL Server, potrzebujesz narzędzia takiego jak Process Explorer i musisz zidentyfikować wszystkie procesy SQL Server. Na serwerze, który pokazałem po prawej stronie, są dwie instancje SQL Server (pokazane przez sqlservr.exe), a także narzędzia SQL Agent, SQL Browser i SQL Server do tworzenia kopii zapasowych. Nie jest niczym niezwykłym, że SQL Server Analysis Services, Integration Services i Reporting Services również działają na tym samym serwerze - z których wszystkie zużywają pamięć.

Ile pamięci używa SQL? Ułatwię ci to. SQL Server zużywa całą pamięć. Kropka."

Radzę więc wypróbować zapytanie Marka i użyć lepszego narzędzia do raportowania pamięci. Lub po prostu zaufaj Perfmonowi, który zgłosi pamięć, a nie Menedżer zadań.

Marian
źródło
-2

Ilość pamięci używanej przez SQL, jak pokazano w menedżerze zadań, będzie w większości ustawieniem maksymalnej pamięci. Oto jak działa ustawienie min./maks .:

Po uruchomieniu serwer SQL zaczyna pobierać pamięć do ustawienia minimalnej pamięci. W miarę wzrostu potrzebnego SQL, SQL zacznie zużywać więcej pamięci aż do ustawienia maksymalnej pamięci. Pamięć pozostaje wtedy w tym (maksymalnym) punkcie, nawet gdy zmniejsza się użycie SQL. To sprawia wrażenie, że SQL wykonuje ogromne zadania i zużywa tak dużo pamięci. W rzeczywistości pamięć ta jest zarezerwowana przez SQL.

Gdy na serwerze występuje presja pamięci inna niż SQL, SQL zwolni pamięć do punktu ustawienia minimalnej pamięci. W ten sposób wykorzystywane są ustawienia pamięci. Możesz użyć skryptów Marka, aby zobaczyć, jak SQL używa tej pamięci.

StanleyJohns
źródło
1
Min./maks. Zarządza przydziałami puli buforów, nic więcej. Jest to pierwszy wiersz w opisie opcji pamięci serwera w BOL. Ustawienia absolutnie nie mają związku z ustawieniami wyświetlanymi w menedżerze zadań. Opis Brenta „taskmgr” jako „brudny, obrzydliwy kłamca” podsumowuje sytuację, podobnie jak wszystkie, które przeczytałem.
Mark Storey-Smith
@ MarkStorey-Smith, proszę przeczytać treść poniżej linku w swoim komentarzu, to tylko wyjaśnia mój punkt widzenia. Menedżer zadań pokazuje wykorzystanie zasobów systemowych. Pula buforów nie jest zasobem systemowym. Wyjaśniam, co oznacza użycie pamięci przez SQL pokazane w menedżerze zadań. Mówisz o oczywistości, wspominając o puli buforów, ale to wciąż nie dowodzi, że się mylę.
StanleyJohns
Nie jestem pewien, jak lepiej to umieścić ... „Ilość pamięci wykorzystywanej przez SQL, jak pokazano w menedżerze zadań, będzie głównie ustawieniem maksymalnej pamięci. Tak działa ustawienie min / maks.”… Nie, to nie jest „t.
Mark Storey-Smith
„Tak działają ustawienia min / max:„ Na końcu znajduje się dwukropek, co oznacza, że ​​następuje wyjaśnienie, a nie to, że potwierdza poprzednie zdanie. :)
StanleyJohns
1
Jestem z Markiem. Przeczytaj blog Slava Oks : był członkiem zespołu MS, który napisał menedżera pamięci. Przejdź do nagłówka „pula buforów”. Cytuję „Pamiętaj, że SQL Server ma dwa ustawienia pamięci, które możesz kontrolować za pomocą sp_conifigure. Są to maks. I min. Pamięć serwera. Nie jestem pewien, czy wiesz, ale te dwa ustawienia naprawdę kontrolują wielkość puli buforów. Nie kontrolują one ogólnie ilość pamięci fizycznej zużyta przez SQL Server ”
gbn