linux性能瓶颈分析

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

Posted by tkpang on July 11, 2023

性能优化

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

粗略分析

系统响应慢,一般的瓶颈在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
  1. 输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题
  2. 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源
  3. 100.0 id 空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈
  4. 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,注意数据仅在相同软件相同版本有比较价值

性能测试工具

See the source image

抄袭来自:

https://www.longtao.fun/metaverse/linuxperformanceanalysis/