
A seguir está a saída net-snmp e, como você pode ver, diskIOLA não está disponível:
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
De acordo com as definições aquihttp://www.net-snmp.org/docs/mibs/ucdDiskIOMIB.html:
discoIOLAxsignifica a carga média de x minutos do disco (%).
Os outros valores da tabela são:
- diskIONRead - O número de bytes lidos deste dispositivo desde a inicialização.
- diskIONWritten - O número de bytes gravados neste dispositivo desde a inicialização.
- diskIOReads – O número de acessos de leitura deste dispositivo desde a inicialização.
- diskIOWrites – O número de acessos de gravação a este dispositivo desde a inicialização
Então, como essa carga pode ser calculada manualmente, já que ela não é coletada no servidor?
No final, queremos mostrar aos usuários gráficos onde eles podem descobrir se um IO de disco é pesado ou não. Podemos exibir isso usando leitura/gravação de bytes/s ou solicitações de leitura/gravação/s.
Se exibirmos apenas solicitações de leitura/gravação/seg, podemos saber que há E/S pesada acontecendo. Mas não saberemos se a velocidade R/W do disco é afetada por isso.
E exibir a velocidade R/W por si só não pode nos dizer por que a velocidade é afetada - seja por causa de muitas operações de E/S ou por falta de memória buffer para gravações assíncronas. Portanto, precisamos exibir ambos.
Mas qual é o outro valor do disco IOLoad e como podemos calculá-lo e por que ele não está sendo coletado no snmp. Isso causa uma carga enorme se ativar isso? Se causar muita carga na coleta desse valor, podemos calculá-lo manualmente. Mas, qual é a fórmula?
Responder1
As informações que você indica não são suficientes para calcular a% de utilização do disco. A % de utilização do disco é calculada como disk_time_spent_in_io / elapsed_time
.
Por exemplo, se o seu disco gastar 0,25 segundos executando IO em um período de 1 segundo, então seu disco será 25% utilizado.
O número de operações não tem sentido quando se trata de% de utilização. Dependendo do seu disco e do tipo de IO que você está executando (em massa versus aleatório), ele pode ser 100% utilizado a 10 IOPS ou 10.000 IOPS. A única maneira de saber é quanto tempo o disco está demorando para executar esses IOPs.
Responder2
Para todos que procuram uma solução, o iostat calcula uma porcentagem de /sys/block/sda/stat
. A fórmula é 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
Um comando para obter a carga de IO em porcentagem ao longo de um 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}';
Leitura 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