性能优化

性能优化一项最重要的步骤就是寻找到系统的瓶颈

粗略分析

系统响应慢,一般的瓶颈在IO、CPU、内存还有应用。

使用top查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

[root@172-20-59-60 apt_ui]# top
top - 15:59:31 up 6 days, 1:10, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 144 total, 1 running, 142 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8009636 total, 5126364 free, 2307032 used, 576240 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5396772 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9307 root 20 0 620968 28320 6064 S 0.0 0.4 3:39.37 python3
861 root 20 0 567404 16752 5992 S 0.0 0.2 0:57.56 tuned
651 root 20 0 21684 1324 988 S 0.0 0.0 0:47.08 irqbalance
662 avahi 20 0 55952 2392 1920 S 0.0 0.0 0:35.02 avahi-daemon
809 root 20 0 113440 12796 308 S 0.0 0.2 0:24.29 dhclient

  1. 输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题
  2. 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源
  3. 100.0 id 空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈
  4. 0.0 wa 等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈
内存瓶颈

一般使用free工具

1
2
3
4
5

[root@172-20-59-60 apt_ui]# free
total used free shared buff/cache available
Mem: 8009636 2306408 5126984 25144 576244 5397396
Swap: 0 0 0

缺省时free的单位为KB

属性 含义
total 总物理内存大小
used 已使用物理内存大小
free 未分配物理内存大小
shared 共享的物理内存大小
buff/cache 为了提高系统的读写速度(包含磁盘块的读写,文件的读写等),操作系统将部分内存作为缓存使用,该数值为缓存占用的物理内存大小
available 可用的物理内存大小
属性 说明
total Swap 分区的总大小
used 已使用的 Swap 分区大小
free 未使用的 Swap 分区大小

根据上表,在不考虑 Swap 分区的情况下,内存计算如下:
总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared = Mem.free + Mem.buff/cache

在考虑 Swap 分区的情况下,内存计算如下:
总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared + Swap.free = Mem.free + Mem.buff/cache + Swap.free

属性 说明
PageCache.size 可以回收的 PageCache 大小,计算公式见上图
SlabCache.size 可以回收的 SlabCache 大小 ,计算公式见上图
WaterMark.low 支持系统使用的最低水位线,计算公式见上图

Mem.available = Mem.free + PageCache.size + SlabCache.size - WaterMark.low

进一步的监视内存使用情况,可使用vmstat工具,可实时动态监视操作系统的内存和虚拟内存的动态变化使用情况

vmstat [delay] [count]

  • delay是两次输出之间的延迟时间;
  • count是指按照这个时间间隔统计的次数。
1
2
3
4
5
6
7

[root@172-20-59-60 apt_ui]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 5126380 2068 574208 0 0 0 22 4 8 0 0 100 0 0
0 0 0 5126488 2068 574208 0 0 0 0 422 53 0 0 100 0 0
0 0 0 5126488 2068 574208 0 0 0 0 392 49 0 0 100 0 0

Procs(进程):

  • r: 运行队列中进程数量
  • b: 等待IO的进程数量

Memory(内存):

  • swpd: 使用虚拟内存大小
  • free: 可用内存大小
  • buff: 用作缓冲的内存大小
  • cache: 用作缓存的内存大小

Swap:

  • si: 每秒从交换区写到内存的大小
  • so: 每秒写入交换区的内存大小

IO:(现在的Linux版本块的大小为1024bytes)

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

system:

  • in: 每秒中断数,包括时钟中断
  • cs: 每秒上下文切换数

CPU(以百分比表示)

  • us: 用户进程执行时间(user time)
  • sy: 系统进程执行时间(system time)
  • id: 空闲时间(包括IO等待时间)
  • wa: 等待IO时间

内存测试工具我们使用Stream,基准测试,注意数据仅在相同软件相同版本有比较价值

IO瓶颈

如果IO存在性能瓶颈,top工具中的%wa会偏高

可使用iostat 进一步分析

iostat [paras] [delay] [count]

  • -c显示CPU使用情况
  • -d 显示磁盘使用情况
  • -k 以 KB 为单位显示
  • -m 以 M 为单位显示
  • -N 显示磁盘阵列(LVM) 信息
  • -p[磁盘] 显示磁盘和分区的情况
  • -t 显示终端和CPU的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@172-20-59-60 apt_ui]# iostat 3 3
Linux 3.10.0-693.el7.x86_64 (172-20-59-60) 12/31/2020 _x86_64_ (8 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.02 0.02 0.00 99.93

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.08 0.59 0.88 308042 462261
vdb 0.52 0.01 176.61 6256 92643328

avg-cpu: %user %nice %system %iowait %steal %idle
0.04 0.00 0.00 0.00 0.00 99.96

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0
vdb 0.00 0.00 0.00 0 0

avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0
vdb 0.00 0.00 0.00 0 0
  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。
  • rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
  • wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
  • r/s: 每秒完成的读 I/O 设备次数。即 rio/s
  • w/s: 每秒完成的写 I/O 设备次数。即 wio/s
  • rsec/s: 每秒读扇区数。即 rsect/s
  • wsec/s: 每秒写扇区数。即 wsect/s
  • rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
  • wkB/s: 每秒写K字节数。是 wsect/s 的一半。
  • avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz: 平均I/O队列长度。
  • await: 平均每次设备I/O操作的等待时间 (毫秒)。
  • svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
  • %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

磁盘测试工具我们一般使用iperf3,注意数据仅在相同软件相同版本有比较价值

性能测试工具

See the source image