Pourquoi ma base de données Azure SQL (SQL Server) est-elle surchargée d'E / S de données pendant des périodes à la fois? [fermé]

9

J'exécute une base de données Azure SQL sous l'édition S2 (50 DTU). L'utilisation normale du serveur se bloque généralement autour de 10% DTU. Cependant, ce serveur entre régulièrement dans un état où il enverra l'utilisation DTU de la base de données à 85-90% pendant des heures. Puis tout d'un coup, cela revient à l'utilisation normale de 10%.

entrez la description de l'image ici

Les requêtes sur le serveur à partir de l'application semblent toujours fonctionner rapidement pendant cet état surchargé.

Je peux faire évoluer le serveur à partir de S2 => n'importe quoi (S3 par exemple) => S2 et il semble effacer tout état dans lequel il est suspendu. Mais quelques heures plus tard, il répétera à nouveau le même cycle d'état surchargé. Une autre chose étrange que j'ai remarquée est que si j'exécute ce serveur sur un plan S3 (100 DTU) 24/7, je n'ai pas observé ce comportement. Cela ne semble se produire que lorsque j'ai réduit la base de données à un plan S2 (50 DTU). Sur le plan S3, je suis toujours assis à 5-10% d'utilisation DTU. Manifestement sous-utilisé.

J'ai vérifié dans les rapports de requêtes Azure SQL à la recherche de requêtes non fiables, mais je ne vois vraiment rien d'inhabituel et cela montre mes requêtes en utilisant les ressources comme je m'y attendais.

entrez la description de l'image ici

Comme nous pouvons le voir ici cependant, l'utilisation provient entièrement de Data IO. Si je modifie le rapport de performances ici pour afficher les principales requêtes d'E / S de données par MAX, nous voyons ceci:

entrez la description de l'image ici

L'examen de ces exigences de longue date semble indiquer des mises à jour des statistiques. Pas vraiment quoi que ce soit à partir de mon application. Par exemple, la requête 16302 montre:

SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000]  FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM [dbo].[Cipher] TABLESAMPLE SYSTEM (1.250395e+000 PERCENT) WITH (READUNCOMMITTED) ) AS _MS_UPDSTATS_TBL_HELPER ORDER BY [SC0], [SC1], [SC2], [SB0000] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 16)

Mais là encore, le rapport montre également que ces requêtes n'utilisent qu'un faible pourcentage de l'utilisation d'E / S de données sur le serveur (<4%). J'exécute également des mises à jour de statistiques (et reconstructions d'index) sur la base de données entière sur une base hebdomadaire dans le cadre de sa maintenance régulière.

Voici un autre rapport qui affiche les requêtes d'E / S de données MAX pour un intervalle de temps qui couvre plusieurs heures uniquement pendant l'incident à forte utilisation des ressources.

entrez la description de l'image ici

Comme nous pouvons le voir, pas vraiment de requêtes signalant une utilisation importante des E / S de données.

J'ai également couru sp_who2et sp_whoisacivesur la base de données et je ne vois vraiment rien qui me saute aux yeux (même si je dois admettre que je ne suis pas un expert de ces outils).

Comment savoir ce qui se passe ici? Je ne pense pas qu'aucune de mes requêtes d'application soit à blâmer pour cette utilisation des ressources et j'ai l'impression qu'un processus interne s'exécute en arrière-plan sur le serveur qui le tue.

