前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux系列-2】iostat命令详解

【Linux系列-2】iostat命令详解

作者头像
云深i不知处
发布2020-09-16 09:47:59
3.9K0
发布2020-09-16 09:47:59
举报
文章被收录于专栏:测试基础

iostat命令详解

1 iostat简介

iostat命令是Linux系统上查看I/O性能最基本的工具,其全称为 I/O statistics。iostat能统计磁盘活动情况,也能统计CPU使用情况。 iostat属于sysstat软件包,可以通过命令进行安装:

代码语言:javascript
复制
yum install sysstat

iostat数据的来源是Linux操作系统的/proc/diskstats:

代码语言:javascript
复制
# cat /proc/diskstats
   8       0 sda 239219 1806 37281259 2513275 904326 88832 50268824 26816609 0 4753060 29329105
   8       1 sda1 338 0 53241 6959 154 0 5496 3724 0 6337 10683
   8       2 sda2 238695 1797 37226458 2504489 620322 88832 50263328 25266599 0 3297988 27770221
   8      16 sdb 1009117 481 1011773 127319 0 0 0 0 0 126604 126604
   8      17 sdb1 1008792 480 1010929 127078 0 0 0 0 0 126363 126363
 253       0 dm-0 1005 0 8040 15137 30146 0 241168 2490230 0 30911 2505369
 253       1 dm-1 192791 0 35500457 2376087 359162 0 44095600 22949466 0 2312433 25325563
 253       2 dm-2 47132 0 1717329 183565 496207 0 5926560 7348763 0 2517753 7532688

注意,procfs中的前三个字段:主设备号、从设备号、设备名。

从第四个字段开始,介绍的是该设备的相关统计:

  1. rd_ios:读操作的次数
  2. rd_merges:合并读操作的次数。如果两个读操作读取相邻的数据块,那么可以被合并成1个。
  3. rd_sectors:读取的扇区数量
  4. rd_ticks:读操作消耗的时间(以毫秒为单位)。每个读操作从__make_request()开始计时,到end_that_request_last()为止,包括了在队列中等待的时间。
  5. wr_ios:写操作的次数
  6. wr_merges:合并写操作的次数
  7. wr_sectors:写入的扇区数量
  8. wr_ticks:写操作消耗的时间(以毫秒为单位)
  9. in_flight:当前未完成的I/O数量。在I/O请求进入队列时该值加1,在I/O结束时该值减1。 注意:是I/O请求进入队列时,而不是提交给硬盘设备时。
  10. io_ticks:该设备用于处理I/O的自然时间(wall-clock time)
  11. time_in_queue:对字段#10(io_ticks)的加权值

iostat有以下缺陷:

  1. iostat的输出结果大多数是一段时间内的平均值,因此难以反映峰值情况
  2. iostat仅能对系统整体情况进行分析汇报,却不能针对某个进程进行深入分析。
  3. iostat未单独统计IO处理信息,而是将IO处理时间和IO等待时间合并统计,因此包括await在内的指标并不能非常准确地衡量磁盘性能表现。

2 命令与参数项

2.1 命令格式

代码语言:javascript
复制
iostat[参数][时间][次数]

例如,iostat -d -x -k 1 3:每1s采集一次数据,显示3次,以kb为单位显示磁盘使用情况详细信息。

2.2 参数详解

  1. -x 显示详细信息
  2. -C 显示CPU使用情况,与-d选项互斥
  3. -d 显示磁盘使用情况,与-C选项互斥
  4. -k 以 KB 为单位显示
  5. -m 以 M 为单位显示
  6. -N 显示磁盘阵列(LVM) 信息
  7. -n 显示NFS 使用情况
  8. -p[磁盘] 显示磁盘和分区的情况
  9. -t 显示终端和CPU的信息
  10. -V 显示版本信息

3 输出项目说明

使用iostat后,结果面板如下:

代码语言:javascript
复制
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.44    0.00    0.39    0.00    0.00   98.17

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.37         0.47        30.30    3561197  229837730
dm-0              0.44         0.33        29.97    2518272  227313194
dm-1              0.12         0.13         0.33    1013276    2520308
dm-2              0.00         0.00         0.00        502       2068

3.1 cpu属性

iostat结果面板 avg-cpu 描述的是系统cpu使用情况:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。

3.2 磁盘属性

iostat结果面板 Device 项描述的是系统磁盘使用情况:

  • tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
  • kB_read/s:每秒从设备(drive expressed)读取的数据量;
  • kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
  • kB_read:读取的总数据量;
  • kB_wrtn:写入的总数量数据量;

4 使用实例

4.1 查看磁盘详情

命令:

代码语言:javascript
复制
iostat -d -x -k 1 1

输出结果:

代码语言:javascript
复制
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.03     0.16    0.01    0.36     0.47    30.30   165.95     0.02   55.32    9.22   56.77  13.56   0.50
dm-0              0.00     0.00    0.01    0.44     0.33    29.97   136.71     0.02   54.07   12.12   54.68  11.28   0.50
dm-1              0.00     0.00    0.03    0.08     0.13     0.33     8.00     0.12 1015.22    5.91 1420.78   0.41   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00    48.96     0.00    1.27    0.37    9.80   1.27   0.00

