iostat -x
(J'ai utilisé une ancienne version du code source pour écrire ceci avant de m'en rendre compte) affiche les informations de /proc/diskstats
(documenté ici) et /proc/stat
(pour les temps CPU; voir man proc(5)) (et quelques autres, mais ce n'est pas important pour la compréhension).
Vous pouvez voir les extraits de code pertinents dans la réponse d'osgx, mais je ne pouvais pas les comprendre isolément, alors voici une explication détaillée :
%util = blkio.ticks / deltams * 100%
deltams
est le temps écoulé depuis le dernier instantané en ms. Il utilise les statistiques du processeur de/proc/stat
probablement parce que cela donne de meilleurs résultats que de compter sur le temps système, mais je ne sais pas avec certitude. (Remarque :pour une raison quelconque, les temps sont divisés parHZ
, alors que la documentation indique qu'il est enUSER_HZ
, je ne comprends pas.)-
blkio.ticks
est "# de millisecondes passées à faire des E/S", à partir de/proc/diskstats
documents :Field 9 -- # of I/Os currently in progress The only field that should go to zero. Incremented as requests are given to appropriate struct request_queue and decremented as they finish. Field 10 -- # of milliseconds spent doing I/Os This field increases so long as field 9 is nonzero.
c'est-à-dire que je comprends que
ticks
est le nombre de ticks lorsqu'une demande d'E/S (pour ce périphérique) était en cours multiplié par la durée entre les ticks.
Donc %util = 100%
signifie qu'à chaque fois que le noyau regardait (je suppose que c'est 1000 fois par seconde sur les noyaux modernes, voir "HZ"), une requête d'E/S était en cours.
Voici un extrait d'un autre article sur iostat :
[%util est] combien de temps le périphérique de stockage a-t-il eu un travail en attente (était occupé).
Dans les environnements RAID appropriés, cela ressemble plus à "combien de temps au moins un disque de la matrice RAID a-t-il quelque chose à faire". J'exclus délibérément tout type de cache ici - si la requête peut être servie à partir du cache, la chance est assez négligeable qu'elle apparaisse dans %util, contrairement aux autres valeurs.
Cela signifie également que le sous-système RAID peut être chargé de 6,25 % (un disque faisant le travail) à 100 % (tous occupés). C'est beaucoup d'informations sur la valeur unique de "100 %", n'est-ce pas ?
%util
est nommé occupé dans le code source d'iostat :https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380
Occupé est compté comme un pourcentage de Ticks
à deltams
, limité à 100%
busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;
DeltaMS est la somme de la charge du système pour la période (temps utilisateur + temps système + temps d'inactivité + attente)/ncpu.
double deltams = 1000.0 *
((new_cpu.user + new_cpu.system +
new_cpu.idle + new_cpu.iowait) -
(old_cpu.user + old_cpu.system +
old_cpu.idle + old_cpu.iowait)) / ncpu / HZ;
Tiques - est le Time of requests in queue
pour la période
blkio.ticks = new_blkio[p].ticks
- old_blkio[p].ticks;
Dans la version plus récente de sysstat, le code est un peu différent :http://sources.debian.net/src/sysstat/10.2.0-1/iostat.c#L959
/* rrq/s wrq/s r/s w/s rsec wsec rqsz qusz await r_await w_await svctm %util */
printf(" %8.2f %8.2f %7.2f %7.2f %8.2f %8.2f %8.2f %8.2f %7.2f %7.2f %7.2f %6.2f %6.2f\n",
...
/*
* Again: Ticks in milliseconds.
* In the case of a device group (option -g), shi->used is the number of
* devices in the group. Else shi->used equals 1.
*/
shi->used ? xds.util / 10.0 / (double) shi->used
: xds.util / 10.0); /* shi->used should never be null here */
xds est renseigné dans le compute_ext_disk_stats(&sdc, &sdp, itv, &xds);
http://sources.debian.net/src/sysstat/10.2.0-1/common.c?hl=679#L679
/*
* Macros used to display statistics values.
*
* HZ is 1024 on IA64 and % should be normalized to 100.
*/
#define S_VALUE(m,n,p) (((double) ((n) - (m))) / (p) * HZ)
xds->util = S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv);
Et il y a le remplissage des tot_ticks de iostat.c
* @ioi Current sample statistics.
* @ioj Previous sample statistics.
* @itv Interval of time.
...
sdc.tot_ticks = ioi->tot_ticks;
sdp.tot_ticks = ioj->tot_ticks;
tot_ticks
sont lus à partir de "statistiques sysfs pour le périphérique de bloc ou la partition en cours " dans read_sysfs_file_stat
(iostat.c:487) et ioi
et ioj
sont les statistiques actuelles et précédentes.