web-dev-qa-db-fra.com

Configuration de la mémoire maximale et minimale de SQL Server

Quels sont les paramètres corrects pour la mémoire minimale et maximale dans ce cas d'utilisation?

Le serveur a 8 Go de RAM, deux processeurs Intel Xeon, exécutant Windows Server 2008 R2/Sql Server 2008 Standard Edition. Il exécute plusieurs bases de données allant de 30 Go à 5 Go.

À l'origine, l'utilisation de la mémoire était réglée sur les paramètres par défaut (min = 0 max = 2 147 483 647). Sur ces paramètres, la majeure partie de l'utilisation de la mémoire a été absorbée par sqlservr.exe et le serveur devra finalement être redémarré tous les jours ou deux. Il s'exécuterait normalement au début, mais dans un délai d'un jour, le délai d'expiration pour des opérations simples comme la recherche d'un enregistrement à l'aide de la clé primaire.

J'ai changé min = 4 096 et max = 6 144. Cela se traduit par seulement 1,4 Go de mémoire. Cependant, maintenant, les quatre processeurs fonctionnent en permanence à 50-60% d'utilisation du processeur. Les tâches prennent environ 1/3 de plus à exécuter, bien que le serveur soit beaucoup plus stable.

8
sa555

En regardant votre RAM disponibilité pour ce serveur particulier et que vous exécutez plusieurs bases de données allant de 30 Go à 5 Go , vous certainement besoin de plus RAM sur ce serveur).

Vous n'avez pas mentionné qu'il s'agit d'une instance autonome ou que ce serveur a plus d'une instance de serveur SQL en cours d'exécution.

Vos paramètres de mémoire MAX semblent OK pour un serveur ayant 8 Go de RAM. Voir ces paramètres de bonnes pratiques suggérés de Glenn Berry .

Je vous recommande fortement de faire une base de référence de votre environnement en utilisant les compteurs PERFMON ci-dessous pour obtenir une bonne valeur de votre configuration de mémoire:

  • SQL Server: Gestionnaire de tampons\Espérance de vie de la page
  • SQL Server: Gestionnaire de tampons\Lectures de pages/s
  • Disque physique\Lectures de disque/s
  • Mémoire\Mo disponibles
  • SQL Server: Gestionnaire de mémoire - Mémoire totale du serveur
  • SQL Server: Gestionnaire de mémoire - Mémoire du serveur cible

Mémoire totale du serveur: quantité de mémoire actuellement allouée au pool de tampons et pas la quantité totale de mémoire à SQL Server

Mémoire du serveur cible: taille idéale du pool de tampons correspondant à la mémoire maximale de l'instance.

Remarque: Si la mémoire totale du serveur> la mémoire du serveur cible, cela suggère une pression mémoire.

Le script ci-dessous vous aidera à trouver les notifications de mémoire FAIBLE ou ÉLEVÉE de sys.dm_os_ring_buffers - session sur l'intégrité du système:

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

Quelques bonnes références:

10
Kin Shah