Comment contrôler l'utilisation excessive de RAM par SQL Server?

13

Le serveur de base de données que j'utilise exécute 6 instances SQL Server différentes. Il a 48 Go de RAM. Et l'un d'eux consomme plus de 10 Go de RAM, la consommation totale est de 20 Go pour l'instant. La consommation de RAM ne cesse de croître. Quelques jours avant, il utilisait plus de 40 Go de RAM et le serveur répondait très lentement. L'application montre les problèmes de plantage lors de l'enregistrement des données.

J'ai donc redémarré les services SQL Server.

Dès que les services ont été redémarrés, l'utilisation est tombée à 4 Go, mais elle augmente maintenant. Et je crains que cela n'augmente jusqu'à 40 Go en 4 ou 5 jours et ralentisse le serveur.

Le redémarrage du service n'est pas la bonne option, je suppose.

J'ai également découvert à partir de différentes sources que nous pouvons définir la taille maximale d'utilisation de la mémoire pour SQL Server. Et je ne sais pas trop si cela va aider ou non. Je ne peux pas tester cela car le serveur utilise la base de données de production et ce serait un risque si le service s'arrête lors de la modification du paramètre dans SQL Server.

Quelqu'un peut-il aider à résoudre ce problème?


la source
1
Par défaut, SQL utilisera autant de RAM que possible pour maximiser ses performances, c'est bien - cela signifie qu'il met en cache les requêtes et les résultats courants pour rendre votre application plus rapide. Il n'utilisera la RAM que jusqu'à la limite à laquelle la pagination des rapports du système d'exploitation peut se produire. Vous pouvez remplacer ce comportement. Voir cette documentation MS: Comment ajuster l'utilisation de la mémoire en utilisant les options de configuration dans SQL Server Cela peut également être utile: Comment déterminer les paramètres de configuration appropriés de SQL Server
4
Ce n'est PAS un problème - c'est le comportement conçu et par défaut pour SQL Server !! Et oui - redémarrer le processus SQL Server est une idée horrible ..... SQL Server met en cache autant de données et de pages d'index que possible - il optimise ainsi les performances globales du système. C'est la raison pour laquelle une machine SQL Server doit toujours être un serveur dédié - ne faisant rien d'autre que SQL Server.
marc_s
Oui je l'ai eu. Il est conçu de cette façon. Mais lorsque SQL Server utilise une grande partie de la mémoire, cela ralentit le serveur et entraîne l'expiration des rapports. Je veux donc empêcher le serveur SQL d'utiliser une mémoire limitée.
4
En fait, si SQL Server utilise autant de mémoire que possible, je dirais que cela rendrait moins probable la difficulté à fournir des rapports. C'est lorsque vous contraignez artificiellement SQL Server (ou placez trop d'instances sur une même boîte qui se disputent les ressources) où vous verrez des problèmes dus aux allocations de mémoire et à d'autres problèmes.
Aaron Bertrand
Mais je me demande pourquoi il a soudainement commencé à afficher les rapports bien après le redémarrage du service serveur SQL. Se peut-il que trop de clients utilisent l'application en raison de laquelle les rapports ne sont pas affichés?

Réponses:

14

C'est par conception. SQL Server est censé utiliser toute la mémoire disponible, car il stocke de plus en plus de données en mémoire de sorte qu'il n'a pas besoin de revenir sur le disque pour obtenir la même mémoire encore et encore.

Si vous devez limiter la quantité de mémoire utilisée par une seule instance SQL Server, vous pouvez le faire dans SQL Server Management Studio en cliquant avec le bouton droit sur le nom de l'instance dans l'Explorateur d'objets et en sélectionnant les propriétés. Sélectionnez ensuite l'onglet mémoire et définissez la quantité maximale de mémoire que SQL Server sera autorisé à utiliser. Maintenant, cela ne va pas limiter tous les aspects de SQL Server à cette quantité de mémoire. Cela contrôle uniquement le pool de tampons et le cache du plan d'exécution. Des choses comme CLR, Texte intégral, la mémoire réelle utilisée par les fichiers exe SQL Server, SQL Agent, les procédures stockées étendues, etc. ne sont pas contrôlées par ce paramètre. Cependant, ces autres choses n'ont généralement pas besoin de beaucoup de mémoire, ce sont le pool de tampons et le cache du plan d'exécution qui nécessitent la majeure partie de la mémoire.

Si vous définissez ce paramètre sur une seule instance, vous souhaiterez le définir sur toutes les instances afin qu'elles ne se piétinent pas.

mrdenny
la source