Loading... # iostat介绍 iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装: ``` $ sudo apt install sysstat ``` <div class="tip inlineBlock warning"> 本文中的原始环境为Ubuntu 20.04.1 </div> # iostat主要作用 iostat 主要用于监控系统设备的 IO 负载情况,iostat 首次运行时显示自系统启动开始的各项统计信息,之后运行 iostat 将显示自上次运行该命令以后的统计信息。 iostat 的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU 使用情况。CPU 统计数据是作为所有处理器之间的平均值在系统范围内计算的。iostat 也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。 # 使用 - 语法格式: iostat <options> <device name> - 常用选项: -c 只显示 CPU 的信息 -d 只显示设备信息 --human 以友好的方式显示结果 -j { ID | LABEL | PATH | UUID | ... } 显示设备的持久化名称 -k 以 k 为单位显示 -m 以 m 为单位显示 -N 显示任何设备映射器设备的注册设备映射器名称,用于查看LVM2统计数据 -p [ { device [,...] | ALL } ] 显示块设备及其分区的信息 -t 显示每次输出的时间 -V 显示 iostat 的版本信息 -x 显示更多的设备列 -z 如果没有变化就不重复输出信息 interval 连续输出,每 interval 秒输出一次 count 与 interval 连用,指定一共输出多少次 ## CPU信息 iostat 输出中的 CPU 部分是对CPU使用情况的统计信息(以百分比的形式显示): ``` avg-cpu: %user %nice %system %iowait %steal %idle 0.26 0.01 0.26 0.03 0.00 99.45 ``` ### user 进程在用户地址空间中消耗 CPU 时间的百分比。像 shell 程序、各种语言的编译器、数据库应用、web 服务器和各种桌面应用都算是运行在用户地址空间的进程。这些程序如果不是处于 idle 状态,那么绝大多数的 CPU 时间都是运行在用户态。[/tab] ### nice 可以通过 nice 值调整进程用户态的优先级。这里显示的是调整过 nice 值的进程消耗掉的 CPU 时间。如果系统中没有进程被调整过 nice 值,那么 ni 就显示为 0。 ### system 进程在内核地址空间中消耗 CPU 时间的百分比。所有进程要使用的系统资源都是由 Linux 内核处理的。当处于用户态(用户地址空间)的进程需要使用系统的资源时,比如需要分配一些内存、或是执行 IO 操作、再或者是去创建一个子进程,此时就会进入内核态(内核地址空间)运行。事实上,决定进程在下一时刻是否会被运行的进程调度程序就运行在内核态。对于操作系统的设计来说,消耗在内核态的时间应该是越少越好。在实践中有一类典型的情况会使 sy 变大,那就是大量的 IO 操作,因此在调查 IO 相关的问题时需要着重关注它。 ### iowait CPU 等待磁盘 IO 操作的时间。和 CPU 的处理速度相比,磁盘 IO 操作是非常慢的。有很多这样的操作,比如:CPU 在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU 只能处于空闲状态。Linux 系统在计算系统平均负载时会把 CPU 等待 IO 操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过 iowait 来判断系统的性能瓶颈是不是过多的 IO 操作造成的。 ### steal 只有 Linux 在作为虚拟机运行时 steal 才是有意义的。它表示虚机等待 CPU 资源的时间(虚机分到的是虚拟 CPU,当需要真实的 CPU 时,可能真实的 CPU 正在运行其它虚机的任务,所以需要等待)。 ### idle CPU 处于 idle 状态的百分比。一般情况下, user + nice + idle 应该接近 100%。 ## 设备信息 设备报告提供每个物理设备或分区的统计信息。可以在命令行中指定要显示统计信息的块设备和分区。如果没有输入设备或分区,那么将显示系统使用的每个设备的统计信息,并提供内核为其维护统计信息。如果命令行上给出了 ALL 关键字,那么将显示系统定义的每个设备的统计信息,包括那些从未使用过的设备。默认情况下,传输速率显示在 1K 块中,除非设置环境变量POSIXLY_CORRECT,在这种情况下使用 512 字节块。根据所使用的标志,报告可显示以下字段: ``` Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd scd0 0.00 0.00 0.00 0.00 8420 0 0 vda 1.98 0.07 18.26 0.00 415779 108849956 0 ``` ### Device Device 列显示 /dev 目录中列出的设备(或分区)名称。 ### tps 每秒发送到设备的 I/O 请求数。多个逻辑请求可以组合成对设备的单个 I/O 请求。 ### Blk_read/s 每秒读取的磁盘块的数量。 ### Blk_wrtn/s 每秒写入的磁盘块的数量。 ### Blk_read 读取的块的总数。 ### Blk_wrtn 写入的总块数。 ### r/s 设备每秒完成的读请求数(合并后)。 ### w/s 设备每秒完成的写请求数(合并后)。 ### sec/s 每秒从设备读取或写入的扇区数。 ### rsec/s 每秒从设备读取的扇区数。 ### wsec/s 每秒写入设备的扇区数。 ### rqm/s 每秒钟排队到设备的合并后的 I/O 请求数量。 ### rrqm/s 每秒钟排队到设备的合并后的读请求数。 ### wrqm/s 每秒钟排队到设备的合并后的写请求数。 ### %rrqm 在发送到设备之前合并到一起的读请求的百分比。 ### %wrqm 在发送到设备之前合并到一起的写请求的百分比。 ### areq-sz 向设备发出的 I/O 请求的平均大小(单位为 k)。 ### rareq-sz 向设备发出的读请求的平均大小(单位为 k)。 ### wareq-sz 向设备发出的写请求的平均大小(单位为 k)。 ### await 平均每次 I/O 操作的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。 ### r_await 平均每次读请求的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。 ### w_await 平均每次写请求的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。 ### aqu-sz 发送到设备的请求的平均队列长度。 ### %util 向设备发出 I/O 请求的运行时间百分比(设备的带宽利用率),换句话说就是一秒中有百分之多少的时间用于 I/O 操作。当连续处理请求的设备的这个值接近100%时,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈。但是对于并行处理请求的设备,例如 RAID 阵列和现代 SSD,这个数字并不反映它们的性能限制。 ## 常见用法 1. 默认显示CPU信息和所有的设备信息 ``` root@VM-4-10-ubuntu:~# iostat Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.26 0.01 0.26 0.03 0.00 99.45 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd scd0 0.00 0.00 0.00 0.00 8420 0 0 vda 1.98 0.07 18.26 0.00 415779 108849956 0 ``` 2. 只显示CPU信息 ``` root@VM-4-10-ubuntu:~# iostat -c Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.26 0.01 0.26 0.03 0.00 99.45 ``` 3. 只显示设备信息 ``` root@VM-4-10-ubuntu:~# iostat -d Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd scd0 0.00 0.00 0.00 0.00 8420 0 0 vda 1.98 0.07 18.26 0.00 416031 108863840 0 ``` 4. 指定某一个设备或多个设备的信息 ``` root@VM-4-10-ubuntu:~# iostat -d vda Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416031 108865156 0 root@VM-4-10-ubuntu:~# iostat -d vda vdb Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416031 108865244 0 vdb 1.98 0.07 18.26 0.00 416031 108865244 0 ``` 5. 显示块设备及其分区的信息(可以通过逗号分隔指定多个磁盘设备) ``` root@VM-4-10-ubuntu:~# iostat -d -p vda Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416031 108865796 0 vda1 0.00 0.00 0.00 0.00 632 0 0 vda2 1.98 0.07 18.26 0.00 414143 108865796 0 root@VM-4-10-ubuntu:~# iostat -d -p vda,vdb Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416031 108865796 0 vda1 0.00 0.00 0.00 0.00 632 0 0 vda2 1.98 0.07 18.26 0.00 414143 108865796 0 vdb 1.98 0.07 18.26 0.00 416031 108865796 0 vdb1 0.00 0.00 0.00 0.00 632 0 0 vdb2 1.98 0.07 18.26 0.00 414143 108865796 0 ``` 6. 以M为单位显示数字 ``` Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd vda 1.98 0.00 0.02 0.00 406 106315 0 ``` 7. 显示时间戳 ``` root@VM-4-10-ubuntu:~# iostat -t -d vda Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) 11/24/2021 03:13:50 PM Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416031 108867908 0 ``` 8. 显示更多的设备信息 ``` root@VM-4-10-ubuntu:~# iostat -x -d vda Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) 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 vda 0.00 0.07 0.00 36.96 2.31 35.07 1.98 18.26 1.80 47.69 1.26 9.23 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.22 ``` 9. 连续输出 iostat支持连续输出信息,可以指定一个以秒为单位的间隔时间,还可以指定输出次数。 ``` root@VM-4-10-ubuntu:~# iostat -d vda 2 Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416491 108884668 0 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 0.00 0.00 0.00 0.00 0 0 0 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.00 0.00 8.00 0.00 0 16 0 root@VM-4-10-ubuntu:~# iostat -d vda 2 3 Linux 5.4.0-77-generic (VM-4-10-ubuntu) 11/24/2021 _x86_64_ (2 CPU) Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.98 0.07 18.26 0.00 416491 108884684 0 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 1.00 0.00 20.00 0.00 0 40 0 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd vda 0.00 0.00 0.00 0.00 0 0 0 ``` # 参考 [iostat man page](https://man7.org/linux/man-pages/man1/iostat.1.html) Last modification:November 24, 2021 © Allow specification reprint Like 1 If you think my article is useful to you, please feel free to appreciate