结果说明:

  • rrqm/s:每秒合并读操作的次数,如果两个读操作读取相邻的数据块时,可以被合并成一个,以提高效率。合并的操作通常是I/O scheduler(也叫elevator)负责的。
  • wrqm/s:每秒合并写操作的次数
  • r/s:每秒读操作的次数
  • w/s:每秒写操作的次数
  • rKB/s:每秒读取的字节数(KB)
  • wKB/s:每秒写入的字节数(KB)
  • rkB/s:每秒读K字节数,是 rsect/s 的一半,因为每扇区大小为512字节(需要计算)
  • wkB/s:每秒写K字节数,是 wsect/s 的一半(需要计算)
  • avgrq-sz:每个IO的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位
  • avgqu-sz:平均未完成的IO请求数量,即平均意义上的请求队列长度
  • await:平均每个IO所需要的时间,包括在队列等待的时间,也包括磁盘控制器处理本次请求的有效时间
    • r_await:每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间。
    • w_wait:每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间。
  • svctm:表面看是每个IO请求的服务时间,不包括等待时间,但是实际上,这个指标已经废弃。实际上,iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间。
  • %util:表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有。

4.2 其他

  1. iostat 1 3:每隔 1秒刷新显示,且显示3次
  2. iostat -d sda1:显示指定磁盘信息
  3. iostat -t:显示tty和Cpu信息
  4. iostat -m:以M为单位显示所有信息
  5. iostat -d -k 1 1:查看TPS和吞吐量信息
  6. iostat -d -x -k 1 1:查看设备使用率(%util)、响应时间(await)
  7. iostat -c 1 3:查看cpu状态,每隔 1秒刷新显示,且显示3次

5 深入解析

5.1 avgqu-sz

IO请求的队列长度,反映了系统磁盘任务处理的繁忙程度,该值越大,表示排队等待处理的IO请求越多。 平均队列长度的计算: 我们考虑如下的场景,如果同一时间来了250个IO请求,后续再也没有新的请求到来。这种情况下,每个请求处理时间都是4ms,那么所有IO的平均等待时间为:

代码语言:javascript
复制
平均等待时间 = 单个请求处理时间*(1+2+3+4...+(请求总数-1))/请求总数

对于我们的例子来说,平均等待时间是 500ms,那么所有IO花费的总时间为250*500 = 125000ms,这个时间除以1000ms,得到 125,即平均队列长度。 这个值很明显是符合直观的。排在队列最前端的IO认为,队列的长度是0,第2个IO认为队列的长度是1,第3个IO认为队列的长度是2,最后一个认为队列的长度是249。

5.2 await

await是单个I/O所消耗的时间,包括硬盘设备处理I/O的时间和I/O请求在kernel队列中等待的时间:

代码语言:javascript
复制
await  = IO 平均处理时间 + IO在队列的平均等待时间

正常情况下队列等待时间可以忽略不计:

代码语言:javascript
复制
await = ((所有读IO的时间)+(所有写IO的时间))/((读请求的个数) + (写请求的个数))

这个值,多大算正常呢? 对于SSD,从0.0x毫秒到1.x毫秒不等,具体看产品手册。 对于机械硬盘,大致来说一万转的机械硬盘是8.38毫秒,包括寻道时间、旋转延迟、传输时间。 关于await的一个误区是,人们常常武断地认为,await值比较高,就认为磁盘性能差,其实,await这个值不能反映硬盘设备的性能。 我们考虑两种IO的模型:

  • 250个IO请求同时进入等待队列
  • 250个IO请求依次发起,待上一个IO完成后,发起下一个IO

第一种情况await高达500ms,第二个情况await只有4ms,但是都是同一块盘。 在实践中,要根据应用场景来判断await是否正常,如果I/O模式很随机、I/O负载比较高,会导致磁头乱跑,寻道时间长,那么相应地await要估算得大一些;如果I/O模式是顺序读写,只有单一进程产生I/O负载,那么寻道时间和旋转延迟都可以忽略不计,主要考虑传输时间,相应地await就应该很小,甚至不到1毫秒。 对磁盘阵列来说,因为有硬件缓存,写操作不等落盘就算完成,所以写操作的service time大大加快了,如果磁盘阵列的写操作不在一两个毫秒以内就算慢的了;读操作则未必,不在缓存中的数据仍然需要读取物理硬盘,单个小数据块的读取速度跟单盘差不多。

5.3 %util

%util表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有。

很多初学者看到%util 等于100%就说硬盘能力到顶了,这种说法是错误的。

由于现代硬盘设备都有并行处理多个I/O请求的能力,所以%util即使达到100%也不意味着设备饱和了,举个简化的例子:

  1. 某硬盘处理单个I/O需要0.1秒,有能力同时处理10个I/O请求。
  2. 当10个I/O请求依次顺序提交的时候,需要1秒才能全部完成,在1秒的采样周期里%util达到100%。
  3. 而如果10个I/O请求一次性提交的话,0.1秒就全部完成,在1秒的采样周期里%util只有10%。

可见,即使%util高达100%,硬盘也仍然有可能还有余力处理更多的I/O请求,即没有达到饱和状态。那么iostat有没有哪个指标可以衡量硬盘设备的饱和程度呢?很遗憾,没有。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • iostat命令详解
  • 1 iostat简介
  • 2 命令与参数项
    • 2.1 命令格式
      • 2.2 参数详解
      • 3 输出项目说明
        • 3.1 cpu属性
          • 3.2 磁盘属性
          • 4 使用实例
            • 4.1 查看磁盘详情
              • 4.2 其他
              • 5 深入解析
                • 5.1 avgqu-sz
                  • 5.2 await
                    • 5.3 %util
                    相关产品与服务
                    对象存储
                    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档