• linux通过top和iostat查找io性能瓶颈


    有时我们希望程序最大程度地提高性能,比如在进行性能测试,或者需要大量数据需要处理的时候,可是程序性能到一定程度以后,就无法提升了,这时我们想知道主要是什么瓶颈造成了性能提升的限制。

    1. top命令

    top命令可以从整体上了解性能情况。以下是一台繁忙的机器的top部分输出信息:

    1. # top
    2. top - 10:12:51 up 25 days, 17:54, 1 user, load average: 3.18, 3.27, 3.44
    3. Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
    4. %Cpu(s): 23.3 us, 0.9 sy, 0.0 ni, 42.7 id, 33.1 wa, 0.0 hi, 0.0 si, 0.0 st
    5. KiB Mem : 16213768 total, 91924 free, 7002264 used, 9119580 buff/cache
    6. KiB Swap: 0 total, 0 free, 0 used. 8360968 avail Mem

    以下是一台空闲的机器的top部分输出信息:

    1. # top
    2. top - 10:14:26 up 46 days, 23:43, 3 users, load average: 0.33, 0.24, 0.19
    3. Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie
    4. %Cpu(s): 1.1 us, 0.8 sy, 0.0 ni, 96.8 id, 1.3 wa, 0.0 hi, 0.0 si, 0.0 st
    5. KiB Mem : 16181972 total, 223576 free, 4941164 used, 11017232 buff/cache
    6. KiB Swap: 0 total, 0 free, 0 used. 10424216 avail Mem

    us:用户态使用的cpu时间比

    sy:系统态使用的cpu时间比

    id:空闲的cpu时间比

    wa:cpu等待磁盘写入完成时间

    1.1 load比较

    从load值来看,繁忙机器的数值大概是空闲机器的10倍左右。

    1.2 id比较

    繁忙机器的空闲cpu为42.7,空闲机器的空闲cpu为96.8。

    1.3 wa比较

    可以看到繁忙机器的等待时间是33.1,空闲机器的等待时间是1.3,一般来说等待时间小于5是比较正常的,这里达到33了,需要进一步查找原因。借助于iostat命令进行分析。

    2. iostat命令

    如果提示没有该命令,可以使用yum进行安装。

    yum install sysstat

    2.1 基本用法

    相对繁忙的机器上直接执行命令iostat:

    1. # iostat
    2. Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 20220702日 _x86_64_ (4 CPU)
    3. avg-cpu: %user %nice %system %iowait %steal %idle
    4. 0.83 0.00 0.49 12.36 0.00 86.32
    5. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    6. sdd 1.11 0.01 18.49 16313 41157384
    7. sdc 51.03 352.28 1533.06 783968117 3411747088

    相对空闲的机器上执行iostat:

    1. # iostat
    2. Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master) 20220702日 _x86_64_ (4 CPU)
    3. avg-cpu: %user %nice %system %iowait %steal %idle
    4. 1.50 0.00 1.00 1.35 0.00 96.15
    5. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    6. sda 13.18 0.53 55.28 2149925 224482936
    7. dm-0 13.24 0.41 56.61 1647420 229878556

    从tps来看,51的tps明显高于13,从kB_read/s(每秒从设备读取的数据量)对比就更明显了,kB_wrtn/s(每秒向设备写入的数据量)也是区分明显。

    2.2 持续查看

    1. # iostat -d -k 2
    2. Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 CPU)
    3. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    4. sdd 1.11 0.01 18.51 16313 41210464
    5. sdc 51.08 353.59 1533.74 787167641 3414475360
    6. sda 0.36 6.49 12.75 14457942 28377408
    7. sdb 0.04 0.10 2.11 220961 4704120
    8. dm-0 0.25 0.76 4.28 1683335 9530436
    9. dm-1 0.00 0.00 0.00 2072 0
    10. dm-2 0.12 5.73 8.46 12755772 18831532

    -k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。

     2.3 扩展参数

    1. # iostat -d -x -k 1 3
    2. Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 CPU)
    3. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    4. sdd 0.00 0.83 0.00 1.11 0.01 18.52 33.28 0.04 31.91 10.02 31.92 6.54 0.73
    5. sdc 0.00 10.05 10.31 40.78 354.05 1533.96 73.91 0.52 10.20 21.38 7.38 6.57 33.59
    6. sda 0.00 0.01 0.09 0.27 6.49 12.75 105.70 0.01 23.80 2.65 30.72 3.39 0.12

     相关参数说明如下:

    rrqm/s:每秒进行 merge 的读操作数目
    wrqm/s:每秒进行 merge 的写操作数目
    r/s: 每秒完成的读 I/O 设备次数,即 delta(rio)/s 。
    w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s 。
    rKB/s:每秒读K字节数
    wKB/s:每秒写K字节数
    avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区),即elta(rsect+wsect)/delta(rio+wio)。
    avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
    await:平均每次设备I/O操作的等待时间 (毫秒),即 delta(ruse+wuse)/delta(rio+wio)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
    svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
    %util:代表磁盘繁忙程度。100% 表示磁盘繁忙, 0%表示磁盘空闲。
    

    繁忙机器的性能参数:

    1. # iostat -d -x -k 1 3
    2. Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 CPU)
    3. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    4. sdd 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
    5. sdc 0.00 6.00 90.00 100.00 2992.00 5612.00 90.57 10.55 54.09 26.28 79.12 5.25 99.80
    6. sda 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

    空闲机器的性能参数:

    1. # iostat -d -x -k 1 3
    2. Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master) 2022年07月02日 _x86_64_ (4 CPU)
    3. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    4. sda 0.00 0.00 0.00 18.00 0.00 52.00 5.78 0.08 4.33 0.00 4.33 4.33 7.80
    5. dm-0 0.00 0.00 0.00 18.00 0.00 52.00 5.78 0.08 4.33 0.00 4.33 4.33 7.80
    6. dm-1 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
    7. dm-2 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

    主要可以从avgqu-sz(10.55比0.08)、await(54.09比4.33)和%util(99.8比7.8)的对比中,可以看到性能对比参数。

  • 相关阅读:
    达梦:开启sql日志记录
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    A - Turn the Rectangles
    2021年09月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
    js两个常用的函数以及两种方式
    P2404 自然数的拆分问题
    今天突然下雨
    零基础转行,入职军工类测试方向,月薪10K | 既然选择了,就要全力以赴
    vue3带来的新特性及亮点
    【MQTT】基于阿里云物联网平台实现两设备间相互订阅及发布消息
  • 原文地址:https://blog.csdn.net/liaomingwu/article/details/125569625