GNU/Linux >> Linux Esercitazione >  >> Linux

Come viene calcolata l'utilità di iostat?

iostat -x (Ho usato una vecchia versione del codice sorgente per scriverlo prima di rendermene conto) mostra informazioni da /proc/diskstats (documentato qui) e /proc/stat (per i tempi della CPU; vedi man proc(5)) (e pochi altri, ma non è importante per la comprensione).

Puoi vedere i frammenti di codice pertinenti nella risposta di osgx, ma non riuscivo a capirli isolatamente, quindi ecco una spiegazione estesa:

  • %util = blkio.ticks / deltams * 100%
  • deltams è il tempo trascorso dall'ultima istantanea in ms. Usa le statistiche della CPU da /proc/stat presumibilmente perché dà risultati migliori rispetto a fare affidamento sul tempo di sistema, ma non lo so per certo. (Nota a margine:per qualche ragione i tempi sono divisi per HZ , mentre la documentazione afferma che è in USER_HZ , non lo capisco.)
  • blkio.ticks è "# di millisecondi spesi per fare I/O", da /proc/diskstats documenti:

    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.
    

    cioè la mia comprensione è che ticks è il numero di tick durante i quali era in corso una richiesta di I/O (per questo dispositivo) moltiplicato per la durata tra i tick.

Quindi %util = 100% significa che ogni volta che il kernel guardava (immagino che sia 1000 volte al secondo sui kernel moderni, vedi "HZ"), era in corso una richiesta di I/O.

Ecco un estratto da un altro post su iostat:

[%util is] per quanto tempo il dispositivo di archiviazione ha svolto un lavoro in sospeso (era occupato).

In ambienti RAID adeguati è più simile a "per quanto tempo almeno un disco nell'array RAID ha avuto qualcosa da fare". Sto deliberatamente escludendo qualsiasi tipo di cache qui:se la richiesta può essere servita dalla cache, la possibilità è abbastanza trascurabile che venga visualizzata in %util, a differenza di altri valori.

Ciò significa anche:il sottosistema RAID può essere caricato dal 6,25% (un disco che esegue il lavoro) al 100% (tutti occupati). È un bel po' di informazioni in un singolo valore di "100%", vero?


%util è denominato busy nel codice sorgente di iostat:https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380

Occupato viene conteggiato come rapporto percentuale di Ticks a deltams , limitato al 100%

busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;

DeltaMS è la somma del carico di sistema per il periodo di tempo (tempo utente + tempo di sistema + tempo di inattività + iowait)/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;

Tick ​​- è il Time of requests in queue per il periodo

blkio.ticks = new_blkio[p].ticks
                - old_blkio[p].ticks;

Nella versione più attuale di sysstat il codice è leggermente diverso: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 è compilato in 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);

E c'è il riempimento di tot_ticks da 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 vengono letti da "sysfs stat per il dispositivo a blocchi o la partizione corrente " in read_sysfs_file_stat (iostat.c:487) e ioi e ioj sono le statistiche attuali e precedenti.


Linux
  1. Come usare il comando Linux grep

  2. Come usare il comando cronologia in Linux

  3. Come Linux è arrivato al mainframe

  4. Come installare R 3.3.1 nella propria directory?

  5. Come ruotare lo schermo su un Raspberry Pi 3

Come utilizzare il comando xargs di Linux

Come utilizzare il comando tee di Linux

Come utilizzare il comando superiore in Linux

Come utilizzare il comando Ping di Linux

Come impostare il nome host Pretty

Come emulare il Raspberry Pi 2 su QEMU?