io排查工具 iostat/iotop/vmstat

2023-05-01 16:10:47 浏览数 (1)

一、iostat安装与用法介绍

主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。

用户可以通过指定统计的次数和时间来获得所需的统计信息。

1、安装(RedHat系列)

查看系统是否安装这个命令

代码语言:javascript复制
#which iostat       ##显示如下,表示系统已经安装了
/usr/bin/iostat
如果没有安装,则安装
#yum install sysstat -y

2、语法

代码语言:javascript复制
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
-d    表示显示设备(磁盘)使用状态
-x    表示显示和io相关的扩展数据
-k    表示某些使用block为单位的列强制使用Kilobytes为单位

用法1:

代码语言:javascript复制
#iostat -x -k    
Linux 2.6.18-308.el5 (Ser108)   10/31/2014
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.00    0.04    0.00   99.95
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.97  0.01  0.58     0.20     6.29    21.98     0.02   28.71   6.81   0.40
sda1              0.00     0.00  0.00  0.00     0.00     0.00    14.83     0.00    8.87   7.90   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00    35.35     0.00    5.23   4.60   0.00
sda3              0.00     0.97  0.01  0.58     0.20     6.29    21.98     0.02   28.71   6.81   0.40

注:如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负载,该磁盘可能存在瓶颈。

用法2:

代码语言:javascript复制
#iostat -d -k 2     --其中2表示数据显示每隔2秒刷新一次
输出如下:
Linux 2.6.18-308.el5 (Ser108)   11/05/2014
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.82         0.18         8.47     857070   39382031
sda1              0.00         0.00         0.00        869         59
sda2              0.00         0.00         0.00        760          0
sda3              0.82         0.18         8.47     855221   39381972
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              10.45         0.00       121.39          0        244
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3             10.45         0.00       121.39          0        244

输出信息解释:

代码语言:javascript复制
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:写入的总数量:这些单位都为Kilobytes,即KB

3、指定监控的设备

代码语言:javascript复制
#iostat -d sda 2

-x  参数  该选项将用于显示和io相关的扩展数据,可以获取更详细的数据,

例如:

代码语言:javascript复制
#iostat -d -x -k 1 4    --表示每1秒刷新一次,一共刷新4次。
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     1.29  0.01  0.81     0.18     8.47    21.18     0.03   39.95   5.98   0.49
sda1              0.00     0.00  0.00  0.00     0.00     0.00    14.73     0.00    9.71   8.75   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00    35.35     0.00    5.23   4.60   0.00
sda3              0.00     1.29  0.01  0.81     0.18     8.47    21.18     0.03   39.95   5.98   0.49
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     3.00  0.00 18.00     0.00    80.00     8.89     0.88   32.56   2.72   4.90
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda3              0.00     3.00  0.00 18.00     0.00    80.00     8.89     0.88   32.56   2.72   4.90

输出信息解释:

代码语言:javascript复制
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
r/s: The number of read requests that were issued to the device per second 每秒发出的读取请求的数量
w/s: The number of write requests that were issued to the device per second 没面发出的写入请求的数量
rkB/s: The number of kilobytes read from the device per second 以千字节每秒从设备读取数
wkB/s: The number of kilobytes written to the device per second. 以千字节每秒从设备写入取数
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。    
await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
         这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。         
svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。

%util: 这个值越小越好,在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
rsec/s:每秒读取的扇区数;
wsec/: 每秒写入的扇区数。

-c 参数,查看cpu信息

