SQL Server Maximale und minimale Speicherkonfiguration

8

Was sind in diesem Anwendungsfall die richtigen Einstellungen für Min-Memory und Max-Memory?

Der Server verfügt über 8 GB RAM, zwei Intel Xeon-Prozessoren, auf denen Windows Server 2008 R2 / SQL Server 2008 Standard Edition ausgeführt wird. Es werden mehrere Datenbanken mit einer Größe von 30 GB bis 5 GB ausgeführt.

Ursprünglich war die Speichernutzung auf die Standardeinstellungen eingestellt (min = 0 max = 2.147.483.647). Bei diesen Einstellungen wurde der größte Teil der Speichernutzung von sqlservr.exe beansprucht, und der Server musste schließlich jeden oder jeden zweiten Tag neu gestartet werden. Es würde zunächst normal ausgeführt, aber innerhalb eines Tages beginnt das Zeitlimit für einfache Vorgänge wie das Nachschlagen eines Datensatzes mit dem Primärschlüssel.

Ich habe min = 4.096 und max = 6.144 geändert. Dies führt zu einer Speicherauslastung von nur 1,4 GB. Jetzt laufen jedoch alle vier CPUs konstant mit einer CPU-Auslastung von 50-60%. Die Ausführung von Aufgaben dauert ungefähr 1/3 länger, obwohl der Server viel stabiler ist.

sa555
quelle
Kaufen Sie mehr RAM und lassen Sie das Maximum auf Standard.
Remus Rusanu
4
@RemusRusanu Ich nehme an, Sie meinten min auf Standard!
Kin Shah
Wir haben sehr ähnliche Anwendungsfälle und ähnliche Probleme (Betriebssystem hat kein Mem, weil SQL alles erfasst), wenn Leute Praktiken vergessen. Unsere Praxis ist es, 0 als min und die Hälfte als max.
Paul
@kin nein, ich meine max . Ich sollte sagen, lassen Sie sowohl min als auch max auf den Standardwerten, aber ich habe nie verstanden, warum irgendjemand die min überhaupt ändern sollte ...
Remus Rusanu
1
@RemusRusanu Ich nahm an, dass es ein Tippfehler war, wie bei der Menge an internem Wissen, das Sie haben + Ihre ausgezeichneten Antworten. Ich würde jedoch nicht damit einverstanden sein, Max Memory als Standard zu belassen.
Kin Shah

Antworten:

10

Wenn Sie sich die RAM-Verfügbarkeit für diesen bestimmten Server ansehen und mehrere Datenbanken von 30 GB bis 5 GB ausführen, benötigen Sie definitiv mehr RAM auf diesem Server.

Sie haben nicht erwähnt, dass dies eine eigenständige Instanz ist oder auf diesem Server mehr als eine Instanz eines SQL-Servers ausgeführt wird.

Ihre MAX-Speichereinstellungen scheinen für einen Server mit 8 GB RAM in Ordnung zu sein. Sehen Sie sich diese empfohlenen Best-Practice-Einstellungen von Glenn Berry an .

Ich würde Ihnen dringend empfehlen, eine Basislinie Ihrer Umgebung mit den folgenden PERFMON-Zählern zu erstellen, um einen guten Wert Ihrer Speicherkonfiguration zu erhalten:

  • SQL Server: Puffermanager \ Lebenserwartung der Seite
  • SQL Server: Buffer Manager \ Seite liest / Sek
  • Physische Festplatte \ Festplattenlesevorgänge / Sek
  • Speicher \ Verfügbare MB
  • SQL Server: Memory Manager - Gesamter Serverspeicher
  • SQL Server: Memory Manager - Zielserverspeicher

Gesamtserverspeicher : Die derzeit dem Pufferpool zugewiesene Speichermenge und nicht die Gesamtspeichermenge für SQL Server

Zielserverspeicher: Ideale Größe des Pufferpools entsprechend dem maximalen Speicher für die Instanz.

Hinweis: Wenn Gesamtserverspeicher> Zielserverspeicher, wird ein Speicherdruck vorgeschlagen.

Das folgende Skript hilft Ihnen dabei, Benachrichtigungen über LOW oder HIGH Memory von sys.dm_os_ring_buffers- System Health Session zu finden:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Einige gute Referenzen:

Kin Shah
quelle
2
Sie haben den Gesamt- und Zielvergleich falsch herum, aber auf jeden Fall gibt es bessere Möglichkeiten, um festzustellen, ob der Server unter externem Speicherdruck steht.
Paul White 9
@paulwhite Kannst du bitte etwas mehr klarstellen, damit ich meine Antwort verbessern kann? Vielen Dank für Ihren Blick.
Kin Shah
Es ist eine eigenständige Instanz
sa555