如何计算磁盘IO负载百分比?

如何计算磁盘IO负载百分比?

以下是 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

相关内容