性能分析的目的是为了找出系统瓶颈和优化方案,以提高系统的运行效率和性能。
性能分析包括了系统监测、性能测试、性能诊断、优化和评估等环节,需要使用一系列工具和技术来实现,如采样分析、跟踪分析、统计分析、模拟分析等。性能分析在计算机系统的开发、测试和维护过程中起着重要作用。
性能分析的基本原理
性能分为硬件性能和软件性能。
- 首先从
系统级
查看资源的使用情况,如vmstat
,找到资源瓶颈; - 如果软件无异常,但硬件达到瓶颈则需要更换更高级的硬件;
- 如果软件异常,则需要进行
进程级
定位,首先使用top
定位到所有进程中最耗资源的进程; - 然后使用
psstat
,perf
,strace
,time
等工具查看进程的瓶颈; - 优化性能瓶颈,注意,性能瓶颈有时会有很多个,不止是一个。
进程级的分析指标就是延时
,看哪个过程消耗的时间多,这部分主要靠perf
来定位。
性能指标
内存不足
- free memory急剧减少,回收buffer和cacher也无济于事;
- 大量使用交换分区(swpd)
- 页面交换(swap)频繁
- 读写磁盘数量(io)增多
- 缺页中断(in)增多
- 上下文切换(cs)次数增多
- 等待IO的进程数(b)增多
- 大量CPU时间用于等待IO(wa)
当系统内存不足时,性能指标可能表现为以下几种情况:
页面交换率(Swap Rate):表示在一段时间内系统进行页面交换的次数。页面交换是指将数据从内存移到磁盘,以释放内存空间。如果页面交换率过高,就意味着系统正在频繁地进行内存和磁盘之间的数据传输,这会极大地降低系统的性能。
页面缺失率(Page Fault Rate):表示在一段时间内发生了多少次页面缺失。页面缺失是指在访问虚拟内存时发现需要的页面不在内存中,从而触发操作系统将页面从磁盘加载到内存中的过程。页面缺失率越高,就意味着系统需要频繁地进行磁盘读写操作,这会影响系统的性能。
内存使用率(Memory Utilization):表示当前内存使用量占总内存的比例。当内存使用率接近或达到 100% 时,系统会变得缓慢并容易出现问题。
内存泄漏(Memory Leak):表示应用程序在使用内存时出现的问题,导致系统中的内存不断增加,直到系统崩溃或应用程序崩溃。内存泄漏是一种常见的性能问题,通常需要通过分析应用程序代码来解决。
IO瓶颈
- 读写IO,bi bo增多超过2000
- cpu等待时间用于 IO等待,wa增加 超过20
- sy 系统调用时间长,IO操作频繁会导致增加 >30%
- wa io等待时间长
- iowait% <20% 良好
- iowait% <35% 一般
- iowait% >50%
- 进一步使用iostat观察
IO瓶颈通常表现为系统中的磁盘IO操作变慢或被卡住,因此对应的应用程序也会变得响应迟缓,甚至出现卡死的情况。具体表现包括:
IO等待时间增加:在使用工具进行性能分析时,可以观察到磁盘IO等待时间增加,例如iostat命令中的await、svctm指标。
磁盘IO使用率高:如果磁盘IO使用率接近100%,则表示系统磁盘IO操作饱和,可能会影响系统的响应时间。
系统负载高:IO操作的等待会导致系统的负载变高,如果磁盘IO操作一直处于高负载状态,说明系统存在IO瓶颈。
应用程序响应迟缓:由于磁盘IO操作变慢,对应的应用程序也会变得响应迟缓,可能会导致程序运行时间过长,用户体验变差,甚至无法响应。
CPU瓶颈
- 反应为CPU队列长度
- 一段时间内,CPU正在处理和等待CPU处理的进程数之和,直接反应了CPU的使用和申请情况。
- 理想的load average:$(nproc)*0.7
- 超过这个值就说明已经是CPU瓶颈了
CPU瓶颈的表现通常是:
系统负载高:CPU负载高,导致系统的平均负载高,应用响应时间变慢。
进程的CPU使用率高:一个或多个进程的CPU使用率高,而其他进程的CPU使用率较低。
上下文切换率高:由于进程数量过多,操作系统需要频繁地进行上下文切换,导致CPU资源浪费。
等待CPU时间长:进程需要等待CPU的时间长,可能导致进程响应时间变慢,甚至出现卡死的情况。
CPU饱和:CPU资源被占满,无法满足更多的处理需求。
系统级分析
# 查看进程的CPU消耗排序
top
vmstat 1 -Sm
# 查看内存消耗排序
top
按 m
# 查看每个核的状态
mpstat -P ALL 1
进程级分析
单进程状态查看
# 查看进程的启动命令
ps aux | grep <pid>
# 查看进程的系统调用
strace <x.exe>
# 查看进程的CPU使用率变化
pidstat 1 -p <pid>
# 查看进程的磁盘IO变化
pidstat 1 -d -p <pid>
# 查看进程的网络IO变化
pidstat 1 -w -p <pid>
# 查看进程打开的文件
lsof -p <pid>
# 查看进程消耗的时间
time <a.out>
火焰图
一、查看perf报告:
- 下载FlameGraph:
git clone https://github.com/brendangregg/FlameGraph.git
- 收集系统/进程报告:
# 收集所有进程报告,一秒99次,收集60秒
perf record -F 99 -a -g -- sleep 60
# 收集指定pid的报告,一秒99次,收集60秒
sudo perf record -F 99 -p <pid> -g -- sleep 60
- 以火焰图形式查看
sudo perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > output.svg
<browser> output.svg
使用浏览器打开svg火焰图,还可以进行交互。
二、查看dtrace报告:
todo.
查看网络信息
todo.
调优
CPU平均负载高
当CPU的平均负载高时,可能会出现系统响应变慢、应用程序响应时间延长等情况,需要进行调优。
分析负载高的原因:
使用系统工具(如top
、htop
、dstat
、sar
等)分析哪些进程占用了CPU时间、内存、磁盘等资源,并查看系统日志以了解系统的状态。
调优方法:
调整进程优先级:可以使用nice命令或renice命令调整进程优先级,减少CPU资源占用。同时,可以考虑使用CPU限制工具(如cgroups)限制进程占用的CPU资源。
使用多核CPU:如果系统CPU资源充足,可以考虑使用多核CPU,将负载分散到多个CPU上。
优化应用程序:对于占用大量CPU资源的应用程序,可以通过代码优化、算法优化等方式减少其CPU资源占用。
增加硬件资源:如果CPU资源仍然不足,可以考虑增加硬件资源(如更多的CPU、更大的内存、更快的磁盘等)来满足系统的需求。
调整系统参数:可以调整系统内核参数(如文件句柄数、最大进程数等)以提高系统性能。
内存消耗大
使用top
,free -g
等命令查看剩余内存和页交换情况;
当剩余内存不足或页频繁交换时,可以尝试以下几个方面进行调优:
增加物理内存:如果物理内存不足,可以考虑增加物理内存,这是最有效的方式。
减少内存消耗:可以通过优化程序代码、关闭不必要的服务、减少运行进程等方式来减少内存消耗。
调整内存分配策略:可以通过调整内存分配策略来优化内存使用效率,比如减小每个进程的内存使用限制,减少内存碎片等。
使用交换空间:当物理内存不足时,可以使用交换空间来扩展内存空间。不过,由于交换空间的性能较差,因此不建议长期使用。
使用内存压缩技术:一些现代操作系统支持内存压缩技术,可以将不常用的内存页进行压缩,以释放更多的内存空间。
使用更高效的算法和数据结构:在程序开发过程中,可以尽量使用更高效的算法和数据结构来减少内存占用,提高程序性能。
使用SSD提高交换速度。
工具详解
htop
sudo apt install htop
htop
vmstat
每秒输出一次结果,其中,-Sm代表以M为单位显示。
vmstat 1 -Sm
:::tip{title=“选项说明”}
r
表示运行队列中的进程数量,运行队列是指在队列中,但还没有获得CPU资源;
b
表示不可中断睡眠状态的进程数量,如等待磁盘IO或网络IO,这种状态下,磁盘不会响应任何中断信号;
swapd
已使用的交换空间大小;
free
空闲内存大小;
buff
IO缓冲区所使用的大小;
cache
CPU缓冲区所使用的的大小;
si
每秒从磁盘交换到内存的数据大小;
so
每秒从内存交换到磁盘的数据大小;
bi
每秒从磁盘读取的数据数量;
bo
每秒向磁盘写入的数据大小;
in
每秒中断次数;
cs
每秒系统调用次数;
us
用户空间的CPU使用率百分比;
sy
系统空间的CPU使用率百分比;
id
空闲的CPU百分比;
wa
等待输入输出的CPU时间百分比;
st
虚拟机上的CPU时间百分比。
:::
top
top相当于任务管理器或资源管理器,默认情况下,top显示的是CPU占用最高的进程的列表。
top
:::tip{title=“参数说明”}
top - 17:17:23 up 3:30, 1 user, load average: 0.39, 0.58, 0.46
第1行主要关注平均负载,三个数值分别代表过去1分钟,5分钟和15分钟的平均任务数;
当任务数大于CPU的核数,就会出现等待状态;
通常认为,平均负载小于CPU核数的1-2倍比较正常,超过这个范围可能导致系统响应变慢。
Tasks: 364 total, 2 running, 350 sleeping, 0 stopped, 12 zombie
第2行代表任务总数统计。
%Cpu(s): 0.4 us, 1.1 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
第3行代表CPU状态,在top状态下,按1会显示所有CPU信息。
各参数含义见 vmstat 章节。
MiB Mem : 15652.5 total, 6941.4 free, 2870.7 used, 5840.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 12049.0 avail Mem
第4行和第5行代表内存信息。
:::
perf
todo.
dtrace
todo.
netstat
netstat是一个用于查看网络连接状态的命令行工具。它可以列出网络连接、路由表、网络接口等信息。通过netstat,用户可以监控网络连接情况,识别网络问题,其常用选项如下:
:::tip{title=“选项”}
-a:显示所有的TCP和UDP连接
-t:仅显示TCP连接
-u:仅显示UDP连接
-n:以数字形式显示IP地址和端口号
-p:显示建立连接的程序名或进程ID
-l:仅显示监听状态的连接
-r:显示路由表信息
-s:显示网络统计数据,如TCP、UDP等的统计信息
-c:持续输出,直到按下Ctrl+C结束
:::
ip
ip 命令是一个 Linux 系统下用于管理网络接口的命令行工具,提供了一些常见的网络管理功能。它的功能比 ifconfig 更强大,取代了 ifconfig 命令的一些部分功能。
:::tip{title=“选项”}
ip addr:显示网络接口的 IP 地址、MAC 地址和状态等信息
ip link:显示网络接口的状态、设备类型等信息
ip route:显示路由表信息
ip -s link:显示网络接口的统计信息
:::
tcpdump
todo.
wireshark
todo.
sar
todo.
基准测试
todo.
btop
全盘性能监控。
术语
内存相关术语
VIRT,进程的虚拟内存,包括已映射的和未映射的内存等
RES,进程映射到物理内存的部分
SHR ,进程使用的共享库大小
内存硬件 ,主存,总线,CPU缓存和MMU(内存管理单元)
OOM ,内存耗尽
主存 , 物理内存
虚拟内存 , 用页表维护的映射项之一
页表 , 是虚拟内存和物理内存的映射表
页 , 是内存交换的基本单元,一般是4k