GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo se calcula la utilidad de iostat?

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 por HZ , mientras que la documentación indica que está en USER_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.


Linux
  1. Cómo usar el comando grep de Linux

  2. Cómo llegó Linux al mainframe

  3. ¿Cómo Instalar R 3.3.1 En El Directorio Propio?

  4. ¿Cómo cambiar el nombre de host?

  5. Cómo girar la pantalla en una Raspberry Pi 3

Cómo usar el comando xargs de Linux

Cómo usar el comando tee de Linux

Cómo usar el comando superior en Linux

Cómo usar el comando ping de Linux

Cómo configurar el nombre de host bonito

¿Cómo emular la Raspberry Pi 2 en QEMU?