Ich versuche, einen vernünftigen Weg zu finden, um zu verstehen, ob die max server memory (mb)
Einstellung angemessen ist (entweder sollte sie niedriger oder höher sein oder so bleiben, wie sie ist). Mir ist bewusst, dass max server memory (mb)
immer niedrig genug sein sollte, um Platz für das Betriebssystem selbst usw. zu lassen.
Die Umgebung, die ich betrachte, hat mehrere hundert Server; Ich benötige eine verlässliche Formel, mit der ich feststellen kann, ob die aktuelle Größe des Pufferpools angemessen ist, da der Arbeitsspeicher pro GB berechnet wird, das jedem Server zugewiesen ist. Die gesamte Umgebung ist virtualisiert, und der einer VM zugewiesene "physische" RAM kann problemlos nach oben oder unten geändert werden.
Ich habe eine bestimmte SQL Server-Instanz, die ich gerade mit einem PLE von 1.100.052 Sekunden betrachte, was 12,7 Tagen entspricht (die Zeitdauer, die der Server aktiv war). Der Server hat eine maximale Serverspeichereinstellung von 2560 MB (2,5 GB), von denen nur 1380 MB (1,3 GB) tatsächlich festgeschrieben sind.
Ich habe mehrere Artikel gelesen, darunter einen von Jonathan Keheyias ( Beitrag ) und einen von Paul Randal ( Beitrag ) sowie mehrere andere. Jonathan befürwortet die Überwachung eines PLE unter 300 pro 4 GB Pufferpool als zu niedrig. Für die obige SQL Server-Instanz 300 * (2.5 / 4) = 187
ergibt sich ein wirklich sehr niedriger Ziel-PLE-Wert unter 300. Diese Instanz verfügt über 290 GB SQL Server-Daten (ohne Protokolldateien) und wird nur für Integrationstests verwendet. Die letzten 12 Tage Unter der Annahme , ist repräsentativ für typische Verwendung für diesen Server, würde ich sagen , dass die max server memory (mb)
Einstellung könnte gesenkt werden.
Am anderen Ende der Skala habe ich einen weiteren Integrationstestserver mit einem PLE von 294, der eine max server memory (mb)
Einstellung von nur 1 GB hat. Dieser Server verfügt nur über 224 MB SQL Server-Daten ohne Protokolle und führt einige BizFlow-Datenbanken aus. Dieser Server kann von einer höheren max server memory (mb)
Einstellung profitieren .
Ich denke, ein guter Ausgangspunkt für Ziele, denen möglicherweise zu viel Speicher zugewiesen wurde, könnte Folgendes sein:
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;
Wenn BufferPoolCommitTargetMB / BufferPoolCommittedMB
größer als 1 ist, verwendet der Server nicht den gesamten Pufferpool. Wenn die betreffende Maschine auch einen PLE von mehr als "x" hat, ist dies möglicherweise ein guter Kandidat für eine Verringerung von max server memory (mb)
.
Da der Buffer Manager:Lazy writes/sec
Leistungsindikator nachverfolgt, wie oft SQLOS aufgrund des Speicherdrucks Seiten zwischen Checkpoints auf die Festplatte geschrieben hat, ist dies möglicherweise eine weitere gute Sache.
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;
Bei dem obigen Code wird davon ausgegangen, dass der Server während der 15 Sekunden, die für die Ausführung benötigt werden, ausgelastet ist. Andernfalls wird 0 gemeldet. Das könnte eine irreführende falsch-negative sein.
Sollte ich auch PAGELATCHIO_*
Wartestatistiken oder einen anderen Wartetyp als Indikator für den Speicherdruck oder einen Mangel daran betrachten?
Meine Frage ist, wie kann ich einen "guten" Zielwert für PLE und zuverlässig ermitteln max server memory (mb)
?
quelle
max server memory (mb)
, und daher zögere ich es ziemlich, sie zu verkleinern. Einige andere Instanzen haben jedoch mehr als 1.000.000 PLE und sind daher ziemlich offensichtliche potenzielle Kandidaten für einen RAM-Rückgang. Offensichtlich RAM Senkung wird eine Erhöhung der IOps verursachen, und ich bin nicht sicher , was die Kosten für das sein wird.max server memory
ist es eine Art Henne-Ei-Sache, PLE im Vergleich zum Setting zu betrachten.max server memory
Je niedriger die Einstellung, desto niedriger ist der minimale "akzeptable" PLE, sodass ich in einer immer tiefer werdenden Spirale stecken bleiben könnte. Ich bin mir sicher, dass, wie Sie bereits erwähnt haben, die Leistung der Benutzer irgendwann beeinträchtigt sein wird.Das aktuelle T-SQL, mit dem ich PLE vs auswerte,
max server memory
ist:Dieser Code vergleicht die PLE mit einer minimalen "akzeptablen" PLE für die Menge, die
max server memory
das System konfiguriert hat. Wenn der PLE merklich höher als die akzeptable Zahl ist, schlägt er ein Maximum von 10% niedriger vormax server memory
. Wenn der PLE niedriger als der akzeptable PLE ist, werden maximal 10% mehr vorgeschlagenmax server memory
.Wenn die tatsächliche Größe des zugesicherten Pufferpools geringer ist als die Größe des Zielpufferpools, wird eine Reduzierung
max server memory
auf diese Größe sowie zusätzlicher Speicher für Threads, verzögerte Schreibvorgänge usw. empfohlen.Der Code untersucht auch verschiedene Leistungsindikatoren für Dinge wie Lazy Writes / second, Free List Stalls und Batch Requests.
Der Code ist nicht perfekt. Ich teile ihn hier, um Eingaben zu erhalten und zum Nutzen zukünftiger SO-Benutzer.
quelle