注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

Linux命令:iostat输出磁盘IO状态

系统管理 彭东稳 8045次浏览 已收录 1个评论

Linux系统出现了性能问题,一般我们可以通过top、iostat、free、vmstat、iotop、iftop等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。

一、安装sysstat

iostat命令是由sysstat包提供的,sysstat包提供有iostat、mpstat、sar、sa等命令,这一章我们就说iostat命令,iostat 命令用来监视系统输入/输出设备负载,这通过观察与它们的平均传送速率相关的物理磁盘的活动时间来实现。iostat命令生成的报告可以用来更改系统配置来更好地平衡物理磁盘和适配器之间的输入/输出负载。由iostat命令生成的第一份报告提供了关于自从系统被引导后的时间统计信息。后继的每一份报告都包含自上一次报告以来的时间。每次运行 iostat 命令时,就报告所有的统计信息。

二、基本使用

例如:

Device

此列提供了在/dev目录中列出的设备 (或分区) 名称。

tps

指示每秒向设备发出的IO读、写请求数量,也可以称之为IOPS。“一次传输”表示“一次I/O请求”,在内核层系统会把多个逻辑请求可能会合并为“一次I/O请求”,为了减少IO请求次数,比如两个4k请求合并成一个8k请求。

Blk_read/s (kB_read/s, MB_read/s)

指每秒从设备中读取的块数量,块等于扇区,等于512字节。如果使用选项-k,那么会显示:读取块数量乘以512字节就是每秒读取数据大小。

Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s)

指每秒从设备中写入的块数量,块等于扇区,等于512字节。如果使用选项-k,那么会显示:写入块数量乘以512字节就是每秒写入数据大小。

Blk_read (kB_read, MB_read)

取样时间间隔内读取的总块数,块等于扇区,等于512字节。如果使用选项-k,那么会显示:读取块数量乘以512字节就是每秒读取数据大小。

Blk_wrtn (kB_wrtn, MB_wrtn)

取样时间间隔内写入的总块数,块等于扇区,等于512字节。如果使用选项-k,那么会显示:写入块数量乘以512字节就是每秒写入数据大小。

上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,磁盘每秒传输次数平均约44.13(TPS)。因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和。每秒磁盘读取约80/s KB,写入约88/s KB。

高版本iostat已经默认使用k为单位显示统计信息,如在CentOS 7系统就是以k为单位显示统计信息。

三、参数”-x”

使用-x参数我们可以获得更多扩展统计信息,其中参数-d表示只显示设备(磁盘)使用状态;-k表示某些使用block为单位的列强制使用Kilobytes为单位;1表示数据显示每隔1秒刷新一次,10表示共显示10次。

rrqm/s

每秒对该设备的读请求被合并次数。为了效率,可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,最终交给磁盘。所以它将被计算 (和排队) 作为一个 I/O,此字段使你知道此操作的频率。

wrqm/s

每秒对该设备的写请求被合并次数。为了效率,可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,最终交给磁盘。所以它将被计算 (和排队) 作为一个 I/O,此字段使你知道此操作的频率。

r/s

每秒读取的次数(IOPS)。

w/s

每秒写入的次数(IOPS)。

rsec/s

每秒读取的扇区数,扇区数乘以512字节等于每秒读取的数据量。

wsec/s

每秒写入的扇区数,扇区数乘以512字节等于每秒写入的数据量。

rKB/s

每秒读数据量。

wKB/s

每秒写数据量。

avgrq-sz

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

avgqu-sz

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

await

每一次IO请求读写处理的平均时间(单位是毫秒),这包括队列中的请求所用的时间和为它们提供服务的时间。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。

r_await

每一次IO请求读处理的平均时间(单位是毫秒),这包括队列中的请求所用的时间和为它们提供服务的时间。

w_await

每一次IO请求写处理的平均时间(单位是毫秒),这包括队列中的请求所用的时间和为它们提供服务的时间。

svctm

平均每次IO请求的处理时间(毫秒为单位)。警告!不必太信任此字段,在未来版本会被移除。

%util

在统计时间内CPU所有处理IO时间除以总共统计时间的占比。例如,如果统计间隔1秒,CPU有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,即被IO消耗的CPU百分比,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经可能接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:%util = (r/s+w/s) * (svctm/1000)

对于上面的例子有:%util = (7.8+31.49)*(2.62/1000) = 0.098

常用的统计命令如下:

四、/proc/diskstats

对于统计类的命令,主要是收集系统中的参数,然后人性化地展示给我们观看,如iostat命令大概收集了几个主要系统文件如下:

iostat中磁盘信息实际上从/proc/diskstats读取相关数据。所以,理解了/proc/diskstats,也就理解了iostat。对于/proc/diskstats文件,基本信息如下。

用于显示磁盘、分区和统计信息:sda为整个硬盘的统计信息,sda1为第一个分区的统计信息,ramdisk设备为通过软件将RAM当做硬盘来使用的一项技术。

从左至右分别对应主设备号,次设备号和设备名称。后续的11个字段中除了第9个字段,所有的其他字段都是从启动时的累积值。

第1字段:读磁盘的次数,成功完成读的总次数。

第2字段:合并读完成次数。为了效率,可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,最终交给磁盘。所以它将被计算 (和排队) 作为一个 I/O,此字段使你知道此操作的频率。

第3字段:读扇区的次数,成功读过的扇区总次数。

第4字段:读花费的毫秒数,这是所有读操作所花费的毫秒数。

第5字段:写完成的次数,成功写完成的总次数。

第6字段:合并写完成次数。为了效率,可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,最终交给磁盘。所以它将被计算 (和排队) 作为一个 I/O,此字段使你知道此操作的频率。

第7字段:写扇区的次数,成功写扇区总次数。

第8字段:写花费的毫秒数,这是所有写操作所花费的毫秒数。

第9字段:正在处理的输入/输出请求数,就是I/O的当前进度,只有这个字段应该是0,随着请求被交给适当的队列并随着它们的完成而递减而递增。

第10字段:执行I/O操作花费的毫秒数,只要字段9为非0,这个字段会增长。

第11字段:执行I/O操作花费的毫秒数,在每次I/O开始、I/O完成、I/O合并时都会增加此字段,或读取正在进行的I/O数量的这些统计数据(字段9)乘以自上次更新此字段以来所花的毫秒数。这可以为I/O完成时间和可能累积的积压提供简单的度量。

<参考>

http://hustcat.github.io/iostats/

https://www.kernel.org/doc/Documentation/iostats.txt


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