Linux磁盘I/O性能监控——iostat

0.194字数 1868阅读 11214

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 <interval> <count>

如:

[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(跳过缓存)又是业务所需求的,关于这点,具体问题具体分析吧。。。

推荐阅读更多精彩内容