Si les utilisateurs de votre base de données se plaignent que les performances de SQL Server ont été médiocres ces derniers temps, il est possible que vous subissiez les effets d'un ou plusieurs goulots d'étranglement de SQL Server. Ces goulots d'étranglement se produisent pour diverses raisons, mais ils surviennent fréquemment à la suite de problèmes de mémoire, d'E/S ou de CPU.
Bien qu'il ne soit pas toujours facile de déterminer si les problèmes de performances proviennent d'un goulot d'étranglement SQL Server ou d'une autre source, vous pouvez rechercher ces symptômes courants de goulots d'étranglement pour affiner votre recherche de la source du problème.
Symptômes courants des goulots d'étranglement SQL Server
- SQL Server monopolise le processeur
- Délai d'exécution plus long des requêtes
- E/S excessives
- Journal des applications affichant les messages de mémoire insuffisante
- Activité extrême sur les disques
- Longs temps d'attente par E/S
L'apparition soudaine d'un ou plusieurs de ces symptômes est une bonne indication que vous avez un goulot d'étranglement SQL Server quelque part dans votre système. Maintenant, c'est à vous de le trouver.
Types de goulots d'étranglement SQL Server
Il existe trois principaux types de goulots d'étranglement SQL Server :la mémoire, les E/S et le processeur. Il est important que les administrateurs de base de données connaissent les causes, les symptômes et les correctifs de chacun afin qu'ils puissent identifier et supprimer rapidement les goulots d'étranglement et minimiser l'impact des performances médiocres. Nous avons également inclus certains des meilleurs compteurs de performances à surveiller qui aideront à identifier immédiatement les goulots d'étranglement des performances.
Goulets d'étranglement de la mémoire
Les goulots d'étranglement de la mémoire sont généralement le résultat de ressources mémoire insuffisantes ou d'activités SQL Server consommant de la mémoire disponible. Les symptômes à surveiller incluent des temps d'exécution de requête plus longs, des E/S excessives, des messages de mémoire insuffisante dans le journal des applications et des plantages fréquents du système.
Les meilleurs moyens d'éviter les goulots d'étranglement liés à la mémoire consistent à utiliser un optimiseur de requêtes pour se débarrasser des requêtes inutiles ou obsolètes et à configurer l'espérance de vie des pages en conjonction avec le taux d'accès au cache tampon pour limiter les déplacements vers le disque. S'il est trop tard pour éviter le goulot d'étranglement, essayez d'examiner et de régler les requêtes, de reconfigurer la mémoire ou d'ajouter de la mémoire physique.
Compteurs à surveiller :mémoire disponible, mémoire totale du serveur, mémoire du serveur cible, pages/s, taux d'accès au cache de tampon
Goulots d'étranglement d'E/S
Lorsqu'il n'y a pas assez de stockage disponible pour prendre en charge les opérations de base de données régulières telles que TempDB, des goulots d'étranglement d'E/S sont susceptibles de se produire. Les temps de réponse longs, les ralentissements des applications et les délais d'expiration fréquents des tâches sont tous des indicateurs clés indiquant que vous avez un goulot d'étranglement d'E/S.
Vous pouvez éviter ce type de goulot d'étranglement en configurant une surveillance avec des alarmes et des alertes de seuil pour identifier les activités qui utilisent des quantités excessives de stockage. Si un goulot d'étranglement d'E/S se produit, limitez la lecture et l'écriture des pages de base de données vers et depuis le disque. Cela vous obligera à vérifier et à corriger les analyses d'index fréquentes, les requêtes inefficaces et les statistiques obsolètes.
Compteurs à surveiller :longueur moyenne de la file d'attente du disque, moyenne des secondes de disque/lecture, moyenne des secondes de disque/écriture, % de temps de disque, moyenne des lectures de disque/seconde, moyenne des écritures de disque/seconde
Goulets d'étranglement du processeur
La principale cause de goulots d'étranglement du processeur est l'insuffisance des ressources matérielles. Il est assez facile d'identifier ce goulot d'étranglement en vérifiant vos journaux pour déterminer si SQL Server utilise un processeur excessif.
Dans un monde idéal, vous pourriez éviter les goulots d'étranglement du processeur en ayant un serveur dédié uniquement à SQL Server et en exécutant tous les autres logiciels sur une autre machine. Comme ce n'est pas une option pour la plupart des DBA, vous devrez savoir comment débloquer votre CPU.
La première étape consiste à identifier les porcs CPU. Une fois que vous savez où se situe le problème, vous pouvez régler les requêtes, améliorer vos plans d'exécution ou reconfigurer le système.
Compteurs à surveiller :% de temps processeur, requêtes par lots/sec, compilations SQL/sec, recompilations SQL/sec
Une histoire sur les goulots d'étranglement des performances de SQL Server
"Nous devons gérer certains goulots d'étranglement des performances de SQL Server", a déclaré mon patron, un vendredi en fin de journée.
"Comment le sais-tu?" J'ai demandé.
« Les ventes se plaignent du ralentissement de leur base de données ces derniers temps. Nous devons voir ce qui se passe."
"D'ACCORD. Je vais réserver une salle de conférence pour que nous puissions nous asseoir et travailler là-dessus."
"Ne vous inquiétez pas", a déclaré le patron. « Il est tard un vendredi après-midi. Cela signifie que la meilleure façon d'étudier les goulots d'étranglement est avec quelques-uns des nôtres. Nous allons au Pike Pub sur le marché."
Nous sommes entrés dans un bar niché dans le marché de Pike Place et avons trouvé une petite table près de la fenêtre.
"Quel est votre type de goulot d'étranglement préféré ?" a demandé le patron.
J'ai dit que j'avais un faible pour une Naughty Nellie dans le goulot d'étranglement de 22 onces.
"Bon choix", a déclaré le patron. "Vous commandez ça, et je prendrai la Citrus Summer Ale."
Pendant que nous attendions que nos goulots d'étranglement arrivent, nous nous sommes mis au travail sur les goulots d'étranglement des performances de SQL Server.
"Nous devrons vérifier les problèmes à plusieurs endroits", a déclaré le patron. « Il peut s'agir de problèmes de mémoire, de stockage ou de processeurs, mais ils se ressemblent tous pour les utilisateurs, n'est-ce pas ? Performances minables.
"Les problèmes de CPU ne sont pas si difficiles à trouver. Si tel est le problème, nous verrons que SQL Server accapare le processeur et le fait grimper tout le temps.
"S'il s'agit d'un problème de mémoire, nous verrons des choses comme des temps d'exécution plus longs sur les requêtes et plus d'E/S car l'application doit continuer à s'exécuter sur le disque. Nous pouvons également vérifier le journal des applications pour les messages de mémoire insuffisante.
"Et si le goulot d'étranglement est dans le stockage, nous verrons une activité extrême sur les disques et de longs temps d'attente par E/S."
Nos goulots d'étranglement sont arrivés. Nous les avons étudiés attentivement tout en approfondissant le problème des performances.
Les nombreuses sources potentielles de goulots d'étranglement des performances de SQL Server
"Et s'il s'agit d'un problème d'E/S ?" J'ai demandé. "Nous devrions voir si le temps d'attente WRITELOG est trop élevé par rapport au temps d'attente total. Ou, en parlant d'E/S, il y a peut-être un problème dans le SQL lui-même. S'il y a du code inefficace, comme un NESTED LOOP JOIN sur une table énorme, le SQL pourrait demander de lire des lignes sur la table interne des millions de fois. Cela pénaliserait vraiment les performances.
"Peut-être", a déclaré le patron. « Les opérations de jointure et de tri complexes peuvent être difficiles, en particulier lorsque la base de données tempdb n'est pas correctement configurée. Le conflit Tempdb ressemble à des verrous de base de données ordinaires, mais il s'agit en fait d'un conflit verrouillé en raison de processus concurrents qui attendent tous leur tour sur les pages d'allocation."
« Quels outils pouvons-nous utiliser pour examiner toutes ces choses ? » J'ai demandé.
"SQL Server avait un profileur pour examiner les procédures stockées, mais il est obsolète. Quelque chose comme ça est un bon moyen de trouver et de diagnostiquer les requêtes problématiques, même si ce n'est que la première étape. Ensuite, il y a des vues et des fonctions de gestion dynamiques qui vous aident à surveiller la santé de votre serveur et de votre base de données, à résoudre les problèmes et à ajuster votre SQL."
"Mais SQL Server a tellement de pièces mobiles", ai-je dit. "Je préférerais avoir un outil qui regarde l'ensemble de l'image de l'extérieur vers l'intérieur."
"Moi aussi. De préférence depuis le cloud, nous n'avons donc pas besoin de plus de matériel et de logiciels sur site pour le faire."
Soulagement des goulots d'étranglement des performances dans SQL Server
Pike commençait à être bondé. Et, aussi disposés que le patron et moi étions à nous asseoir dans un pub et à parler boutique, c'était vendredi soir, après tout. Nous avions d'autres endroits où aller, d'autres personnes à voir et d'autres sujets de conversation.
« Que devons-nous faire une fois que nous avons trouvé les goulots d'étranglement ? » J'ai demandé.
« Nous rassemblons les suspects habituels », a déclaré le patron. « Pour éviter d'utiliser trop de mémoire, nous devons indiquer aux développeurs de bases de données lesquels de leur code et de leurs requêtes présentent une fuite de mémoire. Si nous trouvons des opérations qui joignent quatre, cinq ou six tables, nous devrons donner aux développeurs des conseils de réglage SQL Server et les meilleures pratiques pour reconcevoir la base de données. Ou, nous pouvons avoir trop d'index et nous pouvons perdre des cycles à les mettre à jour ; c'est aussi dur pour le CPU et les E/S que d'avoir trop peu d'index. Nous pouvons avoir un problème avec la fragmentation des index SQL Server, ou nous devrons peut-être éliminer les index obsolètes et dupliqués."
"C'est logique," dis-je. «Peut-être que nous devons y ajouter plus de matériel. Des disques plus rapides peuvent aider avec les goulots d'étranglement d'E/S. Des processeurs plus nombreux et plus rapides font une différence dans les temps de réponse aux requêtes. Et ajouter de la RAM signifie plus d'évolutivité de SQL Server, n'est-ce pas ?"
"Oui", a déclaré le patron, "mais je veux d'abord être sûr que la cause première n'est pas un problème de développement ou de DevOps. Une fois que je serai convaincu que ce n'est pas le cas, je jouerai la carte Acheter plus de matériel."
Nous nous sommes assis un moment et avons regardé le pub se remplir de fêtards du vendredi soir.
"Boss", ai-je demandé, "pensez-vous que tous ces gens savent à quel point ils mènent une existence insouciante, sans le fardeau de gérer les sessions bloquées, l'attente maximale d'E/S, l'espérance de vie des pages et les taux d'accès au cache tampon ?"
"C'est une croix à porter, n'est-ce pas ?" répondit le patron. « La plupart des gens n'ont aucune idée de ce que nous traversons. Heureusement que nous traitons les goulots d'étranglement des performances de SQL Server si discrètement, avec tant de grâce sous pression et avec un si bon goût. En parlant de bon goût, comment vous débrouillez-vous avec votre goulot d'étranglement ?"
J'ai vérifié. « Mon goulot d'étranglement est vide. Ma bouteille aussi."
"Le mien aussi. Il est temps d'y aller. Nous avons du travail à faire."
Un système sans goulot d'étranglement SQL Server est-il possible ?
Nous savons que nous pouvons prendre des mesures pour éviter ces trois types courants de goulots d'étranglement SQL Server. Mais est-il possible de configurer une base de données SQL Server si bien qu'elle n'ait aucun goulot d'étranglement ?
La réponse courte est probablement non. Même le DBA le plus diligent verra apparaître de temps en temps des goulots d'étranglement SQL Server. Mais vous pouvez prendre des mesures pour éviter de manière proactive les goulots d'étranglement et minimiser leur impact sur les performances. Par exemple, Brent Ozar propose d'excellents conseils pour surveiller les compteurs Perfmon afin d'optimiser votre serveur SQL, et vous pouvez utiliser la vue sys.dm_os_performance_counters pour identifier les goulots d'étranglement et les corriger rapidement.
Les goulots d'étranglement de SQL Server font partie de la vie des DBA. Heureusement, avec une surveillance adéquate, une surveillance diligente et un réglage fréquent des requêtes, les problèmes de performances peuvent être résolus avant même que les utilisateurs ne sachent qu'il y a un problème.