通过命令iostat,iotop查看Linux系统IO性能,信息指标分析详解
Posted the丶only
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过命令iostat,iotop查看Linux系统IO性能,信息指标分析详解相关的知识,希望对你有一定的参考价值。
一 、前言
一款Linux下的io性能监控软件,用于统计CPU使用情况和块设备I/O情况,统计时间为上次执行到目前。iostat可以给我们提供丰富的IO状态数据
二 、命令参数
iostat [选项] [<时间间隔>] [<次数>]
-c: 显示CPU使用情况
-d: 显示磁盘使用情况
-N: 显示磁盘阵列(LVM) 信息
-n: 显示NFS 使用情况
-k: 以 KB 为单位显示
-m: 以 M 为单位显示
-t: 报告每秒向终端读取和写入的字符数和CPU的信息
-V: 显示版本信息
-x: 显示详细信息
-p:[磁盘] 显示磁盘和分区的情况
三 、信息指标详解
常用命令:
iostat -x 1
#或者
iostat -x 1 10
显示详细信息,每1秒采集一次。10采集10次
$ iostat -x 1
Linux 5.4.0-77-generic (VM-20-6-ubuntu) 11/23/2021 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.23 0.01 0.23 0.02 0.00 99.51
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
scd0 0.00 0.02 0.00 0.00 0.88 35.13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
vda 0.06 1.22 0.03 36.10 0.63 21.11 2.86 28.85 2.36 45.22 1.11 10.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.22
avg-cpu: %user %nice %system %iowait %steal %idle
1.50 0.00 3.00 0.50 0.00 95.00
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
vda 1.00 4.00 0.00 0.00 1.00 4.00 7.00 56.00 7.00 50.00 0.71 8.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
系统信息:
- 内核版本、当前日期、CPU架构、CPU核数目;
CPU使用统计信息: 用户进程使用率、系统使用率、空闲率等;且以下指标加起来和为1
- %user:CPU处在用户模式下的时间百分比。
- %nice:CPU处在带NICE值的用户模式下的时间百分比。
- %system:CPU处在系统模式下的时间百分比。
- %iowait:CPU等待输入输出完成时间的百分比。如果%iowait的值过高,表示硬盘存在I/O瓶颈
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
- %idle:CPU空闲时间百分比。%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
块设备I/O统计信息: 每秒读写的数据量、总读写数据量等。
读指标:
- r/s: 每秒完成的读 I/O 设备次数。即 rio/s,这个大可能说明很多随机IO
- rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
- rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
- %rrqm:在发送到设备之前合并到一起的读请求的百分比。
- r_await:每个读操作平均所需的时间,重点关注,对于HDD,高于20ms可能就请求太多,导致排队了,因为正常一次寻道也就10ms。
- rareq-sz:向设备发出的读请求的平均大小(单位为 k)
写指标:
- w/s: 每秒完成的写 I/O 设备次数。即 wio/s
- wkB/s: 每秒写K字节数。是 wsect/s 的一半。
- wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
- %wrqm:在发送到设备之前合并到一起的写请求的百分比。
- w_await:平均每次写请求的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。重点关注,对于HDD,高于20ms可能就请求太多,导致排队了,因为正常一次寻道也就10ms。
- wareq-sz:向设备发出的写请求的平均大小(单位为 k)。
抛弃指标:
- d/s:每秒设备完成的抛弃请求数(合并后)。
- dkB/s:从设备中每秒抛弃的kB数量
- drqm/s: 每秒排队到设备中的合并抛弃请求的数量
- %drqm:抛弃请求在发送到设备之前已合并在一起的百分比。
- d_await: 发出要服务的设备的抛弃请求的平均时间(以毫秒为单位)。 这包括队列中的请求所花费的时间以及为请求服务所花费的时间。
- dareq-sz: 发出给设备的抛弃请求的平均大小(以千字节为单位)。
其它指标:
-
aqu-sz: 发出到设备的请求的平均队列长度。 注意:在以前的版本中,此字段称为avgqu-sz。这个指标高需要重点关注,可能IO太多,需要等待
-
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比,向设备发出I/O请求的经过时间百分比(设备的带宽利用率)。 当串行服务请求的设备的该值接近100%时,将发生设备饱和。 但是对于并行处理请求的设备(例如RAID阵列和现代SSD),此数字并不反映其性能限制。这个指标高说明IO基本上就到瓶颈了,但是低也不一定IO就不是瓶颈。一般%util大于70%,I/O压力就比较大.
同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(I/O等待所占用的CPU时间的百分比,高过30%时I/O压力高)
其它版本可能出现的指标: (系统版本不同,可能出现以下相关参数)
- avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
- avgqu-sz: 平均I/O队列长度。如果avgqu-sz比较大,也表示有当量io在等待。
- rsec/s: 每秒读扇区数。即 rsect/s
- wsec/s: 每秒写扇区数。即 wsect/s,
- r_await:每个读操作平均所需的时间,不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。
- w_await:每个写操作平均所需的时间,不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。
- await: 平均每次设备I/O操作的等待时间 (毫秒)。如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
- svctm: 平均每次设备I/O操作的服务时间 (毫秒)。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间
四 、iotop监控磁盘I/O相关进程
iotop 是一个类似 top 的工具,用来显示实时的磁盘活动。
iotop 监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。
命令参数使用
-o, --only只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
-b, --batch非交互模式,一般用来记录日志。
-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用。
-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1。
-p PID, --pid=PID指定监测的进程/线程。
-u USER, --user=USER指定监测某个用户产生的I/O。
-P, --processes仅显示进程,默认iotop显示所有线程。
-a, --accumulated显示累积的I/O,而不是带宽。
-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
-t, --time 加上时间戳,非交互非模式。
-q, --quiet 禁止头几行,非交互模式。有三种指定方式。
-q 只在第一次监测时显示列名
-qq 永远不显示列名。
-qqq 永远不显示I/O汇总。
#交互按键,和top命令类似,iotop也支持以下几个交互按键。
left和right方向键:改变排序。
r:反向排序。
o:切换至选项--only。
p:切换至--processes选项。
a:切换至--accumulated选项。
q:退出。
i:改变线程的优先级。
命令例子:
iotop -d 2 -n 5
#时间刷新间隔2秒,输出5次
iotop -botq -p 713848
#非交互式,输出pid为713848的进程信息,这里示例713848为nginx进程
$ iotop -botq -p 713848
17:34:09 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:09 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
TIME TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
17:34:10 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:10 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:11 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:11 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:12 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:12 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:13 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:13 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:14 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:14 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:15 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:15 Current DISK READ: 0.00 B/s | Current DISK WRITE: 39.95 K/s
17:34:16 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:16 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:17 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:17 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:18 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:18 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:19 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:19 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:20 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:20 Current DISK READ: 0.00 B/s | Current DISK WRITE: 235.86 K/s
17:34:21 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:21 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:22 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:22 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:23 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:23 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:24 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:24 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:25 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:25 Current DISK READ: 0.00 B/s | Current DISK WRITE: 495.76 K/s
17:34:26 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:26 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
17:34:27 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
17:34:27 Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
以上是关于通过命令iostat,iotop查看Linux系统IO性能,信息指标分析详解的主要内容,如果未能解决你的问题,请参考以下文章
查看系统的I/O使用iostat命令而使用iotop能够依据I/O统计信息排序,追踪到详细的进程