kspearrin
la source
Vous voyez donc qu'il y a des statistiques de mise à jour en cours d'exécution, ce qui va naturellement avoir un coût d'E / S décent associé, non? Si cette requête représente 4% du total des E / S pendant 24 heures , pensez-vous qu'elle pourrait encore contribuer aux pics que vous voyez dans le graphique? J'hésiterais à utiliser le mot «surchargé» lorsque vous ne maximisez pas votre DTU et que les performances de votre requête sont également acceptables. Pourquoi est-ce un problème que le serveur utilise ses ressources différemment au fil du temps?
LowlyDBA
@LowlyDBA Je ne sais pas comment j'ai pu valider que la requête est à l'origine de cela. Lorsqu'il ne montre que 4% d'utilisation, je ne pense pas que cela conduirait à près de 100% d'utilisation du seuil global de DTU. Il y a beaucoup d'utilisation non comptabilisée ici. Fondamentalement, j'essaie de comprendre pourquoi cela se produit. Les pics constants de plusieurs heures mettent le serveur très près de 100%, et comme mentionné, cela ne semble pas du tout se produire lorsque je double les ressources DTU disponibles (plan S3).
kspearrin
N'oubliez pas que le DTU n'est pas seulement une entrée / sortie, c'est aussi un processeur et de la mémoire . La comparaison des deux n'est donc probablement pas une mesure utile. Que vous offre l' outil d' analyse des performances des requêtes pour une répartition visuelle des ressources dans une fenêtre plus petite (juste les heures pendant lesquelles vous voyez le pic)?
LowlyDBA
@LowlyDBA Les captures d'écran du rapport que j'ai publiées ci-dessus semblent indiquer clairement que les ressources proviennent toutes de Data IO. Le CPU et le Log IO ne sont pas vraiment un facteur important. Par exemple, la recherche de requêtes par Max CPU% indique uniquement que le plus gros délinquant n'utilise que 2% sur plusieurs heures pendant que le problème se produit. Capture d'écran: imgur.com/rxyMLc9
kspearrin
1
@DirkBoer Dans notre cas, cela semble lié aux requêtes d'agrégation de statistiques s'exécutant sur le serveur. Nous avons désactivé les statistiques automatiques sur certaines tables pour résoudre le problème.
kspearrin

Réponses:

1

Étant donné que pendant les pics, votre activité de journal est minimale, nous pouvons supposer qu'il n'y a pas (ou beaucoup) de DUI en cours.

Vous mentionnez à un moment donné que le pic n'affecte pas les performances, et à un autre point qu'il le fait. Lequel est-ce?

Vous mentionnez également que cela disparaît après une opération de pesage. Cela a du sens car il est analogue à un redémarrage sur site qui tuera efficacement tous les processus, etc.

Dois-je supposer correctement en supposant que cette base de données est accessible à partir du niveau application? Si c'est le cas, je soupçonne que vos connexions ne sont pas fermées correctement . Le garbage collector est censé s'en occuper éventuellement (ce à quoi il ne faut pas se fier), mais j'ai vu cette situation exacte se produire en raison de connexions non fermées du niveau application. Dans notre cas, l'application était tellement occupée que nous avons finalement reçu des erreurs de connexion simultanées, ce qui nous a conduit au problème.

Essayez la requête suivante pendant le pic:

SELECT
    c.session_id, c.net_transport, c.encrypt_option,
    s.status,
    c.auth_scheme, s.host_name, s.program_name,
    s.client_interface_name, s.login_name, s.nt_domain,
    s.nt_user_name, s.original_login_name, c.connect_time,
    s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
ORDER BY c.connect_time ASC

Si je ne me trompe pas, vous trouverez tout un tas d'enregistrements renvoyés avec le statut de Sleeping, ou pire Running. Si tel est le cas, vous avez des problèmes encore plus importants au niveau de l'application.

Nous pouvons poursuivre le débogage en copiant la base de données, en utilisant la requête suivante (en utilisant le niveau de base pour éviter des coûts excessifs) et en surveillant ce comportement.

CREATE DATABASE Database1_copy AS COPY OF Database1 ( EDITION = 'basic' );
pimbrouwers
la source
1
Oui, la base de données est accessible à partir d'un niveau d'application, mais pour autant que je sache, toutes les connexions sont correctement enveloppées dans des usinginstructions. Les informations que j'ai publiées dans la question d'origine semblent indiquer que les données IO sont responsables des pics.
kspearrin
1
@pimbrouwers: Pouvez-vous expliquer spécifiquement pourquoi une connexion en état de sommeil / de course est mauvaise? Ma compréhension du pool de connexions était que les connexions pouvaient être dans un tel état dans le cadre d'un fonctionnement normal.
obaylis