您的位置 首页 系统运维

详细讲解io性能监控工具iostat命令的Linux基础知识

Linux系统存在性能问题。一般我们可以通过top、iostat、free、vmstat等命令来检查初始定位问题。IOstat可以提供更丰富的io性能状态数据。

1.基本用途
$iostat -d -k 1 10

参数-d表示显示设备(磁盘)的使用状态;-k某些以块为单位的列被强制使用千字节为单位;10表示数据显示每1秒刷新一次,总共显示10次。

$iostat -d -k 1 10
设备:TPS kB _ read/s kB _ wrtn/s kB _ read kB _ wrtn
sda 39.29 21.14 1.44 441339807 299999 200535
sda 1 1623 523
sda 2 1.32 1.43 4.54 2983473948
sda 3 6.30 0.85 24.95 178868686686
sda 5 0.85 0.46 3.40 9543503 70970151535
sda6
sda7 0.00 0.00
sda8 0.00 0.00 0.00
sda9 0.00
60.68 18.35 71.43 568686868686

设备:TPS kB _ read/s kB _ wrtn/s kB _ read kB _ wrtn
100.04 5056 100
sda1 0.00 0.00 0

提示:指示每秒发送到设备的传输次数。“一次传输”是指“一次I/O请求”。多个逻辑请求可以合并成一个I/O请求。“一次传输”请求的大小未知。

KB_read/s:每秒从设备读取的数据量(驱动器表示);KB_wrtn/s:每秒写入设备的数据量(驱动器表示);KB_read:读取的数据总量;KB_wrtn:写入的数据总量;这些单位是千字节。

在上面的例子中,我们可以看到磁盘sda及其分区的统计信息。当时磁盘的总TPS是39.29。这里是每个分区的TPS。(因为是瞬时值,所以总TPS并不严格等于每个分区的TPS之和)

2.-x参数

我们可以通过使用-x参数获得更多的统计数据。

iostat -d -x -k 1 10
设备:rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-SZ avgqu-SZ await SVC TM % util
sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
设备:rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-SZ avgqu-SZ await SVC TM % util
sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20

Rrm/s:每秒合并多少个与该设备相关的读请求(当系统调用要读取的数据时,VFS向每个FS发送请求,如果FS发现不同的读请求读取同一块的数据,FS会合并这个请求);Wrqm/s:每秒有多少与此设备相关的写请求被合并。

Rsec/s:每秒读取的扇区数;Wsec/:每秒写入的扇区数量。r/s:每秒向设备发出的读取请求数;w/s:每秒向设备发出的写请求数;

Await:每个IO请求的平均处理时间(以微秒和毫秒为单位)。这里可以理解为IO的响应时间。一般情况下,系统IO的响应时间应该小于5ms,但如果大于10ms,响应时间会更大。

%util:统计时间内的所有IO处理时间除以总统计时间。例如,如果统计间隔为1秒,设备正在处理IO 0.8秒,空闲0.2秒,则设备的% util = 0.8/1 = 80%,因此该参数暗示了设备的繁忙程度。一般来说,如果这个参数是100%,就意味着设备正在接近满负荷运行(当然,如果是多磁盘,即使%util是100%,由于磁盘的并发性,磁盘使用率也不一定是瓶颈)。

3.-c参数

Iostat还可以用于获取一些cpu状态值:

iostat -c 1 10
平均CPU:%用户%好的%系统%低等待%空闲
1.98 0.00 0.35 11.45 86.22
平均CPU:%用户%好的%系统%低等待%空闲
1.62 0.00 0.25 34.46 63.67

4.一般用法

$iostat -d -k 1 10 #查看TPS和吞吐量信息
Iostat -d -x -k 1 10 #检查设备利用率(%util)和响应时间(await)
Iostat -c 1 10 #查看cpu状态

5.个案分析

$iostat -d -k 1 |grep sda10
设备:TPS kB _ read/s kB _ wrtn/s kB _ read kB _ wrtn
60.72 18.95 71 . 5686868666687
299.02 4266.67 129.41 4352 132
sda 10 483.84 4589.90 45544 456667
218.00 3360.00 100.00 3360 100
sda 10 546.00 8784.00 124.00 8784 124
sda 10 13232.00 136.00 13232 136

