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/statpresumibilmente 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/diskstatsdocumenti: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.