GNU/Linux >> Tutoriels Linux >  >> Linux

Comment l'utilité d'iostat est-elle calculée ?

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 par HZ , alors que la documentation indique qu'il est en USER_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.


Linux
  1. Comment utiliser la commande Linux grep

  2. Comment utiliser la commande history sous Linux

  3. Comment installer R 3.3.1 dans le propre répertoire ?

  4. Comment changer le nom d'hôte ?

  5. Comment invoquer le Hud ?

Comment utiliser la commande Linux xargs

Comment utiliser la commande Linux tee

Comment utiliser la commande top sous Linux

Comment utiliser la commande Linux Ping

Comment configurer le joli nom d'hôte

Comment émuler le Raspberry Pi 2 sur QEMU ?