Microsoft SQL sys.dm_os_wait_stats append jusqu'à plusieurs millisecondes que dans la période de time

Le but de ce post est de déterminer l'utilisation du processeur et des E / S d'un server SQL. Traditionnellement, nous utiliserions @@ cpu_busy, @@ io_busy et @@ idle pour déterminer que sur MSSQL, ceux-ci cessent de fonctionner après 28 jours. Nous avons l'utilisation du processeur à partir d'une source différente sur la boîte, mais nous devons déterminer la limite d'E / S.

Lorsque vous regardez datatables dans sys.dm_os_wait_stats et que vous calculez des deltas toutes les dix minutes, le nombre de secondes attendues peut dépasser dix minutes. J'ai également essayé de split par les tâches attendues mais datatables n'ont toujours pas de sens.
Fondamentalement, nous voulons que chaque type d'attente devienne un pourcentage d'attente pour la période de dix minutes. Mais si le time d'attente dépasse les dix minutes, on ne peut pas simplement split le time par 10 minutes pour voir le pourcentage utilisé.

Nous essayons de déterminer une mésortingque pour montrer comment IO est lié.

https://msdn.microsoft.com/en-us/library/ms179984.aspx

wait_type = Nom du type d'attente. Pour plus d'informations, voir Types d'attentes, plus loin dans cette rubrique.

waiting_tasks_count = Nombre d'attentes sur ce type d'attente. Ce countur est incrémenté au début de chaque attente.

wait_time_ms = Temps d'attente total pour ce type d'attente en millisecondes.

MODIFIER

La première réponse est sur la bonne voie, mais pas tout à fait. Ce que cette statistique montre, c'est que pour cet intervalle de time donné, le pourcentage de l'attente qui est atsortingbuable à un type d'attente particulier. Voir dans le graphique suivant.

Graphique des deltas comparés à iobusy

MODIFIER

Masortingce de corrélation basée sur les deltas sur des intervalles de 10 minutes:

                  wait_time_ms wait.NO.signal signal_wait_time @@ io_busy @@ cpu_busy ioPct cpuPct
 wait_time_ms 100 100 70 74 58 71 58
 wait.NO.signal 100 100 64 72 53 69 53
 signal_wait_time 70 64 100 71 89 67 89
 @@ io_busy 74 72 71 100 77 99 77
 @@ cpu_busy 58 53 89 77 100 75 100
 ioPct 71 69 67 99 75 100 75
 cpuPct 58 53 89 77 100 75 100

Sur le graphique ci-dessus, on peut voir que le time de signal est le plus fortement corrélé avec @@ cpu_busy tick counter deltas. Le time d'attente est le plus corrélé avec @@ io_busy counter deltas.

Selon le @@ vars, cette boîte SQL est liée au processeur (cpu% beaucoup plus élevé que io%) tandis que "selon" aux statistics d'attente, elle est liée à l'E / S. D'après le file sys.dm_os_ring_buffers, cette boîte est liée à la CPU. Je crois ce que dit SystemHealth / SystemIdle.

Cet article suggère que l'on peut utiliser le time d'attente du signal par rapport au time d'attente pour get la pression du processeur%. Cependant, comparé aux données @@ cpu_busy, je soupçonne fortement que sa conclusion n'est que partiellement correcte. Si son cpuPressure% est élevé, oui l'ajout de la puissance du processeur aidera mais ce n'est pas toute l'histoire. http://blogs.msdn.com/b/sqlcat/archive/2005/09/05/461199.aspx

                  wait_time_ms cpuPress wait.NO.signal signal_wait_time @@ io_busy @@ cpu_busy ioPct cpuPct
 cpuPress -50 100 -56 25 -11 25 -11 25

MODIFIER

Les travaux suivants pour l'une des boîtes choisies, cependant étant donné les différents cœurs, nous devrons prendre en count cela.


 résumé (m)

 Appel:
 lm (formule = ioPct ~ cpuPct + signal_wait_time + wait_time_ms, 
     data = rd)

 Résidus
      Min 1Q Median 3Q Max 
 -3.13921 -0.75004 -0.07748 0.60897 2.14655 

 Coefficients
                         Estimation Std.  Erreur t valeur Pr (> | t |)    
 (Interception) -0.442311370934 0.085652949324 -5.164 0.000000286383 xxx
 cpuPct 0.123717691895 0.004503995334 27.468 less 2e-16 xxx
 signal_wait_time -0.000000302969 0.000000046933 -6.455 0.000000000161 xxx
 wait_time_ms 0.000000022240 0.000000002534 8.777 less 2e-16 xxx
 ---
 Signif.  codes: 0 'xxx' 0.001 'xx' 0.01 'x' 0.05 '.'  0,1 '' 1

 Erreur-type résiduelle: 0,9959 sur 1109 degrés de liberté
 Multiple R au carré: 0.7566, Ajusté R au carré: 0.7559 
 Statistique F: 1149 sur 3 et 1109 DF, valeur p: 

Sur une machine multicœur, chaque CPU dispose de son propre planificateur et peut save ses propres attentes. Par exemple, si vous avez une requête parallèle à plusieurs processeurs, chacune des parties de la requête parallèle peut save ses propres attentes CXPACKET pendant qu'elles attendent la fin de la requête.

Pour get votre pourcentage utilisé, il suffit de split par votre time d'attente total, plutôt que les 10 minutes.

SELECT wait_type, wait_time_ms * 100.00 / SUM(wait_time_ms) OVER() FROM sys.dm_os_wait_stats 

Les statistics d'attente sont enregistrées par un travailleur (c'est-à-dire un thread). Si, pendant une seconde, 10 threads suspendent (chacun) pendant 0,9 seconde et s'exécutent pendant 0,1 seconde, vous avez 10×0,9 time d'attente total (soit 9 secondes) et 10×0,1 time CPU total (le time écoulé 1 seconde). 100% cpu et time d'attente élevé (pour toute attente).

Un time d'attente de signal élevé indique une contention du processeur. Le thread doit attendre plus longtime que nécessaire après que l'attente ait été signalée, avant que le thread puisse s'exécuter.