web-dev-qa-db-fra.com

Comment puis-je obtenir SQL Server pour libérer sa mémoire?

Je sais que SQL aime la RAM, mais la libère lorsque Windows le demande. Je sais que c'est ainsi que SQL est censé fonctionner. Mais j'ai un administrateur Windows qui n'est pas convaincu que SQL retournera réellement la RAM, et sur ce serveur particulier (virtuel), SQL n'a pas besoin de beaucoup une fois Analysis Services terminé, mais il n'y a rien d'autre sur ce serveur qui dérange demandez beaucoup à SQL.

J'essaie donc de rassurer les administrateurs Windows que les problèmes avec l'environnement virtuel ne sont pas "parce que SQL utilise trop de RAM", mais je n'arrive pas à persuader SQL de le libérer sans redémarrer le service.

Lors du traitement des cubes, le service SQL prend volontiers 8 Go de RAM, mais comme il n'y a pas de pression, il n'en libère pas beaucoup pendant une journée normale. Les gars de Windows crient, et il serait bien plus agréable que SQL publie cela.

Je ne veux pas utiliser le paramètre de mémoire maximale, car je veux vraiment que SQL utilise autant RAM lors du traitement. Je veux juste qu'il redescende ensuite.

C'est potentiellement un doublon des deux SQL Server ne libère pas de mémoire et Récupération de mémoire à partir de SQL Server , mais je me demande s'il y a une réponse différente. Attendre que Windows récupère ne va pas convaincre les gars de Windows ici. Le redémarrage du service est une option, mais je ne suis vraiment pas fan de cette idée.

Je veux savoir comment demander à Windows de le récupérer ...

19
Rob Farley

Je crois que votre seule option est de redémarrer le service SQL ou d'exécuter une application qui consomme beaucoup de mémoire pour forcer SQL à le libérer.

J'aime la suggestion de @Nick Kavadias: surveiller le compteur de performances Memory: Page Faults/Sec pour montrer que SQL n'a pas mis la mémoire du système d'exploitation sous pression.

12
Mitch Wheat

Une façon de leur montrer qu'il fera cela est d'avoir SQL Server mâcher toute la mémoire. Copiez ensuite un énorme fichier sur le réseau (les gros fichiers de sauvegarde SQL fonctionnent très bien pour cela). Cela provoquera le remplissage du cache système et Windows commencera à demander à SQL sa mémoire. SQL commencera à renvoyer la mémoire au système d'exploitation jusqu'à ce qu'elle atteigne votre paramètre de mémoire minimum.

(Désolé, nous n'avons pas obtenu la totalité de la question via Twitter, plus de 140 caractères étaient apparemment nécessaires.)

5
mrdenny

Avec les moteurs AS et DS vous pouvez mettre un plafond sur la mémoire afin qu'ils restent en dessous d'un seuil sûr; ceci est recommandé sur les machines 64 bits avec beaucoup de RAM et/ou plusieurs instances de SQL. Pour au moins le moteur de base de données, si vous modifiez la limite de mémoire en dessous de l'utilisation actuelle, cela réduira la quantité de mémoire à la volée sans devoir redémarrer le service, pas sûr sur SSAS cependant.

2
Jason Cumberland

Vous mentionnez des "cubes", il n'est donc pas clair si vous parlez de moteur AS ou de moteur relationnel. Le moteur relationnel peut libérer de la mémoire à la demande:

DBCC FREESYSTEMCACHE('<cache name>');

Où 'nom du cache' est tiré de sys.dm_os_memory_clerks . La spécification de DBCC FREESYSTEMCACHE ne mentionne que les pools de gouverneurs, mais de nombreux autres caches peuvent être supprimés.

Mais si toute la mémoire est utilisée par le pool de tampons, l'expulsion de l'ensemble du pool de tampons entraînera une dégradation considérable des performances et une énorme charge IO. Mieux vaut laisser SQL gérer cela lui-même.

2
Remus Rusanu

Le plus simple que j'ai trouvé est d'aller dans les propriétés de la mémoire du serveur, d'entrer une valeur plus petite, d'appliquer, d'attendre quelques minutes et d'ajuster la configuration.

Nous avons également constaté que la limitation de l'utilisation de la mémoire des serveurs SQL peut en fait améliorer les performances du serveur car elle donne à Windows plus de RAM pour la mise en cache, etc.

1
Nick van Esch