iostat命令可以查看CPU利用率和磁盘性能相关数据,有时候我们会觉得系统响应慢,传数据很慢,这个慢可能是多方面原因导致的,如CPU利用率高、网络差、系统平均负载高甚至是磁盘已经损坏了。对此,系统性能出问题时,磁盘I/O是一个值得重点分析的重要指标。
命令的使用方法很简单,但是要关注哪些报告值,报告的各个含义是什么,这个是必须要搞清楚的。对于Linux 块I/O不清楚的,可以参看我之前的文章: Linux内核之快I/O层
一、iostat命令使用
1.1 命令默认报告
默认报告CPU和磁盘的使用情况
以 blocks/s(块每秒)的形式报告利用率
默认只报告一次使用情况。可通过传参修改报告时间和次数。如:iostat 2 3,这表示每2秒报告一次,共计报告3次
1.2 常用选项
-c 只显示CPU利用率
-d 只显示磁盘利用率
-p 可以报告出每块磁盘的每个分区的使用情况
-k 以 字节/秒 为单位显示磁盘利用率报告
-x 显示扩张统计
-n 显示NFS(network filesystem)报告
1.3 各个报告结果字段含义
磁盘相关字段(磁盘性能指标)
tps 每秒I/O数(即IOPS。磁盘连续读和连续写之和)
Blk_read/s 每秒从设备读取的数据大小,单位是block/s(块每秒)
Blk_wrtn/s 每秒写入设备的数量,单位是block/s
Blk_read 从磁盘读出的块的总数
Blk_wrtn 写入磁盘的块的总数
kB_read/s 每秒从磁盘读取数据大小,单位KB/s
kB_wrtn/s 每秒写入磁盘的数据的大小,单位KB/s
kB_read 从磁盘读出的数据总数,单位KB
kB_wrtn 写入磁盘的的数据总数,单位KB
rrqm/s 每秒合并到设备的读取请求数
wrqm/s 每秒合并到设备的写请求数
r/s 每秒向磁盘发起的读操作数。
w/s 每秒向磁盘发起的写操作数。
rsec/s 每秒从设备读取的扇区数量。
wsec/s 每秒向设备写入的扇区数量。
avgrq-sz I/O 请求的平均大小,以扇区为单位,扇区个数。
avgqu-sz 向设备发起的I/O 请求队列的的平均队列长度
await I/O 请求的平均等待时间,单位为毫秒。这个时间包括请求队列(这个概念很重要)消耗的时间和为每个请求服务的时间
svctm I/O 请求的平均服务时间,单位为毫秒(这个数据不可信!)
%util 处理 I/O 请求所占用的时间的百分比,即设备利用率。I/O请求期间CPU时间的百分比(即设备的带宽利用率)。当这个值接近100%时,表示磁盘I/O已经饱和
这里有一个比较重要的概念就是请求队列,这点我在之前的文章中已经讲过了,不清楚的可以看文章开头的链接
1.4 常用组合
iostat -d -x
iostat -d 2 10
iostat -d -x 2 10
iostat -d -x -k 2 10
命令后的第一个数字表示报告时间间隔,第二个数字表示报告总次数
我一般用的多的是iostat -d -x ,因为这个报告的数据时从系统开机时的一个整体情况,如果加了时间和次数后,后续报告的数据就是设置的时间内磁盘使用情况变化。如果需要一直观察的话,可以使用iostat -d -x
如:
[root@master dev]# iostat -d -x 2 2
Linux 2.6.32-431.el6.x86_64 (master) 02/22/2017 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
scd0 0.01 0.00 0.01 0.00 0.16 0.00 29.65 0.00 6.35 6.18 0.00
sda 0.39 0.51 1.05 0.31 37.88 6.59 32.62 0.00 2.53 1.04 0.14
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.50 0.00 0.50 0.00 7.96 16.00 0.01 16.00 16.00 0.80
二、磁盘I/O性能监控指标
磁盘I/O性能主要监控的指标有如下几类:
1. 磁盘吞吐量。硬盘传输数据的能力,传输数据是读、写数据之和。当传输大块不连续数据时,该值可做参考。
吞吐量计算公式:
I/O吞吐量 = IOPS * 平均I/O数据大小(size)
注意:IOPS就是tps,即每秒I/O数
从公式可以看出,IOPS和平均数据大小越大,吞吐量则越大。
2. IOPS。磁盘每秒的I/O数(读、写之和)。当传输小块不连续数据时,该值可作为参考对象。在iostat报告中,tps=r/s+w/s
3. 数据平均大小。平均 I/O 数据尺寸为吞吐量除以 I/O 数目,该指标对揭示磁盘使用模式有重要意义。一般来说,如果平均 I/O 数据尺寸小于 32K,可认为磁盘使用模式以随机存取为主;如果平均每次 I/O 数据尺寸大于 32K,可认为磁盘使用模式以顺序存取为主。
备注:iostat命令输出的平均尺寸是以扇区为单位的,因此,转换成字节时,应该用 512 x 扇区数
4. 磁盘活动时间比 . 该值对用iostat输出的%util字段,表示磁盘处于活动时间的百分比,即磁盘利用率,磁盘在数据传输和处理命令(如寻道)处于活动状态。磁盘利用率与资源争用程度成正比,与性能成反比。也就是说磁盘利用率越高,资源争用就越严重,性能也就越差,响应时间就越长。一般来说,如果磁盘利用率超过 70%,应用进程将花费较长的时间等待 I/O 完成,因为绝大多数进程在等待过程中将被阻塞或休眠。
5. 服务时间。指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/ 内存的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过 20ms,一般可考虑会对上层应用产生影响。
6. I/O 等待队列长度。对用iostat输出的avgqu-sz。指待处理的 I/O 请求的数目,如果 I/O 请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过 2,一般认为该磁盘存在 I/O 性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的 I/O 等待队列长度。
7. 等待时间。对应iostat输出的await字段。指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果 I/O 请求持续超出磁盘处理能力,意味着来不及处理的 I/O 请求不得不在队列中等待较长时间。
这里我重点讲下吞吐量和IOPS(tps)。为什么呢?因为不同的业务场景,所需要的磁盘性能侧重点不同。对于磁盘随机读写频繁的业务,比如图片存取、数据库、邮件服务器等,此类业务吗,IOPS才是关键点。对于顺序读写频繁的业务,需要传输大块数据的,如视频点播、文件同步,关注的是磁盘的吞吐量。——如果平均 I/O 数据尺寸小于 32K,可认为磁盘使用模式是以随机存取为主(关注IOPS);如果平均每次 I/O 数据尺寸大于 32K,可认为磁盘使用模式以顺序存取为主(关注吞吐量)。
对上述论述可以做一个测试:写10MB文件,一个做法是一次写1024B,写10000次。第二个是一次写1B,写10240000次,测试结果如下:
[root@master dev]# dd if=/dev/zero of=/dev/null bs=1024 count=10000
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.00982995 s, 1.0 GB/s
[root@master dev]# dd if=/dev/zero of=/dev/null bs=1 count=10240000
10240000+0 records in
10240000+0 records out
10240000 bytes (10 MB) copied, 7.95257 s, 1.3 MB/s
从结果看出,写大块数据和写小块数据,吞吐量是不一样的。耗时相差也是很大。
在进行磁盘性能分析时要注意下各个指标之间的关系,结合iostat是要注意换算。
三、 磁盘性能怎么解决?
关于这点,我能想到的就是以下几种:
1. raid
2. 磁盘缓存、缓冲(内核层面,页高速缓存、缓冲)
3. 利用现有的一些开源软件缓存数据,如redis
其实牵扯到缓存的话,就是让程序直接和内存打交道,尽量避免去直接访问磁盘。但是有的情况下, 直接I/O(跳过缓存)又是业务所需求的,关于这点,具体问题具体分析吧。。。
四、iostat输出内容参数介绍
[root@host-47-106-141-17 ~]# iostat -d -k -x 1
Linux 3.10.0-693.2.2.el7.x86_64 (host-47-106-141-17) 06/20/2018 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.32 0.05 0.56 0.80 3.80 15.21 1.23 3.41 1.41 3.58 0.67 0.04
对于以上示例输出,我们可以获取到以下信息:
每秒向磁盘上写3.8kb左右数据(wkB/s值)
每秒有0.61次IO操作(r/s+w/s=0.05+0.56),其中以写操作为主体
平均每次IO请求等待时间为3.58毫秒(await),处理时间为0.67毫秒
等待处理的IO请求队列中,平均有1.23(avgqu-sz)个请求驻留
选项 说明
%user CPU在用户态执行进程的时间百分比。
%nice CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比
%system CPU处在内核态执行进程的时间百分比
%iowait CPU用于等待I/O操作占用CPU总时间的百分比
%steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
%idle CPU空闲时间百分比
注:
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是 CPU
选项 说明
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 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(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util:在 I/O 请求发送到设备期间,占用 CPU 时间的百分比。用于体现设备的带宽利用率。
注:
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当 %util 的值接近 100% 时,表示设备带宽已经占满。
---------------------
作者:东城绝神
来源:CSDN
原文:https://blog.csdn.net/m0_37814112/article/details/80661481
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
作者:燕涛
来源:CSDN
原文:https://blog.csdn.net/hankerzero/article/details/56484882
版权声明:本文为博主原创文章,转载请附上博文链接!