iostat -x
(Použil jsem starou verzi zdrojového kódu, abych to napsal, než jsem si to uvědomil) zobrazuje informace z /proc/diskstats
(zde zdokumentováno) a /proc/stat
(pro CPU časy; viz man proc(5)) (a několik dalších, ale to není důležité pro pochopení).
Příslušné úryvky kódu můžete vidět v odpovědi osgx, ale nedokázal jsem jim porozumět izolovaně, takže zde je rozšířené vysvětlení:
%util = blkio.ticks / deltams * 100%
deltams
je čas uplynulý od posledního snímku v ms. Používá statistiky CPU z/proc/stat
pravděpodobně proto, že dává lepší výsledky, než se spoléhat na systémový čas, ale nevím jistě. (Poznámka:z nějakého důvodu jsou časy dělenyHZ
, zatímco dokumentace uvádí, že je vUSER_HZ
, tomu nerozumím.)-
blkio.ticks
je "počet milisekund strávených prováděním I/O", z/proc/diskstats
dokumenty: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.
tj. chápu to tak, že
ticks
je počet tiků, kdy proběhl jakýkoli I/O požadavek (pro toto zařízení) vynásobený dobou mezi tiky.
Takže %util = 100%
znamená, že pokaždé, když se jádro podívalo (u moderních jader je to 1000krát za sekundu, viz "HZ"), probíhal I/O požadavek.
Zde je výňatek z jiného příspěvku na iostatu:
[%util is] kolik času mělo úložné zařízení nevyřízenou práci (bylo zaneprázdněné).
Ve správných prostředích RAID je to spíše jako „kolik času měl alespoň jeden disk v poli RAID co dělat“. Záměrně zde vylučuji jakýkoli druh mezipaměti – pokud lze požadavek obsloužit z mezipaměti, je zcela zanedbatelná šance, že se na rozdíl od jiných hodnot zobrazí v %util.
Co to také znamená – subsystém RAID lze zatížit od 6,25 % (jeden disk dělá práci) do 100 % (všechny zaneprázdněné). To je v jediné hodnotě „100 %“ docela dobrý přehled, ne?
%util
je ve zdrojovém kódu iostatu pojmenován jako zaneprázdněný:https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380
Zaneprázdněnost se počítá jako procentuální poměr Ticks
na deltams
, omezeno na 100 %
busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;
DeltaMS je součet zatížení systému za časové období (čas uživatele + systémový čas + doba nečinnosti + 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;
Ticks - je Time of requests in queue
za období
blkio.ticks = new_blkio[p].ticks
- old_blkio[p].ticks;
V aktuálnější verzi sysstat je kód trochu jiný: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 je vyplněno v 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);
A je tu plnění tot_ticks z 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
jsou čteny z "statistiky sysfs pro aktuální blokové zařízení nebo oddíl " v read_sysfs_file_stat
(iostat.c:487) a ioi
a ioj
jsou aktuální a předchozí statistiky.