Próbuję wymyślić rozsądny sposób, aby zrozumieć, czy max server memory (mb)
ustawienie jest odpowiednie (albo powinno być niższe, albo wyższe, albo pozostać takie, jakie jest). Wiem, że max server memory (mb)
zawsze powinna być wystarczająco niska, aby pozostawić miejsce dla samego systemu operacyjnego itp.
Środowisko, na które patrzę, ma kilkaset serwerów; Potrzebuję niezawodnej formuły, której mogę użyć, aby ustalić, czy obecny rozmiar puli buforów jest odpowiedni, ponieważ pamięć RAM jest naliczana za GB przydzielony każdemu serwerowi. Całe środowisko jest zwirtualizowane, a „fizyczną” pamięć RAM przydzieloną maszynie wirtualnej można łatwo zmienić w górę lub w dół.
Mam konkretną instancję serwera SQL, na którą teraz patrzę, z PLE równym 11000552 sekund, co odpowiada 12,7 dniom (czas działania serwera). Serwer ma maksymalne ustawienie pamięci serwera na 2560 MB (2,5 GB), z czego faktycznie tylko 1380 MB (1,3 GB) jest faktycznie zatwierdzone.
Przeczytałem kilka pozycji, w tym jedną autorstwa Jonathana Keheyiasa ( post ), drugą Paula Randala ( post ) i kilka innych. Jonathan opowiada się za zbyt niskim poziomem PLE poniżej 300 na 4 GB puli buforów. W przypadku powyższej instancji programu SQL Server 300 * (2.5 / 4) = 187
powoduje to naprawdę bardzo niski docelowy poziom PLE poniżej 300. Ta instancja zawiera 290 GB danych programu SQL Server (bez plików dziennika) i służy wyłącznie do testowania integracji. Zakładając, że ostatnie 12 dni jest typowe dla tego serwera, powiedziałbym, że max server memory (mb)
ustawienie można obniżyć.
Na drugim końcu skali mam inny serwer testowy integracji z PLE 294, który ma max server memory (mb)
ustawienie tylko 1 GB. Ten serwer ma tylko 224 MB danych SQL Server, nie wliczając dzienników, i obsługuje niektóre bazy danych BizFlow. Ten serwer może skorzystać z wyższego max server memory (mb)
ustawienia.
Myślę, że dobrym miejscem początkowym dla celów, którym można przypisać zbyt dużo pamięci , może być spojrzenie na:
SELECT
RamMB = physical_memory_in_bytes / 1048576
, BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576
, BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576
, PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed)
/ bpool_commit_target) * 100)
FROM sys.dm_os_sys_info;
Jeśli BufferPoolCommitTargetMB / BufferPoolCommittedMB
jest większa niż 1, serwer nie używa całej puli buforów. Jeśli dana maszyna ma również PLE większą niż „x”, może to być dobry kandydat na zmniejszenie max server memory (mb)
.
Ponieważ Buffer Manager:Lazy writes/sec
licznik wydajności śledzi, ile razy SQLOS zapisywał strony na dysk między punktami kontrolnymi z powodu presji pamięci, może to być kolejna dobra rzecz do obejrzenia.
DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;
SELECT @LazyWrites1 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
WAITFOR DELAY @WaitTime;
SELECT @LazyWrites2 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds;
Powyższy kod zakłada, że serwer jest obciążony w ciągu 15 sekund potrzebnych do uruchomienia, w przeciwnym razie zgłosi 0; co może wprowadzać w błąd fałszywie ujemny.
Czy powinienem także patrzeć na PAGELATCHIO_*
statystyki oczekiwania lub inny typ oczekiwania jako wskaźnik presji pamięci, czy jej braku?
Moje pytanie brzmi: w jaki sposób mogę wiarygodnie określić „dobrą” wartość docelową dla PLE i max server memory (mb)
?
źródło
max server memory (mb)
, i dlatego raczej nie chcę ich zmniejszać. Jednak niektóre inne instancje mają ponad 1 000 000 PLE i jako takie są dość oczywistymi potencjalnymi kandydatami na spadek pamięci RAM. Oczywiście, obniżenie RAM spowoduje wzrost IOPS, a nie jestem pewien, co koszt to będzie.max server memory
otoczeniem jest czymś w rodzaju kurczaka i jajka; im niższemax server memory
ustawienie, tym niższy byłby minimalny „akceptowalny” poziom PLE, więc mogłem utknąć w coraz niższej spirali. Jestem pewien, że, jak wspomniałeś, w pewnym momencie wpłynie to na wydajność użytkownika .Obecny T-SQL, którego używam do oceny PLE vs
max server memory
to:Ten kod porównuje PLE z minimalnym „akceptowalnym” PLE dla ilości
max server memory
skonfigurowanej przez system. Jeśli poziom PLE jest znacznie wyższy niż dopuszczalna liczba, sugeruje to maksymalnie 10% mniejmax server memory
. Jeśli poziom PLE jest niższy niż dopuszczalny poziom PLE, sugeruje to maksymalnie 10% więcejmax server memory
.Jeśli rzeczywista ilość zatwierdzonej puli buforów jest mniejsza niż docelowa wielkość puli buforów, sugeruje to obniżenie
max server memory
do tej ilości, a także trochę dodatkowej pamięci dla wątków, leniwych zapisów itp.Kod analizuje także różne liczniki wydajności, takie jak Lazy Writes / second, Free List Stalls i Batch Requests.
Kod nie jest idealny, udostępniam go tutaj, aby uzyskać dane wejściowe i z korzyścią dla przyszłych użytkowników SO.
źródło