以下是 net-snmp 输出,如您所见,diskIOLA 不可用:
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
根据这里的定义http://www.net-snmp.org/docs/mibs/ucdDiskIOMIB.html:
磁盘IOLAx表示磁盘x分钟平均负载(%)。
表中的其他值是:
- diskIONRead - 自启动以来从此设备读取的字节数。
- diskIONWritten - 自启动以来写入该设备的字节数。
- diskIOReads - 自启动以来从此设备读取访问的次数。
- diskIOWrites - 自启动以来对此设备的写入访问次数
那么,由于该负载没有在服务器中收集,如何手动计算呢?
最后,我们希望向用户展示图表,让他们可以了解磁盘 IO 是否繁忙。我们可以使用读/写字节/秒或读/写请求/秒来显示它。
如果我们单独显示每秒读/写请求数,我们就可以知道正在发生大量 I/O。但我们不知道磁盘读/写速度是否受此影响。
仅显示 R/W 速度并不能告诉我们速度受到影响的原因 - 是否是因为 I/O 操作过多或没有足够的缓冲内存用于异步写入。因此,我们需要同时显示两者。
但是,磁盘 IOLoad 的另一个值是什么意思,我们如何计算它,以及为什么它没有被 snmp 收集。如果启用此功能会导致巨大的负载吗?如果收集这个值造成很大的负载,那么我们可以手动计算它。但是,公式是什么?
答案1
您所提供的信息不足以计算磁盘利用率百分比。磁盘利用率% 计算如下disk_time_spent_in_io / elapsed_time
。
例如,如果您的磁盘在 1 秒的时间内花费 0.25 秒执行 IO,则您的磁盘利用率为 25%。
对于利用率百分比而言,操作次数毫无意义。根据您的磁盘以及您正在执行的 IO 类型(批量与随机),它可能在 10 IOPS 或 10000 IOPS 时得到 100% 的利用率。唯一了解的方法是查看磁盘执行这些 IOP 所需的时间。
答案2
对于每个寻找解决方案的人,iostat 都会计算一个百分比/sys/block/sda/stat
。公式大致为:
{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
获取一秒内 IO 负载百分比的命令:
$ 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}';
延伸阅读:
[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