有时我们希望程序最大程度地提高性能,比如在进行性能测试,或者需要大量数据需要处理的时候,可是程序性能到一定程度以后,就无法提升了,这时我们想知道主要是什么瓶颈造成了性能提升的限制。
1. top命令
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等待磁盘写入完成时间
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:
# 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(每秒向设备写入的数据量)也是区分明显。
2.2 持续查看
# 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秒刷新一次。
2.3 扩展参数
# 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)的对比中,可以看到性能对比参数。