有时我们希望程序最大程度地提高性能,比如在进行性能测试,或者需要大量数据需要处理的时候,可是程序性能到一定程度以后,就无法提升了,这时我们想知道主要是什么瓶颈造成了性能提升的限制。
top命令可以从整体上了解性能情况。以下是一台繁忙的机器的top部分输出信息:
- # top
-
- top - 10:12:51 up 25 days, 17:54, 1 user, load average: 3.18, 3.27, 3.44
- Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
- %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
- KiB Mem : 16213768 total, 91924 free, 7002264 used, 9119580 buff/cache
- KiB Swap: 0 total, 0 free, 0 used. 8360968 avail Mem
以下是一台空闲的机器的top部分输出信息:
- # top
-
- top - 10:14:26 up 46 days, 23:43, 3 users, load average: 0.33, 0.24, 0.19
- Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie
- %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
- KiB Mem : 16181972 total, 223576 free, 4941164 used, 11017232 buff/cache
- KiB Swap: 0 total, 0 free, 0 used. 10424216 avail Mem
us:用户态使用的cpu时间比
sy:系统态使用的cpu时间比
id:空闲的cpu时间比
wa:cpu等待磁盘写入完成时间
从load值来看,繁忙机器的数值大概是空闲机器的10倍左右。
繁忙机器的空闲cpu为42.7,空闲机器的空闲cpu为96.8。
可以看到繁忙机器的等待时间是33.1,空闲机器的等待时间是1.3,一般来说等待时间小于5是比较正常的,这里达到33了,需要进一步查找原因。借助于iostat命令进行分析。
如果提示没有该命令,可以使用yum进行安装。
yum install sysstat
相对繁忙的机器上直接执行命令iostat:
- # iostat
- Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 CPU)
-
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.83 0.00 0.49 12.36 0.00 86.32
-
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sdd 1.11 0.01 18.49 16313 41157384
- sdc 51.03 352.28 1533.06 783968117 3411747088
相对空闲的机器上执行iostat:
- # iostat
- Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master) 2022年07月02日 _x86_64_ (4 CPU)
-
- avg-cpu: %user %nice %system %iowait %steal %idle
- 1.50 0.00 1.00 1.35 0.00 96.15
-
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sda 13.18 0.53 55.28 2149925 224482936
- dm-0 13.24 0.41 56.61 1647420 229878556
从tps来看,51的tps明显高于13,从kB_read/s(每秒从设备读取的数据量)对比就更明显了,kB_wrtn/s(每秒向设备写入的数据量)也是区分明显。
- # iostat -d -k 2
- Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 CPU)
-
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sdd 1.11 0.01 18.51 16313 41210464
- sdc 51.08 353.59 1533.74 787167641 3414475360
- sda 0.36 6.49 12.75 14457942 28377408
- sdb 0.04 0.10 2.11 220961 4704120
- dm-0 0.25 0.76 4.28 1683335 9530436
- dm-1 0.00 0.00 0.00 2072 0
- dm-2 0.12 5.73 8.46 12755772 18831532
-
-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。
- # iostat -d -x -k 1 3
- Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 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
- 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
- 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
- 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%表示磁盘空闲。
繁忙机器的性能参数:
- # iostat -d -x -k 1 3
- Linux 3.10.0-1160.62.1.el7.x86_64 (node-1) 2022年07月02日 _x86_64_ (4 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
- 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
- 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
- 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
空闲机器的性能参数:
- # iostat -d -x -k 1 3
- Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master) 2022年07月02日 _x86_64_ (4 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 0.00 0.00 18.00 0.00 52.00 5.78 0.08 4.33 0.00 4.33 4.33 7.80
- 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
- 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
- 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)的对比中,可以看到性能对比参数。