• 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)的对比中,可以看到性能对比参数。

  • 相关阅读:
    docker的平替--podman
    【数据库09】数据库系统体系结构
    iOS 17.0 YYText 崩溃处理
    什么是RPA?
    glibc: 这个函数是平台定制__syscall_sigreturn;如x86可能就返回 errno=ENOSYS
    什么是Linux的Overcommit和OOM
    flock命令学习
    xcode中使用printf与snprintf格式化输出
    eBay跨境电商好做吗?为什么要选择eBay平台?
    picoctf_2018_got_shell
  • 原文地址:https://blog.csdn.net/liaomingwu/article/details/125569625