iostat -x
(Usé una versión antigua del código fuente para escribir esto antes de darme cuenta) muestra información de /proc/diskstats
(documentado aquí) y /proc/stat
(para tiempos de CPU; ver man proc(5)) (y algunos otros, pero eso no es importante para entender).
Puede ver los fragmentos de código relevantes en la respuesta de osgx, pero no pude entenderlos de forma aislada, así que aquí hay una explicación ampliada:
%util = blkio.ticks / deltams * 100%
deltams
es el tiempo transcurrido desde la última instantánea en ms. Utiliza estadísticas de CPU de/proc/stat
presumiblemente porque da mejores resultados que confiar en el tiempo del sistema, pero no estoy seguro. (Nota al margen:por alguna razón, los tiempos se dividen porHZ
, mientras que la documentación indica que está enUSER_HZ
, no entiendo eso.)-
blkio.ticks
es "# de milisegundos dedicados a E/S", de/proc/diskstats
documentos: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.
es decir, tengo entendido que
ticks
es el número de tics cuando cualquier solicitud de E/S (para este dispositivo) estaba en curso multiplicada por la duración entre tics.
Entonces %util = 100%
significa que cada vez que el núcleo miraba (supongo que son 1000 veces por segundo en los núcleos modernos, consulte "HZ"), había una solicitud de E/S en curso.
Aquí hay un extracto de otra publicación en iostat:
[%util es] cuánto tiempo tuvo el dispositivo de almacenamiento trabajo pendiente (estuvo ocupado).
En entornos RAID adecuados, es más como "cuánto tiempo tuvo algo que hacer al menos un disco en la matriz RAID". Estoy excluyendo deliberadamente cualquier tipo de caché aquí:si la solicitud se puede atender desde el caché, la posibilidad de que aparezca en %util, a diferencia de otros valores, es bastante insignificante.
Lo que esto también significa:el subsistema RAID se puede cargar desde el 6,25 % (un disco haciendo el trabajo) hasta el 100 % (todos ellos ocupados). Eso es mucha información en un solo valor de '100%', ¿no es así?
%util
se denomina ocupado en el código fuente de iostat:https://code.google.com/p/tester-higkoo/source/browse/trunk/Tools/iostat/iostat.c#380
Ocupado se cuenta como porcentaje de Ticks
a deltams
, limitado al 100 %
busy = 100.0 * blkio.ticks / deltams; /* percentage! */
if (busy > 100.0) busy = 100.0;
DeltaMS es la suma de la carga del sistema durante el período de tiempo (tiempo de usuario + tiempo del sistema + tiempo de inactividad + 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;
Marcas:es el Time of requests in queue
por el período
blkio.ticks = new_blkio[p].ticks
- old_blkio[p].ticks;
En la versión más actual de sysstat, el código es un poco diferente: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 se rellena en el 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);
Y está el relleno de 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
se leen desde "sysfs stat para el dispositivo de bloque o partición actual " en read_sysfs_file_stat
(iostat.c:487) y ioi
y ioj
son estadísticas actuales y anteriores.