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

19

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 souhaite que SQL utilise autant de RAM lors du traitement. Je veux juste qu'il redescende ensuite.

C'est potentiellement un double de SQL Server ne libérant pas de mémoire et de 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 ...

Rob Farley
la source
2
Qu'est-ce que ... un administrateur système se plaint de la RAM utilisée? Je deviens merdique quand la RAM N'EST PAS utilisée, parce que si elle n'est pas utilisée, ça va juste être gaspillé ...
Mark Henderson
Je ne comprends pas non plus, si la machine n'a pas besoin de mémoire - où est le problème? C'est ainsi que le système d'exploitation et ses applications fonctionnent normalement ... étant donné que la charge de travail ayant le service SQL inactif conserve la plupart de la mémoire lorsque rien d'autre n'a besoin, cela pourrait augmenter le temps de réponse et / ou les performances pour le prochain travail SQL de toute façon?
Oskar Duveborn
L'administrateur Windows estime que SQL met la machine à rude épreuve car le processus a tellement de RAM. Je sais que la boîte n'est pas soumise à une contrainte de SQL et je peux le démontrer en redémarrant le service SQL, montrant qu'il consomme seulement beaucoup de RAM lors de l'obtention des données pour le traitement SSAS. Je veux donc que SQL libère la mémoire pour montrer la quantité de RAM que SQL utilise le reste de la journée. Il ne s'agit pas de leur faire fournir plus de RAM, mais simplement de les empêcher de blâmer SQL pour des trucs.
Rob Farley
2
D'accord avec Farseeker, sysadmin devrait être heureux que la RAM soit utilisée. S'il n'est pas récupéré, le serveur n'en a pas besoin. Peut-être demander au sysadmin de regarder les défauts de page pour montrer que le système n'est pas stressé?
Nick Kavadias
2
Si votre administrateur système ne comprend pas ce que représentent les défauts de page et pourquoi avoir de la mémoire consommée, mais qu'aucun véritable défaut de page ne se produit n'est pas un problème, je ne sais pas comment vous aider. Vous ne pouvez pas réparer stupide. Une chose que vous pouvez faire, cependant, consiste à utiliser sp_configure pour configurer la mémoire maximale lorsque vous n'utilisez pas le système, et la configurer à sauvegarder lorsque vous en avez besoin. Cela semble assez idiot, cependant. sp_configureest généralement quelque chose que vous devez définir une fois et laisser seul.
Bacon Bits

Réponses:

12

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 Mémoire: Défauts de page / Sec pour montrer que SQL n'a pas mis la mémoire du système d'exploitation sous pression.

Blé Mitch
la source
2
Merci Mitch ... Permettez-moi de trouver ce fichier texte de 10 Go pour le bloc-notes.
Rob Farley
lol !, en fait ce n'est pas une mauvaise idée!
Mitch Wheat
peut-être utiliser un fichier de 2 Go ...
Mitch Wheat
5

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 entraînera 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.)

mrdenny
la source
1
J'espère que je peux utiliser un processus qui demandera à SQL la mémoire (après que les tampons ont été nettoyés et supprimés), mais sans avoir à paralyser la boîte pour le faire.
Rob Farley
Je ne pense pas qu'il existe un moyen de forcer le gestionnaire de mémoire Windows à demander la mémoire, sans forcer le problème par un autre moyen. Vous pourriez probablement écrire quelque chose qui frappe directement l'API win32 pour le faire, mais pour autant que je sache, la seule façon de déclencher Windows pour demander de la mémoire est de lui faire besoin de plus de mémoire pour un autre processus. Vérifiez avec Bob ou Paul, ils peuvent avoir plus d'informations.
mrdenny
3
Le pilote ballon de VMware fait exactement cela - il demande à Windows de plus en plus de mémoire pour que SQL Server (ou toute autre application) abandonne sa mémoire.
Brent Ozar
Ouais - j'espérais que je n'aurais pas à faire quelque chose comme ça.
Rob Farley
@BrentOzar, le pilote de ballon de VMware récupère uniquement la mémoire du cache système , pas la mémoire de processus réelle; il est conçu comme un moyen de dire au système d'exploitation "n'utilisez pas toute votre mémoire disponible pour des choses triviales", pas de le faire baisser.
Massimo
2

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 extrait 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 d'E / S. Mieux vaut laisser SQL gérer cela lui-même.

Remus Rusanu
la source
1
Salut Remus, le cache du tampon relationnel est volumineux suite au traitement d'un cube. Après cela, je veux vraiment que les caches soient nettoyées, supprimées et la mémoire retournée à Windows. DBCC DROPCLEANBUFFERS et FREESYSTEMCACHE vident le cache mais ne renvoient pas la mémoire à Windows, donc ce n'est pas complètement ce que je veux.
Rob Farley
2
En théorie, vous pourriez simuler la pression de la mémoire (par exemple, vous pourriez trampoline QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ) mais je n'irais vraiment pas vraiment là-bas. Si SQL ne libère pas de mémoire validée, c'est que le système d'exploitation n'en a pas besoin. Le système d'exploitation n'a pas besoin de mémoire car SQL est la seule application sur l'hôte ( stackoverflow.com/questions/1401834/… ), non? Si vous exécutez une autre application le long de SQL, vous l'aviez.
Remus Rusanu
2

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 64 machines bith 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 avoir à redémarrer le service, mais pas sûr de SSAS.

Jason Cumberland
la source
Avoir le capuchon est correct, mais je pense que je vais vouloir réduire la mémoire maximale après le traitement, puis la repousser, alors que je préfère nettoyer les tampons, les laisser tomber et demander à Windows une certaine pression sur la mémoire.
Rob Farley
1

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 réellement améliorer les performances du serveur car elle donne à Windows plus de RAM pour la mise en cache, etc.

Nick van Esch
la source