Préface
TrÚs souvent, les utilisateurs, les développeurs et les administrateurs de SGBD MS SQL Server sont confrontés à des problÚmes de performances de base de données ou de SGBD en général, donc la surveillance de MS SQL Server est trÚs pertinente.
Cet article est un ajout Ă l'article
Utilisation de Zabbix pour surveiller la base de données MS SQL Server et il examinera certains aspects de la surveillance de MS SQL Server, en particulier: comment déterminer rapidement les ressources manquantes, ainsi que des recommandations pour définir des indicateurs de trace.
Pour que les scripts suivants fonctionnent, vous devez créer le schéma inf dans la base de données souhaitée comme suit:
Création d'un schéma infuse <_>; go create schema inf;
Méthode pour détecter une pénurie de RAM
Le premier indicateur d'un manque de RAM est le cas lorsqu'une instance de MS SQL Server mange toute la RAM qui lui est allouée.
Pour ce faire, créez la vue inf.vRAM suivante:
Création d'une vue inf.vRAM CREATE view [inf].[vRAM] as select a.[TotalAvailOSRam_Mb]
Ensuite, vous pouvez dĂ©terminer que l'instance de MS SQL Server consomme toute la mĂ©moire qui lui est allouĂ©e par la requĂȘte suivante:
select SQL_server_physical_memory_in_use_Mb, SQL_server_committed_target_Mb from [inf].[vRAM];
Si l'indicateur SQL_server_physical_memory_in_use_Mb n'est pas constamment inférieur à SQL_server_committed_target_Mb, vous devez vérifier les statistiques des attentes.
Pour déterminer le manque de RAM via les statistiques d'attente, créez une vue inf.vWaits:
Création d'une vue inf.vWaits CREATE view [inf].[vWaits] as WITH [Waits] AS (SELECT [wait_type],
Dans ce cas, vous pouvez dĂ©terminer le manque de RAM par la requĂȘte suivante:
SELECT [Percentage] ,[AvgWait_S] FROM [inf].[vWaits] where [WaitType] in ( 'PAGEIOLATCH_XX', 'RESOURCE_SEMAPHORE', 'RESOURCE_SEMAPHORE_QUERY_COMPILE' );
Ici, vous devez faire attention aux performances de Pourcentage et AvgWait_S. S'ils sont significatifs dans leur totalité, alors il y a une trÚs forte probabilité que la RAM ne soit pas suffisante pour une instance de MS SQL Server. Les valeurs essentielles sont déterminées individuellement pour chaque systÚme. Cependant, vous pouvez commencer avec la métrique suivante: Pourcentage> = 1 et AvgWait_S> = 0,005.
Pour gĂ©nĂ©rer des indicateurs vers un systĂšme de surveillance (par exemple, Zabbix), vous pouvez crĂ©er les deux requĂȘtes suivantes:
- combien en pourcentage les types d'attentes pour la RAM occupent (la somme de tous ces types d'attentes):
select coalesce(sum([Percentage]), 0.00) as [Percentage] from [inf].[vWaits] where [WaitType] in ( 'PAGEIOLATCH_XX', 'RESOURCE_SEMAPHORE', 'RESOURCE_SEMAPHORE_QUERY_COMPILE' );
- combien de millisecondes occupent les types d'attentes pour la RAM (la valeur maximale de tous les retards moyens pour tous ces types d'attentes):
select coalesce(max([AvgWait_S])*1000, 0.00) as [AvgWait_MS] from [inf].[vWaits] where [WaitType] in ( 'PAGEIOLATCH_XX', 'RESOURCE_SEMAPHORE', 'RESOURCE_SEMAPHORE_QUERY_COMPILE' );
Sur la base de la dynamique des valeurs obtenues pour ces deux indicateurs, nous pouvons conclure s'il y a suffisamment de RAM pour l'instance de MS SQL Server.
Méthode de détection de surcharge du processeur
Pour identifier le manque de temps CPU, utilisez simplement la vue systĂšme sys.dm_os_schedulers. Ici, si l'indicateur runnable_tasks_count est constamment supĂ©rieur Ă 1, il y a une forte probabilitĂ© que le nombre de cĆurs ne soit pas suffisant pour une instance de MS SQL Server.
Pour afficher l'indicateur dans un systĂšme de surveillance (par exemple, Zabbix), vous pouvez crĂ©er la requĂȘte suivante:
select max([runnable_tasks_count]) as [runnable_tasks_count] from sys.dm_os_schedulers where scheduler_id<255;
Sur la base de la dynamique des valeurs obtenues pour cet indicateur, nous pouvons conclure s'il y a suffisamment de temps processeur (le nombre de cĆurs CPU) pour une instance de MS SQL Server.
Cependant, il est important de se rappeler que les requĂȘtes elles-mĂȘmes peuvent demander plusieurs threads Ă la fois. Et parfois, l'optimiseur ne peut pas Ă©valuer correctement la complexitĂ© de la demande elle-mĂȘme. Ensuite, la demande peut se voir allouer trop de threads qui, Ă un moment donnĂ©, ne peuvent pas ĂȘtre traitĂ©s simultanĂ©ment. Et cela provoque Ă©galement un type d'attente associĂ© Ă un manque de temps processeur, et la croissance de la file d'attente pour les planificateurs qui utilisent des cĆurs de processeur spĂ©cifiques, c'est-Ă -dire que l'indicateur runnable_tasks_count augmentera dans de telles conditions.
Dans ce cas, avant d'augmenter le nombre de cĆurs de CPU, vous devez configurer correctement les propriĂ©tĂ©s de parallĂ©lisme de l'instance de MS SQL Server, et Ă partir de la version 2016, configurer correctement les propriĂ©tĂ©s de parallĂ©lisme des bases de donnĂ©es requises:


