以下内容大多来自iostat的man文档,会加上部分自己的理解,英文水平好的同学也可以直接看man文档
命令使用:
iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | ... } [ device [...] | ALL ] ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
看着有点乱,我们可以归纳为:
iostat [-参数] [指定磁盘] [采集周期频率] [采集次数]
比如iostat -k sda 5 2
表示采集sda磁盘上的相关信息,每5秒采集一次,一共采集2次。-k参数表示以kb来显示。
相关参数介绍:
参数 | 详解 |
---|---|
-c | 只显示cpu相关统计信息(默认是同时显示cpu和磁盘信息) |
-d | 只显示磁盘统计信息(默认是同时显示cpu和磁盘信息) |
-h | 使用NFS的输出报告更加友好可读。NFS通过-n来开启 |
-j { ID | LABEL | PATH | UUID | … } | 磁盘列表的Device列要用什么维度来描述磁盘 |
-k | 默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以kb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的) |
-m | 默认情况下,iostat的输出是以block作为计量单位,加上这个参数可以以mb作为计量单位显示。(该参数仅在linux内核版本2.4以后数据才是准确的) |
-N | 显示磁盘阵列(LVM) 信息 |
-n | 显示NFS相关统计数据(network fileSystem)。但是这个参数只在linux内核版本2.6.17之后有用 |
-p [ { device [,…] | ALL } ] | 显示磁盘分区的相关统计信息(默认粒度只到磁盘,没有显示具体的逻辑分区) |
-t | 每次输出报告时显示系统时间, |
-V | 显示当前iostat的版本信息 |
-x | 显示更详细的磁盘报告信息,默认只显示六列,加上该参数后会显示更详细的信息。这个参数也需要在内核版本2.4之后才能使用 |
-y | 跳过不显示第一次报告的数据,因为iostat使用的是采样统计,所以iostat的第一次输出的数据是自系统启动以来累计的数据 |
-z | 只显示在采样周期内有活动的磁盘 |
通过uname -a可以查看当前linux系统的内核版本。2.4版本后一个block的大小通常是512byte
默认情况下,第一次的输出信息的数据是从操作系统启动以来的累计数据,第二次开始才是真正的采样周期内的真实数据,这点和top命令很像。我们可以加上-y来过滤掉第一次的输出信息。
iostat的输出信息主要可以分为3大部分:
默认情况下,iostat只会显示cpu和磁盘部分的统计信息。如下图:
加上-n可以显示NFS的统计信息。由于本人在多个系统上测试均没有具体的数值输出,因此下面只介绍cpu和磁盘部分的统计信息。
这里的cpu统计信息只是取平均值,如果是多核cpu,想看每核cpu的具体统计信息,可以使用top命令。
下面的百分比计算一般采用公式: 消耗时间*100.0/采样时间
iowait可以作为磁盘是否是系统瓶颈的参考值,但并不能全信。iowait表示的含义是cpu没在工作而在等待io的时间占比,在cpu高速运转的情况下也会出现iowait高的情况,这并不能表明磁盘性能就有问题。唯一能说明磁盘性能差的应该是根据磁盘的read/write时间,一般来说,一次读写就是一次寻道+一次旋转延迟+数据传输的时间。现代硬盘数据传输就是几微秒或者几十微秒的事情,远远小于寻道时间220ms和旋转延迟48ms,所以只计算这两个时间就差不多了,也就是15~20ms。如果磁盘读写时间大于20ms,就要考虑是否是磁盘读写太多,导致磁盘性能降低了。
在没加-x
参数时,默认输出以下六列:
如果加了-x
参数,会详细更加详细的数据,如下图:
网上许多博客都说用svctm可以衡量磁盘的性能,但是在iostat的man文档中有提到,让我们不要相信这个列的输出值,并且在后面的版本中会去除这个统计项。
所以要统计磁盘性能,综合来说还是用await列的信息来判断。一般的磁盘读写性能在20ms左右,如果await比这个数值大很多,就说明当前系统存在很大的IO问题。
和大多的系统指标统计一样,iostat的数据也基本来自/proc虚拟文件系统。不了解/proc虚拟文件系统的同学自行百度,这里就不多做介绍了。
比如 iostat -x 的数据则来自于 /proc/diskstats文件下的数据。另外,各种linux发行版的proc虚拟文件系统实现可能会有偏差,因此iostat输出的内容也可能不太一致。
https://blog.51cto.com/291268154/1981358
https://bean-li.github.io/dive-into-iostat/