iostat和iotop

iostat用于输出CPU和磁盘I/O相关的统计信息.
 
iotop 是用于查看硬盘操作的工具,可显示 Linux 系统上哪些进程执行最多的 I/O。

一、iostat部分

1、直接执行iostat可以显示下面内容:

# iostat 
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	2020年10月10日 	_x86_64_	(3 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.08    0.00    0.19    0.12    0.00   99.61
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               0.01         0.38         0.00       5188          0
sda               0.94        28.69         2.84     387369      38280
scd0              0.00         0.08         0.00       1028          0
dm-0              0.85        26.32         1.69     355363      22788
dm-1              0.01         0.16         0.00       2204          0
各个输出项目的含义如下:
avg-cpu段:
%user: 在用户级别运行所使用的CPU的百分比.
%nice: nice操作所使用的CPU的百分比.
%system: 在系统级别(kernel)运行所使用CPU的百分比.
%iowait: CPU等待硬件I/O时,所占用CPU百分比.
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle: CPU空闲时间的百分比.
Device段:
tps: 每秒钟发送到的I/O请求数.
Blk_read /s:  每秒读取的block数.
Blk_wrtn/s:  每秒写入的block数.
Blk_read:   读入的block总数.
Blk_wrtn:   写入的block总数.

2、iostat参 数说明

-c 仅显示CPU统计信息.与-d选项互斥.
-d 仅显示磁盘统计信息.与-c选项互斥.
-k 以K为单位显示每秒的磁盘请求数,默认单位块.
-p device | ALL
  与-x选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p后指定一个设备名,如:
# iostat -p  sda
或显示所有设备
# iostat -p ALL
-t    在输出数据时,打印搜集数据的时间.
-V    打印版本号和帮助信息.
-x    输出扩展信息.
-m 以兆字节每秒为单位显示统计信息(MB/s)

 3、iostat输出项目说明

Blk_read:读入块的当总数.
Blk_wrtn:写入块的总数.
kB_read/s:每秒从驱动器读入的数据量,单位为K.
kB_wrtn/s:每秒向驱动器写入的数据量,单位为K.
kB_read:读入的数据总量,单位为K.
kB_wrtn:写入的数据总量,单位为K.
rrqm/s:将读入请求合并后,每秒发送到设备的读入请求数.
wrqm/s:将写入请求合并后,每秒发送到设备的写入请求数.
r/s:每秒发送到设备的读入请求数.
w/s:每秒发送到设备的写入请求数.
rsec/s:每秒从设备读入的扇区数.
wsec/s:每秒向设备写入的扇区数.
rkB/s:每秒从设备读入的数据量,单位为K.
wkB/s:每秒向设备写入的数据量,单位为K.
avgrq-sz:发送到设备的请求的平均大小,单位是扇区.
avgqu-sz:发送到设备的请求的平均队列长度.
await:I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒.
svctm:发送到设备的I/O请求的平均执行时间.单位是毫秒.
%util:在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率.
当这个值接近100%时,表示设备带宽已经占满.

4、使用组合示例

每隔2秒,显示一次设备统计信息,总共输出6次。

iostat -d 2 6
# iostat -xz 1
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	2020年10月10日 	_x86_64_	(3 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06    0.00    0.16    0.08    0.00   99.70

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb               0.00     0.00    0.01    0.00     0.27     0.00    72.06     0.00    1.64    1.64    0.00   1.13   0.00
sda               0.00     0.01    0.51    0.17    20.07     2.16    65.53     0.01   10.68   13.83    1.03   3.66   0.25
scd0              0.00     0.00    0.00    0.00     0.05     0.00   114.22     0.00   21.06   21.06    0.00  20.72   0.00
dm-0              0.00     0.00    0.45    0.18    18.41     1.36    63.48     0.01   11.41   15.56    1.01   3.95   0.25
dm-1              0.00     0.00    0.00    0.00     0.11     0.00    50.09     0.00    0.16    0.16    0.00   0.09   0.00
  1. r/s, w/s, rkB/s, wkB/s:这些表示设备上每秒钟的读写次数和读写的字节数(单位是k字节)。这些可以看出设备的负载情况。性能问题可能就是简单的因为大量的文件加载请求。

  2. await:I/O 等待的平均时间(单位是毫秒)。这是应用程序所等待的时间,包含了等待队列中的时间和被调度服务的时间。过大的平均等待时间就预示着设备超负荷了或者说设备有问题了。

  3. avgqu-sz:设备上请求的平均数。数值大于 1 可能表示设备饱和了(虽然设备通常都是可以支持并行请求的,特别是在背后挂了多个磁盘的虚拟设备)。

  4. %util:设备利用率。是使用率的百分数,展示每秒钟设备工作的时间。这个数值大于 60% 则会导致性能很低(可以在 await 中看),当然这也取决于设备特点。这个数值接近 100% 则表示设备饱和了。

如果存储设备是一个逻辑磁盘设备,后面挂载了多个磁盘,那么 100% 的利用率则只是表示有些 I/O 是在 100% 处理,然而后端的磁盘或许远远没有饱和,还可以处理更多的请求。

请记住,磁盘 I/O 性能低不一定是应用程序的问题。许多技术通常都被用来实现异步执行 I/O,所以应用程序不会直接阻塞和承受延时(比如:预读取和写缓冲技术)。

每隔2秒显示一次sda及上面所有分区的统计信息,共输出6次.

iostat -p sda 2 6
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 2020年10月10日 _x86_64_ (3 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.06 0.00 0.16 0.08 0.00 99.71 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.67 19.74 2.14 387369 41916 sda1 0.06 1.33 0.79 26138 15491 sda2 0.60 18.28 1.35 358655 26424

显示块设备的扩展信息,以k为单位,每1秒刷新一次,总刷新10次。

# iostat -d -k -x 1 10
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	2020年10月10日 	_x86_64_	(3 CPU)
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00  9915.00    1.00   90.00     4.00 34360.00   755.25    11.79  120.57   6.33  57.6

对于以上示例输出,我们可以获取到以下信息:

每秒向磁盘上写30M左右数据(wkB/s值)
每秒有91次IO操作(r/s+w/s),其中以写操作为主体
平均每次IO请求等待处理的时间为120.57毫秒,处理耗时为6.33毫秒
等待处理的IO请求队列中,平均有11.79个请求驻留

以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:

util = (r/s+w/s) * (svctm/1000)

对于上面的例子有:util = (1+90)*(6.33/1000) = 0.57603

指定查看sda的TPS和吞吐量信息(磁盘读写速度单位为MB),每间隔2秒刷新一次

 iostat -d -m 2 |grep sda
   Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
   sda               0.19         0.00         0.07        230      12004
   sda             368.00         0.00       184.00          0        368
   sda             373.00         0.00       186.25          0        372
   sda             351.00         0.00       175.50          0        351
   sda             345.50         0.00       172.75          0        345
   sda             362.50         0.00       181.00          0        362 
   sda             375.00         0.00       187.39          0        374
   sda             369.00         0.00       184.36          0        368

统计磁盘的io情况,附带时间

# iostat -dxkt

Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 	2020年10月13日 	_x86_64_	(3 CPU)

2020年10月13日 10时11分54秒
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.02     0.70   31.10    2.87  1259.99   104.54    80.34     0.33    9.66   10.02    5.72   3.25  11.05
sdb               0.00     0.00    0.37    0.00    13.33     0.00    72.34     0.00    0.12    0.12    0.00   0.09   0.00
scd0              0.00     0.00    0.05    0.00     2.65     0.00   114.22     0.00    8.83    8.83    0.00   8.50   0.04
dm-0              0.00     0.00   29.85    3.44  1177.30    64.56    74.61     0.33    9.85   10.16    7.09   3.29  10.96
dm-1              0.00     0.00    0.23    0.00     5.68     0.00    50.09     0.00    0.19    0.19    0.00   0.11   0.00

使用shell命令iostat监控iowait是否超负载

取值 %iowait

#!/bin/bash
iowait_val=$(iostat -c  | grep -v avg | grep '[^/s]' | grep -v Li | awk '{print $4}')

val=$(echo "scale=0; $iowait_val/1" | bc)

if [ $val -ge  10 ]

then

    echo "iowait is" $iowait_val

fi

解析:
1、iostat 查看当前io信息,-c获取cpu信息,awk 单独获取 iowait的值
2、表达式运算,使用bc进行浮点数运算,scale进行浮点数位数设置,由于scale只对幂运算、除法运算有效,所以除以1
3、‘’ or $() 是为了执行linux命令

二、iotop部分

#  iotop

Total DISK READ :	0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:	0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                    
   587 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.01 % [kworker/0:3]
  9216 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % rsyslogd -n [in:imjournal]
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
     3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
     5 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]

输出解释
# Total DISK READ:从磁盘中读取的总速率
# Total DISK WRITE:往磁盘里写入的总速率
# Actual DISK READ:从磁盘中读取的实际速率
# Actual DISK WRITE:往磁盘里写入的实际速率
# TID:线程ID,按p可转换成进程ID
# PRIO:优先级
# USER:线程所有者
# DISK READ:从磁盘中读取的速率
# DISK WRITE:往磁盘里写入的速率
# SWAPIN:swap交换百分比
# IO>:IO等待所占用的百分比
# COMMAND:具体的进程命令

搭配参数使用

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -o, --only            仅显示产生(产生过)IO的进程;
  -b, --batch           批量模式,无法进行交互模式,多次的输出依次刷新;
  -n NUM, --iter=NUM    置退出前执行的次数,可以结合-b方便日志输出;
  -d SEC, --delay=SEC   delay between iterations [1 second]
  -p PID, --pid=PID     processes/threads to monitor [all]
  -u USER, --user=USER  表示控制仅显示user用户的相关进程;
  -P, --processes       only show processes, not all threads
  -a, --accumulated     显示累积流量,方便查看发生IO的总量
  -k, --kilobytes       use kilobytes instead of a human friendly unit
  -t, --time            在每行上输出当前的时间戳,会以batch模式输出
  -q, --quiet           suppress some lines of header (implies --batch)  
如每2秒批量显示实际执行I/O的进程或线程
# iotop -bod2
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND

 

 
 
 
 
 
posted @ 2020-10-10 16:42  凡人半睁眼  阅读(548)  评论(0编辑  收藏  举报