代码语言:javascript复制
#iostat -c 1 2     #表示每1秒刷新一次,一共刷新2次
Linux 2.6.32-431.23.3.el6.x86_64 (zookeeper1)   05/27/2016      _x86_64_        (2 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.92    0.00    0.27    0.32    0.00   98.49
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

4、常见用法:

代码语言:javascript复制
#iostat -d -k 1 10         #查看TPS和吞吐量信息
#iostat -d -x -k 1 10      #查看设备使用率(%util)、响应时间(await)
#iostat -c 1 10            #查看cpu状态

5、实例分析

代码语言:javascript复制
#iostat -d -k 1 8
Linux 2.6.32-504.el6.x86_64 (kvm5)      05/27/2016      _x86_64_        (8 CPU)
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              25.41         3.72        93.20   16601966  416182172
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              42.00         0.00       104.00          0        104
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              52.00         0.00       172.00          0        172
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              34.00         0.00       128.00          0        128
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               9.00         0.00        16.00          0         16
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              25.00         0.00        72.00          0         72
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              31.00         0.00        80.00          0         80
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              24.00         0.00        92.00          0         92
以上可以看到,磁盘每秒传输次数平均约30,每秒磁盘读取较少,写入较多,约为100kB
#iostat -d -k -x 1 5
Linux 2.6.32-504.el6.x86_64 (kvm5)      05/27/2016      _x86_64_        (8 CPU)
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.00     1.27    0.11   25.30     3.72    93.20     7.63     0.03    1.04   35.76    0.89   0.71   1.81
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.00     7.00    0.00   32.00     0.00   132.00     8.25     0.12    3.84    0.00    3.84   1.75   5.60
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.00     7.00    0.00   58.00     0.00   420.00    14.48     0.03    0.60    0.00    0.60   0.59   3.40
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.00     0.00    0.00   27.00     0.00    76.00     5.63     0.01    0.37    0.00    0.37   0.33   0.90
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.00     0.00    0.00    5.00     0.00    32.00    12.80     0.02    4.80    0.00    4.80   4.80   2.40
以上可以看到,磁盘的平均响应时间较小,为0,磁盘使用率平均为3.0左右,比较小。

二、iotop工具

1、介绍

iotop命令是专门显示硬盘IO的命令,界面风格类似top命令。这个命令只有在kernelv2.6.20及以后的版本中才有。

2、安装

代码语言:javascript复制
#yum install iotop -y

3、实例

代码语言:javascript复制
#iotop 显示如下,可以看到有一个进程,io占用比较多
Total DISK READ: 6.42 M/s | Total DISK WRITE: 0.00 B/s    
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                                         
 1476 be/4 root        6.42 M/s    0.00 B/s  0.00 % 57.63 % java -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xm~2.5.4-SNAPSHOT-FERDI/lib/stax2-api-3.1.1.jar:/root/dubbo-monitor-simple-2
 1475 be/4 root        0.00 B/s   92.21 K/s  0.00 %  0.00 % java -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xm~2.5.4-SNAPSHOT-FERDI/lib/stax2-api-3.1.1.jar:/root/dubbo-monitor-simple-2
 1455 be/4 root        0.00 B/s    7.68 K/s  0.00 %  0.00 % java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /usr/~per.server.quorum.QuorumPeerMain /usr/local/zookeeper/bin/../conf/zoo.cfg
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
    8 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/1]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
   10 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/1]
   11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
   12 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/1]
   13 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cgroup]
   14 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [khelper]
   15 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]
   16 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [async/mgr]
   17 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [pm]
   18 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [sync_supers]
   19 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [bdi-default]
   20 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kintegrityd/0]
   21 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kintegrityd/1]

2、参数

代码语言:javascript复制
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -o, --only            only show processes or threads actually doing I/O
  -b, --batch           non-interactive mode
  -n NUM, --iter=NUM    number of iterations before ending [infinite]
  -d SEC, --delay=SEC   delay between iterations [1 second]
  -p PID, --pid=PID     processes/threads to monitor [all]
  -u USER, --user=USER  users to monitor [all]
  -P, --processes       only show processes, not all threads
  -a, --accumulated     show accumulated I/O instead of bandwidth
  -k, --kilobytes       use kilobytes instead of a human friendly unit
  -t, --time            add a timestamp on each line (implies --batch)
  -q, --quiet           suppress some lines of header (implies --batch)

二、vmstat 工具

vmstat是一个即时显示内存使用情况的工具,一般系统自带的都有

vmstat 使用方法:

代码语言:javascript复制
vmstat [-V] [-n] [delay [count]]
 -V 显示vmstat的版本;
 -n causes the headers not to be reprinted regularly.
 -a 显示所有激活和未激活内存的状态;print inactive/active page stats.
 -d 显示硬盘统计信息;prints disk statistics
 -D 显示硬盘分区表;prints disk table
 -p 显示硬盘分区读写状态等;prints disk partition statistics
 -s 显示内存使用情况;prints vm table
 -m prints slabinfo
 -S 定义单位,k K
 delay 是两次刷新时间间隔;
 单位体积: k:1000 K:1024 m:1000000 M:1048576 (默认是 K)
 count 刷新次数;

一个实例:

代码语言:javascript复制
#vmstat 3 5   ##表示每3秒更新一次输出信息,连续统计5次结束。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  1      0 82471648 149068 7528352    0    0     0    12    0    1 16 18 66  0  0
 3  0      0 82471760 149068 7528352    0    0     0    72 79652 150274 17 20 63  0  0
 3  0      0 82471936 149068 7528352    0    0     0    64 79561 150275 16 20 64  0  0
 5  0      0 82471936 149068 7528352    0    0     0    88 79784 150146 17 20 62  0  0

解释:

代码语言:javascript复制
r  :The number of processes waiting for run time. 等待运行时间的进程数,即等待的进程数、
b  :The number of processes in uninterruptible sleep. 在等待io的进程数
swpd: 虚拟内存的使用量
free:空闲内存量
buff:缓冲区中的内存
cache:被用来做为高速缓存的内存数
si: 从磁盘交换到内存的交换页数量,单位:KB/秒。
so: 从内存交换到磁盘的交换页数量,单位:KB/秒。
bi: 发送到块设备的块数,单位:块/秒。
bo: 从块设备接收到的块数,单位:块/秒。
in: 每秒的中断数,包括时钟中断。
cs: 每秒的环境(上下文)转换次数。
us:用户进程使用的时间 。以百分比表示。
sy:系统进程使用的时间。 以百分比表示。
id:中央处理器的空闲时间 。以百分比表示。
wa:io等待时间
st:Time stolen from a virtual machine

转载于:https://blog.51cto.com/linuxg/1783853

0 人点赞