
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