iostat

我们首先看看单纯使用iostat命令会出现什么

iostat计算io的原理_iostat计算io的原理

这里按照不同行分别进行解释

  • 第一行主要展示了当前机器的基本信息,例如是x86架构和当前时间,最后显示了机器的CPU(本机使用了虚拟机)
  • 第二行是有关CPU的相关信息,值得大家注意的是%system、%iowait和%idle这三个参数。其中%system是CPU在内核模式下的运行时间,代表系统调用占用的程序时间。%iowait则是在等待io完成占用的时间,如果该值较高则代表我们程序的io请求大于底层磁盘的负载。%idle值代表我们的程序的CPU使用效率,相对需要高一点(相对高代表程序大部分时间都在正常执行,如果太低代表程序执行效率较低)
  • %user:CPU处在用户模式下的时间百分比
  • %nice:CPU处在带NICE值的用户模式下的时间百分比
  • %system:CPU处在系统模式下的时间百分比
  • %iowait:CPU等待输入输出完成时间的百分比
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
  • %idle:CPU空闲时间百分比
  • 第三行就是磁盘的使用信息了,按照不同列总结如下
  • 磁盘的名称
  • 该设备每秒的传输次数,值得注意的是传输次数并不总是等于IO请求次数。由于IO合并的存在,两者关系为每秒传输次数<=IO请求次数
  • kB_read/s和kB_wrtn/s分别代表磁盘每秒的读取和写入速度(统计时间是从开机开始)
  • kB_read和kB_wrtn分别代表读取和写入的总数据量(统计时间是从开机开始)
    简单的iostat命令解析就如同上面所示,但是这种方式的使用并不能给我们太多的信息,例如我们只能从整体来查看磁盘信息无法了解在指定时间内磁盘的状态变化,因此我们需要附加相应的参数

常见的命令使用方法

一般情况下我们可能会使用命令iostat -d -k 2 3这个命令,然后会出现以下结果

iostat计算io的原理_iostat计算io的原理_02

这个命令实际上就解决了我们之前说到的无法及时反映磁盘变化的问题,上述命令的效果就是对磁盘使用进行采样,2秒采样一次,采样3次。其中第一次就是当前的磁盘状态后面次数就是在2秒的时间间隔内磁盘状态变化,后续在分析程序的io使用时可以使用这个命令

当然,如果想知道更详细的信息可以加上-x命令,因此命令变为iostat -d -k 2 2,实际效果如下

iostat计算io的原理_iostat计算io的原理_03

这里我想讲一下详细命令中比较关心的列

  • await处理io请求时等待的时间
  • svctm平均每次io处理的时间

其他相关参数如下

列名

说明

rrqm/s

每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

wrqm/s

每秒对该设备的写请求被合并次数

r/s

每秒完成的读次数

w/s

每秒完成的写次数

rkB/s

每秒读数据量(kB为单位)

wkB/s

每秒写数据量(kB为单位)

avgrq-sz

平均每次IO操作的数据量(扇区数为单位)

avgqu-sz

平均等待处理的IO请求队列长度

await

平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)

svctm

平均每次IO请求的处理时间(毫秒为单位)

%util

采用周期内用于IO操作的时间比率,即IO队列非空的时间比率