Wirtualizacja jest bardzo popularna w organizacjach:pozwala im lepiej wykorzystywać sprzęt poprzez łączenie wielu serwerów na jednym hoście, zapewnia możliwości HA i zapewnia redukcję różnych kosztów, takich jak ogrzewanie/chłodzenie, licencje SQL Server i sprzęt. Brałem udział w wielu projektach z organizacjami, aby pomóc im w migracji ze środowisk fizycznych do wirtualnych i pomogłem im doświadczyć tych korzyści.
W tym artykule chcę się z Wami podzielić osobliwym problemem, na który natknąłem się podczas pracy z Hyper-V w systemie Windows Server 2012 R2 przy użyciu pamięci dynamicznej. Muszę przyznać, że większość mojej wiedzy na temat wirtualizacji dotyczyła VMware, jednak teraz to się zmienia.
Podczas pracy z SQL Serverem na VMware zawsze polecam ustawiać rezerwacje dla pamięci, więc kiedy natknąłem się na tę funkcję pamięci dynamicznej w Hyper-V, musiałem przeprowadzić pewne badania. Znalazłem artykuł (Przewodnik po konfiguracji pamięci dynamicznej Hyper-V), który wyjaśnia wiele korzyści i wymagań systemowych związanych z korzystaniem z pamięci dynamicznej. Ta funkcja jest całkiem fajna, ponieważ można zapewnić maszynie wirtualnej mniej lub więcej pamięci bez konieczności jej wyłączania.
Bawiąc się Hyper-V, odkryłem, że udostępnianie maszyn wirtualnych jest proste i łatwe do nauczenia. Przy niewielkim wysiłku udało mi się zbudować środowisko laboratoryjne, aby symulować doświadczenie, jakie miał mój klient. Podziękowania należą się mojemu szefowi za zapewnienie mi wspaniałego sprzętu do pracy. Używam Dell M6800 z procesorem i7, 32 GB pamięci RAM i dwoma dyskami SSD 1 TB. Ta bestia jest lepsza niż wiele serwerów, na których pracowałem.
Używając VMware Workstation 11 na moim laptopie, stworzyłem gościa Windows Server 2012 R2 z 4 procesorami wirtualnymi, 24 GB pamięci RAM i 100 GB pamięci masowej. Po utworzeniu i załataniu gościa dodałem rolę Hyper-V i udostępniłem gościa w Hyper-V. Nowy gość został zbudowany na systemie Windows Server 2012 R2 z 2 procesorami wirtualnymi, 22 GB pamięci RAM i 60 GB pamięci masowej z systemem SQL Server 2014 RTM.
Przeprowadziłem trzy zestawy testów, z których każdy używał pamięci dynamicznej. Do każdego testu użyłem generatora danych SQL firmy Red Gate w połączeniu z bazą danych AdventureWorks2014, aby zapełnić pulę buforów. W pierwszym teście zacząłem od 512 MB dla wartości Startup RAM, ponieważ jest to minimalna ilość pamięci do uruchomienia Windows Server 2012 R2, a pula buforów przestała rosnąć przy około 8 GB.
Przy każdym teście obcinam tabelę testową, wyłączam gościa, modyfikuję ustawienia pamięci i uruchamiam kopię zapasową gościa. W drugim teście zwiększyłem startową pamięć RAM do 768 MB, a pula buforów wzrosła tylko do nieco ponad 12 GB.
W trzecim i ostatnim teście zwiększono startową pamięć RAM do 1024 MB, uruchomiono generator danych i pulę buforów udało się zwiększyć do nieco poniżej 16 GB.
Wykonanie małej matematyki na tych wartościach pokazuje, że pula buforów nie może wzrosnąć więcej niż 16 razy w stosunku do startowej pamięci RAM. Może to być bardzo problematyczne dla SQL Server, jeśli startowa pamięć RAM jest mniejsza niż 1/16 maksymalnej pamięci. Pomyślmy o gościu Hyper-V z 64 GB pamięci RAM z uruchomionym programem SQL Server z wartością startowej pamięci RAM 1 GB. Zaobserwowaliśmy, że w tej konfiguracji pula buforów nie byłaby w stanie wykorzystać więcej niż 16 GB, ale jeśli ustawimy wartość startowej pamięci RAM na 4096 MB, pula buforów będzie mogła zwiększyć się 16 razy, co pozwoli nam wykorzystać wszystkie 64 GB.
Jedyne odniesienia, jakie udało mi się znaleźć na temat tego, dlaczego pula buforów jest ograniczona do 16-krotności wartości początkowej pamięci RAM, znajdują się na stronach 8 i 16 w oficjalnym dokumencie, Najlepsze praktyki uruchamiania programu SQL Server z HVDM. Ten dokument wyjaśnia, że ponieważ wartość pamięci podręcznej bufora jest obliczana podczas uruchamiania, jest to wartość statyczna i nie rośnie. Jeśli jednak SQL Server wykryje, że funkcja Hot Add Memory jest obsługiwana, zwiększa rozmiar zarezerwowany dla wirtualnej przestrzeni adresowej dla puli buforów o 16-krotność pamięci startowej. W tym dokumencie stwierdza się również, że to zachowanie dotyczy SQL Server 2008 R2 i wcześniejszych, jednak mój test został przeprowadzony na Windows Server 2012 R2 z SQL Server 2014, więc skontaktuję się z firmą Microsoft w celu zaktualizowania dokumentu najlepszych praktyk.
Ponieważ większość produkcyjnych administratorów baz danych nie udostępnia maszyn wirtualnych ani nie pracuje intensywnie w tej przestrzeni, a inżynierowie wirtualizacji nie studiują najnowszej i najlepszej technologii SQL Server, rozumiem, że ta ważna informacja o tym, jak pula buforów obsługuje pamięć dynamiczną, jest w dużej mierze nieznana ludzi.
Nawet śledzenie artykułów może wprowadzać w błąd. W artykule Hyper-V Dynamic Memory Configuration Guide, opis startowej pamięci RAM brzmi:
Określa ilość pamięci wymaganej do uruchomienia maszyny wirtualnej. Wartość musi być wystarczająco wysoka, aby umożliwić uruchomienie systemu operacyjnego gościa, ale powinna być jak najniższa, aby umożliwić optymalne wykorzystanie pamięci i potencjalnie wysokie współczynniki konsolidacji.Dla kogo optymalne wykorzystanie pamięci, gospodarza czy gościa? Gdyby administrator wirtualizacji czytał to, prawdopodobnie określiłby, że oznacza to minimalną ilość pamięci dozwoloną do uruchomienia systemu operacyjnego.
Bycie odpowiedzialnym za SQL Server oznacza, że musimy znać inne technologie, które mogą mieć wpływ na nasze środowisko. Wraz z wprowadzeniem sieci SAN i wirtualizacji musimy w pełni zrozumieć, w jaki sposób rzeczy w tych środowiskach mogą negatywnie wpłynąć na SQL Server i, co ważniejsze, jak skutecznie komunikować obawy osobom odpowiedzialnym za te systemy. Administrator nie musi koniecznie wiedzieć, jak aprowizować pamięć masową w sieci SAN lub jak aprowizować lub umieć administrować środowiskiem VMWare lub Hyper-V, ale powinien znać podstawy działania.
Znając podstawowe informacje o tym, jak sieć SAN współpracuje z macierzami pamięci masowej, sieciami pamięci masowej, wielościeżkami itp., a także o tym, jak hiperwizor współpracuje z harmonogramami procesorów i alokacją pamięci w ramach wirtualizacji, administrator DBA może lepiej komunikować się i rozwiązywać problemy w przypadku wystąpienia problemów . Przez lata z sukcesem współpracowałem z wieloma administratorami SAN i wirtualizacji przy tworzeniu standardów dla SQL Server. Standardy te są unikalne dla SQL Server i niekoniecznie dotyczą serwerów internetowych lub aplikacji.
Administratorzy baz danych nie mogą tak naprawdę polegać na administratorach sieci SAN i wirtualizacji, aby w pełni zrozumieć najlepsze praktyki dotyczące SQL Server, bez względu na to, jak bardzo by to nie było, dlatego musimy edukować się najlepiej, jak potrafimy, w jaki sposób ich obszary wiedzy mogą na nas wpłynąć.
Podczas moich testów użyłem zapytania z wpisu na blogu Paula Randala, Problemy z wydajnością ze zmarnowanej pamięci puli buforów, aby określić, ile puli buforów używa baza danych AdventureWorks2014. Poniżej zamieściłem kod:
SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME ([database_id]) END) AS [DatabaseName], COUNT (*) * 8 / 1024 AS [MBUsed], SUM (CAST ([free_space_in_bytes] AS BIGINT)) / (1024 * 1024) AS [MBEmpty] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id];
Ten kod jest również świetny do rozwiązywania problemów, które z baz danych zużywają większość puli buforów, dzięki czemu możesz wiedzieć, na której bazie danych powinieneś się skupić na dostrajaniu zapytań o wysokich kosztach. Jeśli prowadzisz sklep Hyper-V, skontaktuj się z administratorem, aby sprawdzić, czy pamięć dynamiczna może być skonfigurowana w taki sposób, że ma to negatywny wpływ na Twój serwer.