性能优化
性能优化一项最重要的步骤就是寻找到系统的瓶颈
粗略分析
系统响应慢,一般的瓶颈在IO、CPU、内存还有应用。
使用top查看
[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
- 输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题
- 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源
- 100.0 id 空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈
- 0.0 wa 等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈
内存瓶颈
一般使用free工具
[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是指按照这个时间间隔统计的次数。
[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的信息
[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,注意数据仅在相同软件相同版本有比较价值
性能测试工具
抄袭来自:
https://www.longtao.fun/metaverse/linuxperformanceanalysis/