zoukankan      html  css  js  c++  java
  • 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
    

    二、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
    
     
     
     
     
     
  • 相关阅读:
    开发一个基于 Android系统车载智能APP
    Xilium.CefGlue利用XHR实现Js调用c#方法
    WPF杂难解 奇怪的DisconnectedItem
    (转)获取安卓iOS上的微信聊天记录、通过Metasploit控制安卓
    mac 安装npm
    mac安装Homebrew
    关于面试,我也有说的
    【分享】小工具大智慧之Sql执行工具
    领域模型中分散的事务如何集中统一处理(C#解决方案)
    小程序大智慧,sqlserver 注释提取工具
  • 原文地址:https://www.cnblogs.com/zjz20/p/13793536.html
Copyright © 2011-2022 走看看