web-dev-qa-db-fra.com

Comment forcer SQL Server à libérer de la mémoire?

Quel est un bon moyen de vérifier combien de mémoire (réelle) est actuellement utilisé par rapport à combien SQL Server est-il alloué?

J'ai eu recours à memory_utilization_‌ pourcentage mais cela ne semble pas changer après l'exécution suivante pour libérer de la mémoire.

SELECT  [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
        [Memory_utilization_percentage] = memory_utilization_percentage 
FROM    sys.dm_os_process_memory;

DBCC FREESYSTEMCACHE ('ALL')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

SELECT  [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
        [Memory_utilization_percentage] = memory_utilization_percentage 
FROM    sys.dm_os_process_memory;

Une solution consiste à supprimer max serveur mémoire pour SQL Server et à l'augmenter de nouveau pour forcer SQL Server à libérer de la mémoire non utilisée mais allouée. Cependant, un problème avec cette approche est que nous ne pouvons pas savoir dans quelle mesure réduire max la mémoire du serveur , nous courons donc le risque de tuer SQL Server. C'est pourquoi il est important de comprendre la quantité réellement utilisée par SQL Server avant de réduire la valeur de max server memory .

15
Tigerjz32

Je n'ai pas de solution pour libérer la mémoire allouée. Cependant, nous avons pu déterminer comment permettre aux clusters actif-actif de fonctionner en toute sécurité. Nous avons décidé de définir mémoire minimale du serveur sur ~ 2 Go. Cela est utile car, quelle que soit la quantité de mémoire maximale qu'une instance décide d'utiliser, les autres instances ne seront jamais saturées en mémoire. Encore une fois, cela résout notre objectif, mais cela ne répond toujours pas à la question de la quantité de mémoire réellement utilisée, de la quantité de mémoire pouvant être réduite au maximum, etc.

0
Tigerjz32

SQL Server suppose toujours qu'il s'agit de l'application principale en cours d'exécution. Il n'est pas conçu pour partager des ressources. Elle utilisera toujours toute la mémoire disponible et ne la libèrera que pour le système d'exploitation, à moins que vous n'utilisiez la «mémoire maximale du serveur». 

De par sa conception, Sql Server ne fonctionne pas bien avec les autres. 

Cet article de sqlskills recommande une base de référence pour la régulation, suivie de la surveillance et de la relance au besoin:

https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/

3
RGME

Le script modifié ci-dessous a fonctionné pour moi. Je devais libérer temporairement un groupe de RAM détenu par SQLServer afin que nous puissions exécuter d'autres processus uniques sur le même serveur. Il libère temporairement l'espace mémoire réservé de SQL tout en lui permettant de restaurer la mémoire si nécessaire.

J'ai ajouté une attente intégrée pour permettre à SQLServer de publier le mem avant de le ramener au niveau d'origine. Évidemment, ajustez les valeurs selon vos besoins.

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
/*** Drop the max down to 64GB temporarily ***/
sp_configure 'max server memory', 65536;  --64GB
GO  
RECONFIGURE;  
GO  
/**** Wait a couple minutes to let SQLServer to naturally release the RAM..... ****/
WAITFOR DELAY '00:02:00'; 
GO
/** now bump it back up to "lots of RAM"! ****/
sp_configure 'max server memory', 215040;    --210 GB
GO  
RECONFIGURE;    
GO  
1
NumericOverflow