Nous avons une base de données avec une charge de travail mixte OLAP/OLTP. Les requêtes sont assez ponctuelles et sont créées dynamiquement dans le serveur d'applications de niveau intermédiaire. Lorsque nous démarrons le serveur, les performances sont tout à fait acceptables, mais la consommation de mémoire augmente de plus en plus jusqu'à ce que toute la mémoire disponible (30 Go) soit épuisée. Après cela, le système devient de plus en plus lent.
Des commandes comme Dbcc freeproccache
n'a aucun effet.
Il n'y a pas beaucoup de transactions dans select * from sys.dm_tran_session_transactions
(pas plus que lorsque le système fonctionne bien), cette liste est parfois vide.
Le premier résultat de dbcc memorystatus
est
VM Reserved 42136628
VM Committed 1487176
Locked Pages Allocated 24994048
Reserved Memory 1024
Reserved Memory In Use 0
Un redémarrage de SQL Server résout le problème pendant un certain temps.
Le serveur fonctionne sur du matériel dédié (pas une VM). Nous avions des emplois programmés, mais nous les avons désactivés pendant un certain temps, sans changement. Il existe d'autres applications de niveau intermédiaire exécutées sur le même serveur, mais elles n'utilisent pas plus de 2 Go de mémoire, un processeur négligeable et presque aucune E/S. Nous avons redémarré toutes ces applications sans changement.
Je suggérerais de collecter des mesures de performances sur ce serveur, afin que vous puissiez éliminer les conjectures de dépannage de ces types de problèmes. Voir cet article pour un guide plus complet si vous ne savez pas par où commencer.
En particulier, je vérifierais les compteurs de performances Memory\Available MBytes
Et Paging File(_Total)\% Usage
parce que vous avez dit que les problèmes ne se produisent que lorsque le pool de mémoire tampon est plein. Les chiffres que vous obtenez de ces compteurs peuvent indiquer que le paramètre de mémoire maximale du serveur doit être ajusté (vers le haut ou vers le bas) pour la quantité de mémoire physique allouée au serveur. Comme je l'ai mentionné ici , je ne recommande pas de baser le paramètre de mémoire maximale sur la quantité de mémoire physique, sauf comme une estimation éclairée d'un point de départ . Toujours mesurer le résultat et ajuster à partir de là.
Si la quantité de mémoire libre est trop faible (<500) ou si l'utilisation du fichier d'échange est supérieure à zéro , cela peut indiquer que l'instance SQL Server est sur-engagé: sur SQL Server 2008 R2, le paramètre de mémoire maximale du serveur contrôle uniquement la taille du pool de mémoire tampon, et non toute autre utilisation de la mémoire telle que le cache du plan. SQL Server ne se soucie pas non plus des autres applications que vous pourriez avoir en cours d'exécution sur le système. Cette utilisation supplémentaire de la mémoire peut exercer une pression sur la mémoire de Windows - ou des autres applications - pouvant entraîner un échange de disque. C'est quelque chose que vous voulez éviter à tout prix, en particulier si le fichier d'échange existe sur un volume soutenu par un simple miroir RAID 1. Mon sentiment est que c'est le problème, et la suppression du paramètre de mémoire maximale du serveur devrait résoudre le problème.
Si la quantité de mémoire libre est élevée (> 1000) et que l'utilisation du fichier d'échange est nulle, vous pouvez probablement augmenter légèrement la mémoire maximale du serveur (par incréments de 256 Mo) pour maximiser l'utilisation de la mémoire du serveur. Cela ne résoudra probablement pas le problème, cependant, et vous devrez regarder ailleurs, probablement sur les compteurs de disques physiques et l'espérance de vie de la page du pool de mémoire tampon. Si les requêtes détruisent le pool de mémoire tampon, vous ne pouvez rien faire sauf améliorer les performances du disque, augmenter la quantité de mémoire physique disponible pour le serveur afin que toutes les pages de données puissent tenir en mémoire en même temps ou modifier la base de données pour ne pas en prendre autant l'espace physique (peut-être en utilisant la compression des lignes ou des pages, ou en reconstruisant les index avec un FILLFACTOR
plus élevé).
J'ai publié un article sur ce sujet ici qui approfondit ce problème et comment le résoudre.
En règle générale, la tendance à la lenteur dans le temps devrait être inversée, car à mesure que les pages de bases de données se déplacent dans le cache, les performances devraient s'améliorer (l'espérance de vie des pages et le taux de réussite du tampon augmentent avec le temps), avez-vous défini votre mémoire maximale sur (total_physical_mem - 2 Go)?
Il semble que quelques-unes de vos requêtes entraînent la sortie et la mise en page de SQL Server dans beaucoup de choses. Vous pouvez essayer gouverneur de ressources pour limiter la consommation de mémoire des grandes requêtes et des moyennes, afin que les requêtes d'application disposent toujours de suffisamment de mémoire tampon.