Question Comment obtenir SQL Server pour libérer sa mémoire?


Je sais que SQL aime la RAM, mais le libère à la demande de Windows. Je sais que c'est ainsi que SQL est censé fonctionner. Mais j'ai un administrateur Windows qui n'est pas convaincu que SQL va effectivement restituer la RAM, et sur ce serveur (virtuel) particulier, SQL n'a plus besoin de beaucoup une fois Analysis Services terminé, mais rien d'autre sur ce serveur ne se soucie de demander beaucoup à SQL.

J'essaie donc de rassurer les administrateurs Windows sur le fait que les problèmes liés à l'environnement virtuel ne sont pas dus au fait 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 heureusement 8 Go de RAM, mais comme il n’exerce aucune pression, il n’en libère pas beaucoup pendant une journée normale. Les gars de Windows hurlent, et il serait beaucoup plus agréable d’avoir cette version de SQL.

Je ne souhaite pas utiliser le paramètre de mémoire maximale, car je souhaite réellement que SQL utilise autant de RAM lors du traitement. Je veux juste que ça redescende après.

C'est potentiellement un duplicata des deux SQL Server ne libère pas de mémoire et Récupération de la mémoire de SQL Server, mais je me demande s’il existe une réponse différente. Attendre que Windows récupère, cela 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 ...


18
2018-02-01 05:29


origine


Qu'est-ce que ... un administrateur système se plaint de la mémoire RAM utilisée? Je me fais chier quand la RAM n'est pas utilisée, parce que si on ne l'utilise pas, ça va gâcher ... - 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 plus grande partie de la mémoire alors qu’elle n’en a pas besoin, son temps de réponse et / ou ses performances pourraient-ils augmenter de toute façon? - Oskar Duveborn
L'administrateur Windows estime que SQL sollicite la machine parce que le processus contient beaucoup de RAM. Je sais que la boîte de dialogue n’est pas soumise à des contraintes de la part de SQL et je peux en faire la démonstration en redémarrant le service SQL, ce qui montre qu’elle ne consomme que beaucoup de mémoire vive lors de l’obtention des données pour le traitement SSAS. Je souhaite donc que SQL libère la mémoire pour indiquer la quantité de RAM utilisée par SQL le reste de la journée. Il ne s'agit pas de les amener à fournir plus de RAM, mais simplement d'arrêter de blâmer SQL pour des choses. - Rob Farley
D'accord avec Farseeker, sysadmin devrait être heureux que RAM soit utilisée. S'il n'est pas récupéré, le serveur n'en a pas besoin. Peut-être demander à l'administrateur système de regarder les fautes de page pour montrer que le système n'est pas stressé? - Nick Kavadias
Si votre administrateur système ne comprend pas ce que représentent les défauts de page et pourquoi consommer de la mémoire, mais qu'il n'y ait aucun problème de page réel, je ne sais pas comment vous aider. Vous ne pouvez pas réparer stupide. Une chose que vous pouvez faire, cependant, est d'utiliser sp_configure pour configurer la mémoire maximale inutilisée lorsque vous n’utilisez pas le système et la configurer pour la sauvegarder lorsque vous en avez besoin. Cela semble assez stupide, cependant. sp_configure est généralement quelque chose que vous devez définir une fois et laisser seul. - Bacon Bits


Réponses:


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 publier.

J'aime la suggestion de @Nick Kavadias: surveiller le Mémoire: Défauts de page / sec compteur de performance pour montrer que SQL n'a pas mis la mémoire de l'OS sous pression.


12
2018-02-01 05:31



Merci Mitch ... Laissez-moi 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


Une façon de leur montrer que cela se produira consiste à laisser SQL Server mâcher toute la mémoire. Copiez ensuite un fichier volumineux sur le réseau (les gros fichiers de sauvegarde SQL sont parfaits pour cela). Cela entraînera le remplissage du cache système et Windows commencera à demander à SQL de récupérer sa mémoire. SQL commencera à retourner la mémoire au système d'exploitation jusqu'à ce qu'il atteigne votre paramètre de mémoire minimal.

(Désolé, la question n’a pas été posée entièrement sur Twitter, apparemment, il fallait plus de 140 caractères.)


5
2018-02-01 07:48



J'espère un processus que je pourrai utiliser et qui demandera à SQL de récupérer la mémoire (après le nettoyage et la suppression des mémoires tampons), 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 restitution de la mémoire, sans forcer le problème par un autre moyen. Vous pourriez probablement écrire quelque chose qui frappe directement l'API win32, mais pour autant que je sache, le seul moyen de demander à Windows de demander de la mémoire est de lui demander davantage de mémoire pour un autre processus. Vérifiez auprès de Bob ou Paul, ils peuvent avoir plus d'informations. - mrdenny
Le pilote de 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 ne pas avoir à faire quelque chose comme ça. - Rob Farley
@BrentOzar, le pilote de ballon VMware ne récupère que la mémoire du système cache, pas la mémoire de processus réelle; c'est conçu comme un moyen de dire à l'O.S. "ne pas utiliser toute votre mémoire disponible pour des choses triviales", ne pas la réduire. - Massimo


Vous parlez de «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>');

D'où 'nom de cache' est pris sys.dm_os_memory_clerks. La spec de DBCC FREESYSTEMCACHE ne mentionne que les pools de gouverneurs, mais beaucoup plus de caches peuvent être expulsés.

Mais si toute la mémoire est utilisée par le pool de mémoire tampon, l'éviction de l'ensemble du pool de mémoire tampon entraînera une dégradation considérable des performances et un important chargement d'E / S. Mieux vaut laisser SQL gérer cela lui-même.


2
2018-02-01 08:22



Bonjour Remus, le cache de mémoire tampon relationnel est volumineux après le traitement d’un cube. Après cela, je souhaite vraiment que les caches soient nettoyés, supprimés et que la mémoire soit restituée à Windows. DBCC DROPCLEANBUFFERS et FREESYSTEMCACHE vident le cache mais ne renvoient pas la mémoire à Windows, ce n'est donc pas tout à fait ce que je veux. - Rob Farley
En théorie, vous pouvez simuler une pression sur la mémoire (par exemple, vous pouvez trampoler QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx) mais je voudrais vraiment vraiment vraiment pas y aller. Si SQL ne libère pas de mémoire dédié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 de l'hôte (stackoverflow.com/questions/1401834/…), droite? Si vous exécutez une autre application le long de SQL, vous l'aviez à venir. - Remus Rusanu


Avec les moteurs AS et DS, vous pouvez limiter la mémoire afin qu’elle reste en dessous d’un seuil de sécurité; 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 le plafond de la mémoire en dessous de l'utilisation actuelle, vous réduirez la quantité de mémoire à la volée sans devoir redémarrer le service, mais vous n'êtes pas sûr de SSAS.


2
2018-02-02 17:53



Avoir la limite, ça va, mais je pense que je vais vouloir vider la mémoire maximale après le traitement, puis la repousser, quand je préfère nettoyer les mémoires tampons, les supprimer et demander à Windows une certaine pression de la mémoire. - Rob Farley


Le plus simple que j'ai trouvé est d'aller dans les propriétés de la mémoire du serveur, entrez une valeur plus petite, appliquez-vous, attendez quelques minutes et ajustez la configuration.

Nous avons également constaté que l'utilisation limitée de la mémoire par les serveurs SQL peut réellement améliorer les performances du serveur car elle donne plus de mémoire vive à Windows pour la mise en cache, etc.


0
2018-02-08 18:44