如上图所示,平均每秒磁盘传输次数约为400次;磁盘每秒读取5MB左右,写入1MB左右。

iostat -d -x -k 1
设备:rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-SZ avgqu-SZ await SVC TM % util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

您可以看到磁盘的平均响应时间是80。磁盘响应正常,但是已经很忙了。

扩展:

Rrm/s:每秒merge的读操作数,即delta(rmerge)/s
Wrqm/s:每秒的合并写入次数,即delta (wmerge)/s。
R/s:每秒读取I/O设备的数量,即delta (Rio)/s。
W/s:每秒钟I/O设备写入的次数,即delta (WIO)/s
Rsec/s:每秒读取的扇区数,即delta (rsect)/S。
Wsec/s:每秒写入的扇区数,即delta(wsect)/s
RkB/s:每秒读取的K字节数。它是rsect/s的一半,因为每个扇区的大小是512字节。(需要计算)
WkB/s:每秒写入的K字节数。是WSECT/S的一半(需要计算)
Avgrq-sz:每个设备I/O操作的平均数据大小(扇区)。Delta(rsect+wsect)/Delta(Rio+Wio)
Avgqu-sz:平均I/O队列长度,即delta(aveq)/s/1000(因为aveq以毫秒为单位)。
Await:每个设备I/O操作的平均等待时间(毫秒),即delta(Russe+Wuse)/delta(Rio+Wio)
Svctm:每个设备I/O操作的平均服务时间(ms),即delta(use)/delta(rio+wio)
%util:一秒中有多少百分比用于I/O操作,或者一秒中I/O队列有多少次不是空的。即delta(使用)/s/1000(因为使用单位是毫秒)

如果%util接近100%,则I/O请求太多,I/O系统已满,并且磁盘
可能存在瓶颈。
当空闲小于70%时,IO压力会更高,一般读取速度会更慢。
同时可以查看B参数(等待资源的进程数)和wa参数(IO等待占用CPU时间的百分比,高于30%时IO压力大)
另外await的参数要参考svctm。如果差太大,肯定有IO问题。
Avgqu-sz也是做IO调优需要注意的地方。这直接就是每次操作的数据大小。如果次数多,但是数据少,IO其实会很小。如果数据很大,IO数据会很高。也可以使用avqu-SZ× (r/s或w/s) = rsec/s或wsec/s,即

你也可以参考
一般来说,svctm比await小(因为同时等待的请求的等待时间是重复计算的)。svctm的大小一般和磁盘性能有关,CPU/内存的负载也会影响。请求过多会间接导致svctm的增加。await通常取决于服务时间(svctm)、I/O队列的长度和I/O请求的发出模式。如果svctm接近await,I/O几乎没有等待时间;如果await远大于svctm,说明I/O队列太长,应用程序的响应时间慢。如果响应时间超过了用户允许的范围,可以考虑更换更快的磁盘,调整内核电梯算法,优化应用,或者升级CPU。
队列长度(avgqu-sz)也可以作为衡量系统I/O负载的指标,但是avgqu-sz因为是基于单位时间的平均值,所以不能反映瞬时I/O洪流。

别人的好榜样。(I/O系统与超市排队)

比如我们在超市排队结账的时候是怎么决定去哪个付款台的?首先看排队人数。5个人总比20个人快吧?除了数人头,我们还经常看前面的人买了多少东西。如果我们前面有一个买菜一周的阿姨,可以考虑换个队列。还有就是收银的速度。如果遇到一个连钱都不会数的新手,那就只能等了。另外,时机也很重要。五分钟前人满为患的收银台现在空无一人。这个时候付钱当然很爽。

I/O系统与超市排队也有许多相似之处:

R/s+w/s类似于付款人总数。
平均排队长度(avgqu-sz)类似于单位时间内平均排队人数。
平均服务时间(svctm)类似于收银员的收款速度。
平均等待时间和每个人的平均等待时间差不多。
平均I/O数据(avgrq-sz)类似于每个人买了多少。
I/O操作率(%util)类似于人们在收银台前排队的时间比例。

根据这些数据,我们可以分析I/O请求的模式、I/O的速度和响应时间。

热门文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注