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


8

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 éventuellement ê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, les quatre processeurs fonctionnent désormais à 50-60% d'utilisation du processeur en permanence. Les tâches prennent environ 1/3 de plus à exécuter, bien que le serveur soit beaucoup plus stable.


Achetez plus de RAM et laissez le maximum par défaut.
Remus Rusanu

4
@RemusRusanu Je suppose que vous vouliez dire min par défaut!
Kin Shah

Nous avons des cas d'utilisation très similaires et des problèmes similaires (le système d'exploitation n'ayant pas de mem à cause de SQL qui saisit tout) lorsque les gens oublient les pratiques. Notre pratique est d'utiliser 0 comme min et la moitié disponible comme max.
Paul

@kin non, je veux dire max . Je devrais dire de laisser les valeurs min et max aux valeurs par défaut, mais je n'ai jamais compris pourquoi quelqu'un changerait le min de toute façon ...
Remus Rusanu

1
@RemusRusanu J'ai supposé que c'était une faute de frappe, comme avec la quantité de connaissances internes que vous avez + vos excellentes réponses. Je serais cependant en désaccord avec le fait de laisser la mémoire Max par défaut.
Kin Shah

Réponses:


10

En regardant la disponibilité de votre RAM pour ce serveur particulier et que vous exécutez plusieurs bases de données allant de 30 Go à 5 Go , vous avez certainement besoin de plus de 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. Consultez ces paramètres de bonnes pratiques suggérés par 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 mémoire tampon et non 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_buffersla session de santé 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:


2
Vous avez la comparaison totale et cible dans le mauvais sens, mais dans tous les cas, il existe de meilleures façons de déterminer si le serveur est soumis à une pression de mémoire externe.
Paul White 9

@paulwhite pouvez-vous clarifier un peu plus afin que je puisse améliorer ma réponse? Merci d'avoir cherché.
Kin Shah

C'est une instance autonome
sa555
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.