Ici, il convient de prĂȘter attention aux paramĂštres suivants:
- DegrĂ© maximal de parallĂ©lisme: dĂ©finit le nombre maximal de threads pouvant ĂȘtre allouĂ©s Ă chaque demande (la valeur par dĂ©faut est 0-restriction uniquement par le systĂšme d'exploitation et l'Ă©dition MS SQL Server)
- Seuil de coût pour le parallélisme - coût estimé du parallélisme (la valeur par défaut est 5)
- Max DOP-dĂ©finit le nombre maximal de threads qui peuvent ĂȘtre allouĂ©s Ă chaque requĂȘte au niveau de la base de donnĂ©es (mais pas plus que la valeur de la propriĂ©tĂ© "Max Degree of Parallelism") (la valeur par dĂ©faut est 0-restriction uniquement par le systĂšme d'exploitation et l'Ă©dition MS SQL Server, ainsi que la restriction sur la propriĂ©tĂ© "Max Degree of Parallelism" de toute l'instance MS SQL Server)
Il est impossible de donner une recette aussi bonne pour tous les cas, c'est-Ă -dire que vous devez analyser les demandes difficiles.
D'aprÚs ma propre expérience, je recommande l'algorithme d'actions suivant pour les systÚmes OLTP pour configurer les propriétés de parallélisme:
- interdire d'abord la concurrence en définissant le niveau de l'instance entiÚre de Max Degree of Parallelism sur 1
- analyser les requĂȘtes les plus difficiles et choisir le nombre optimal de threads pour elles
- définir le degré maximal de parallélisme au nombre optimal sélectionné de threads obtenus à partir de l'élément 2, et pour des bases de données spécifiques définir la valeur DOP maximale obtenue à partir de l'élément 2 pour chaque base de données
- analyser les demandes les plus difficiles et identifier l'effet négatif du multithreading. Si tel est le cas, augmentez le seuil de coût pour le parallélisme.
Pour des systĂšmes tels que 1C, Microsoft CRM et Microsoft NAV, dans la plupart des cas, l'interdiction du multithreading convient.
De plus, si l'Ă©dition Standard est installĂ©e, alors dans la plupart des cas, l'interdiction du multithreading convient Ă©tant donnĂ© que cette Ă©dition est limitĂ©e par le nombre de cĆurs de processeur.
Pour les systÚmes OLAP, l'algorithme décrit ci-dessus ne convient pas.
D'aprÚs ma propre expérience, je recommande l'algorithme d'actions suivant pour les systÚmes OLAP pour définir les propriétés de parallélisme:
- analyser les requĂȘtes les plus difficiles et choisir le nombre optimal de threads pour elles
- définir le degré maximal de parallélisme au nombre optimal sélectionné de threads obtenus à partir de l'élément 1, ainsi que pour des bases de données spécifiques définir la valeur DOP maximale obtenue à partir de l'élément 1 pour chaque base de données
- analyser les demandes les plus difficiles et identifier l'effet négatif de la limite de concurrence. Si tel est le cas, réduisez la valeur du seuil de coût pour le parallélisme ou répétez les étapes 1 à 2 de cet algorithme.
Autrement dit, pour les systÚmes OLTP, nous passons du simple thread au multithread, et pour les systÚmes OLAP, au contraire, nous passons du multithreading au single thread. Ainsi, il est possible de sélectionner les paramÚtres de concurrence optimale pour à la fois une base de données spécifique et l'ensemble de l'instance MS SQL Server.
Il est Ă©galement important de comprendre que les paramĂštres des propriĂ©tĂ©s de concurrence doivent ĂȘtre modifiĂ©s au fil du temps en fonction des rĂ©sultats de la surveillance des performances de MS SQL Server.
Recommandations pour définir des indicateurs de trace
D'aprÚs ma propre expérience et celle de mes collÚgues, je recommande de définir les indicateurs de trace suivants au niveau du démarrage du service MS SQL Server pour les versions 2008-2016 pour des performances optimales:
- 610 - Réduction de la journalisation des insertions dans les tables indexées. Il peut aider avec des insertions dans des tables avec un grand nombre d'enregistrements et de nombreuses transactions, avec de longues attentes fréquentes de WRITELOG pour les changements d'index
- 1117 - Si un fichier d'un groupe de fichiers atteint le seuil de croissance automatique, tous les fichiers du groupe de fichiers sont développés
- 1118 - Force tous les objets à se trouver dans différentes étendues (interdiction des extensions mixtes), ce qui minimise la nécessité de numériser la page SGAM, qui est utilisée pour suivre les extensions mixtes
- 1224 - Désactive l'escalade des verrous en fonction du nombre de verrous. Une utilisation excessive de la mémoire peut inclure une escalade des verrous.
- 2371 - Change le seuil pour les mises Ă jour automatiques de statistiques fixes en seuil pour les mises Ă jour dynamiques de statistiques automatiques. Il est important de mettre Ă jour les plans de requĂȘte pour les grandes tables oĂč la dĂ©termination incorrecte du nombre d'enregistrements conduit Ă des plans d'exĂ©cution erronĂ©s
- 3226 - Supprime les messages de sauvegarde réussis dans le journal des erreurs
- 4199 - Inclut les modifications apportĂ©es Ă l'optimiseur de requĂȘtes publiĂ© dans la mise Ă jour cumulative et les service packs SQL Server
- 6532-6534 - Comprend des performances de requĂȘte amĂ©liorĂ©es pour les types de donnĂ©es spatiales
- 8048 - Convertit les objets de mémoire partitionnée NUMA en CPU partitionné
- 8780 - Permet une allocation de temps supplĂ©mentaire pour la planification d'une demande. Certaines demandes sans cet indicateur peuvent ĂȘtre rejetĂ©es car elles n'ont pas de plan de demande (erreur trĂšs rare)
- 9389 - Comprend un tampon de mémoire dynamique supplémentaire temporairement fourni pour les opérateurs en mode batch, qui permet à l'opérateur en mode batch de demander de la mémoire supplémentaire et d'éviter de transférer des données vers tempdb si de la mémoire supplémentaire est disponible
Avant la version 2016, il est utile d'inclure l'indicateur de trace 2301, qui inclut l'optimisation de l'aide Ă la dĂ©cision Ă©tendue et aide ainsi Ă choisir des plans de requĂȘte plus corrects. Cependant, Ă partir de la version 2016, cela a souvent un effet nĂ©gatif dans un temps d'exĂ©cution de requĂȘte global assez long.
De plus, pour les systÚmes dans lesquels il y a beaucoup d'index (par exemple, pour les bases de données 1C), je vous recommande d'activer l'indicateur de trace 2330, qui désactive la collecte sur l'utilisation des index, ce qui a généralement un effet positif sur le systÚme.
En savoir plus sur les indicateurs de trace
ici .
En utilisant le lien ci-dessus, il est également important de prendre en compte les versions et les assemblys de MS SQL Server, car pour les versions plus récentes, certains indicateurs de trace sont activés par défaut ou n'ont aucun effet. Par exemple, dans la version 2017, il est pertinent de définir uniquement les 5 indicateurs de trace suivants: 1224, 3226, 6534, 8780 et 9389.
Vous pouvez activer ou désactiver l'indicateur de trace à l'aide des commandes DBCC TRACEON et DBCC TRACEOFF, respectivement. Voir
ici pour plus de détails.
Vous pouvez obtenir l'état des indicateurs de trace à l'aide de la commande DBCC TRACESTATUS:
plus .
Pour que les indicateurs de trace soient inclus dans l'exécution automatique du service MS SQL Server, vous devez accéder au Gestionnaire de configuration SQL Server et ajouter ces indicateurs de trace dans les propriétés du service via -T:

Résumé
Dans cet article, certains aspects de la surveillance de MS SQL Server ont été examinés, à l'aide desquels vous pouvez rapidement identifier un manque de RAM et de temps libre CPU, ainsi qu'un certain nombre d'autres problÚmes moins évidents. Les indicateurs de trace les plus couramment utilisés ont été pris en compte.
Les sources
»
Statistiques de mise en veille de SQL Server»
Statistiques sur les attentes de SQL Server ou dites-moi oĂč ça fait mal»
Vue systÚme sys.dm_os_schedulers»
Utilisation de Zabbix pour suivre la base de données MS SQL Server»
Mode de vie SQL»
Trace drapeaux»
Sql.ru