¿Cómo calcular el porcentaje de carga de E/S del disco?

¿Cómo calcular el porcentaje de carga de E/S del disco?

La siguiente es la salida net-snmp y, como puede ver, diskIOLA no está disponible:

SNMP table: UCD-DISKIO-MIB::diskIOTable

diskIOIndex diskIODevice diskIONRead diskIONWritten diskIOReads diskIOWrites diskIOLA1 diskIOLA5 diskIOLA15 diskIONReadX diskIONWrittenX

      25          sda   845276160     2882477056      576632     42597061         ?         ?          ?   5140243456    883350772736

Según las definiciones aquíhttp://www.net-snmp.org/docs/mibs/ucdDiskIOMIB.html:

discoIOLAxsignifica la carga promedio del disco de x minutos (%).

Los otros valores en la tabla son:

  • diskIONRead: el número de bytes leídos desde este dispositivo desde el inicio.
  • diskIONWritten: el número de bytes escritos en este dispositivo desde el inicio.
  • diskIOReads: el número de accesos de lectura desde este dispositivo desde el inicio.
  • diskIOWrites: el número de accesos de escritura a este dispositivo desde el inicio

Entonces, ¿cómo se puede calcular esta carga manualmente, si no se recopila en el servidor?

Al final, queremos mostrar gráficas a los usuarios donde puedan encontrar si un disco IO es pesado o no. Podemos mostrar esto usando bytes de lectura/escritura/seg o solicitudes de lectura/escritura/seg.

Si mostramos solo las solicitudes de lectura/escritura/segundo, podemos saber que hay una gran cantidad de E/S. Pero no sabremos si esto afecta la velocidad de lectura y escritura del disco.

Y mostrar la velocidad de lectura/escritura por sí solo no puede decirnos por qué se ve afectada la velocidad, ya sea debido a demasiadas operaciones de E/S o a que no hay suficiente memoria intermedia para escrituras asincrónicas. Por lo tanto, necesitamos mostrar ambos.

Pero, ¿qué significa el otro valor del disco IOLoad y cómo podemos calcularlo y por qué no se recopila en snmp? ¿Causa una carga enorme si se habilita esto? Si genera una gran carga al recopilar este valor, podemos calcularlo manualmente. Pero, ¿cuál es la fórmula?

Respuesta1

La información que indica que tiene no es suficiente para calcular el porcentaje de utilización del disco. El porcentaje de utilización del disco se calcula como disk_time_spent_in_io / elapsed_time.
Por ejemplo, si su disco dedica 0,25 segundos a realizar E/S en un período de 1 segundo, entonces su disco se utiliza en un 25 %.

El número de operaciones no tiene sentido cuando se trata del porcentaje de utilización. Dependiendo de su disco y del tipo de IO que esté realizando (masiva o aleatoria), podría utilizarse al 100% a 10 IOPS o 10000 IOPS. La única forma de saberlo es cuánto tiempo le toma al disco realizar esos IOP.

Respuesta2

Para todos los que buscan una solución, iostat calcula un porcentaje a partir de /sys/block/sda/stat. La fórmula es aproximadamente:

{now,past}_tot_ticks = total time this block device has been active (/sys/block/sda/stat)
{now,past}_uptime = uptime in /proc/uptime (first value)

percentage = (now_tot_ticks - past_tot_ticks) / (now_uptime - past_uptime) / 10

Un comando para obtener la carga de IO en porcentaje durante un segundo:

$ cat \
    <(cat /sys/block/sda/stat && cat /proc/uptime)            \
    <(sleep 1 && cat /sys/block/sda/stat && cat /proc/uptime) \
    | awk -v RS="" '{printf "%.2f%\n", ($27-$10)/($33-$16) / 10}';

Lectura adicional:
[1]https://www.kernel.org/doc/Documentation/block/stat.txt
[2]https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-uptime
[3]https://github.com/sysstat/sysstat/blob/v11.4.3/iostat.c

información relacionada