在软件系统运行过程中,性能短板是影响用户体验和系统稳定性的原因。定位性能短板一般需要从 CPU、内存、磁盘 I/O、网络四个方面入手。
一、性能分析思路
定位性能短板一般按照 监控 → 分析 → 定位 → 优化 的循环:
全局监控:先查看系统整体资源使用情况,判断哪类资源(CPU/内存/I/O/网络)出现异常。
定向分析:针对异常资源,使用更精细的工具定位到具体进程、线程甚至代码行。
根因定位:结合应用日志、代码思路、系统配置等,确定短板产生的原因。
优化:实施优化后,再次监控确定短板是不是解除。
常用工具包括:top、vmstat、iostat、netstat、pidstat、perf、tcpdump 等,以及一些性能监控平台(如 Prometheus + Grafana)。
二、CPU 短板分析
1. 标准
CPU 使用率:用户态(us)、系统态(sy)、空闲(id)、等待 I/O(wa)、硬中断(hi)、软中断(si)。
平均负载(Load Average):单位时间内可运行进程的平均数,超过 CPU 重要数一般表示存在竞争。
上下文切换(cs):每秒上下文切换次数,过高会导致性能下降。
运行队列(r):等待 CPU 的进程数,如果不断大于 CPU 重要数 * 2,表示 CPU 饱和。
2. 常用命令
bash
# 实时查看 CPU 使用率及负载
top -c
# 查看 CPU 统计信息(每 1 秒刷新)
vmstat 1
# 查看每个 CPU 重要的使用情况
mpstat -P ALL 1
# 查看每个进程的 CPU 使用率
pidstat -u 1
# 分析 CPU 热点函数(需要 debug 符号)
perf top
perf record -ag -- sleep 10 && perf report
3. 分析方法
如果 us 过高:说明应用本身消耗大量 CPU,需找到对应进程,进一步用 perf 分析热点函数,可能是算法效率低、死循环或频繁的垃圾回收。
如果 sy 过高:说明内核态消耗 CPU,常见于系统调用频繁(如大量网络 I/O、文件读写)、锁竞争。
如果 wa 过高:说明 CPU 在等待 I/O 完成,此时应转向磁盘 I/O 分析。
如果 hi/si 过高:说明硬件/软件中断频繁,可能是网络驱动或网卡处理能力不足。
三、内存短板分析
1. 标准
物理内存使用量:total, used, free, buffers/cache。
Swap 使用量:si(每秒从磁盘交换到内存的数据量)、so(每秒从内存交换到磁盘的数据量)。如果 si/so 不断不为 0,说明物理内存不足。
可用内存:真正可用的内存 = free + buffers/cache。
缺页异常:major fault(需要磁盘 I/O 的缺页)、minor fault。
2. 常用命令
bash
# 查看内存总体使用
free -h
# 动态查看内存变化(每 1 秒)
vmstat 1
# 查看每个进程的内存占用
top -c(按 RES 或 VIRT 排序)
# 显示内存详细统计
cat /proc/meminfo
# 分析内存泄漏(需要工具如 valgrind)
valgrind --leak-check=full ./your_program
3. 分析方法
如果 free 很少但 buff/cache 很大,说明内存被缓存占用,一般不是问题,可通过 echo 3 > /proc/sys/vm/drop_caches 手动释放缓存测试。
如果 si/so 非零,说明物理内存不足,频繁使用 Swap,导致性能急剧下降。此时需检查内存占用高的进程,优化内存使用或增加物理内存。
如果单个进程占用内存不断增长(RES),可能内存泄漏。可使用 valgrind 或 gperftools 分析堆内存分配。
major fault过高,说明频繁访问磁盘上的内存映射文件,可能内存不足或文件访问方式不佳。
四、磁盘 I/O 短板分析
1. 标准
磁盘利用率(%util):磁盘忙于处理 I/O 请求的时间比例。接近 100% 说明磁盘饱和。
I/O 等待时间(await):I/O 请求的平均等待时间(包括队列和实际服务时间)。
IOPS:每秒读写次数。
吞吐量(rMB/s, wMB/s):每秒读写数据量。
队列长度(avgqu-sz):平均等待处理的 I/O 请求数。
2. 常用命令
bash
# 查看磁盘 I/O 统计(每 1 秒)
iostat -x 1
# 查看每个进程的 I/O 情况(需要 root)
iotop
# 结合 vmstat 查看 wa 和 bi/bo
vmstat 1
# 查看文件系统使用情况
df -h
3. 分析方法
%util 高但 r/s/w/s 不大:可能存在磁盘性能短板,或单个大 I/O 请求阻塞。
await 远大于 svctm(平均服务时间),说明队列等待时间长,磁盘负载高。
如果 r/s 或 w/s 接近磁盘规格极限,说明 I/O 压力过大,需考虑优化读写思路、增加缓存、升级 SSD 或分布式存储。
通过 iotop 找到产生大量 I/O 的进程,检查其读写文件是不是合理,是不是有不必要的日志写入。
五、网络短板分析
1. 标准
带宽使用率:网卡吞吐量是不是接近上限。
TCP 连接状态:ESTABLISHED、TIME_WAIT、CLOSE_WAIT 等数量。
丢包率:网卡或协议栈丢包统计。
TCP 重传率:重传段占总发送段的比例,过高表示网络不稳定或拥塞。
连接队列:ListenOverflows 表示半连接队列溢出,ListenDrops 表示全连接队列溢出。
2. 常用命令
bash
# 查看网络接口统计
ip -s link
# 实时查看带宽使用(iftop / nload)
iftop -i eth0
nload eth0
# 查看网络连接状态
netstat -s
ss -s
# 抓包分析
tcpdump -i eth0 -w capture.pcap
# 使用 wireshark 分析抓包文件
3. 分析方法
如果带宽接近上限,需检查是正常业务流量还是异常(如 DDoS、爬虫)。可通过 tcpdump 抓包分析源 IP、端口、协议。
TCP 重传率 高,可能因网络链路质量差、带宽不足、或接收端处理慢。检查 ss -ti 查看重传计数。
TIME_WAIT 过多,一般不影响功能但消耗内存,可通过调整内核参数(net.ipv4.tcp_tw_reuse)优化,但需谨慎。
如果ListenDrops 增加,说明应用程序处理新连接速度跟不上,导致连接队列满。需优化应用并发处理能力或增加进程/线程。
丢包 可通过 ethtool -S eth0 查看网卡驱动级丢包,或通过 netstat -i 查看 RX-DRP。
六、分析思路
实际短板往往是多个资源交织影响的,如:
高 CPU wa 一般指向磁盘 I/O 短板。
内存不足导致频繁 Swap,进而引发磁盘 I/O 升高,同时 CPU 处理内核交换任务也升高。
网络延迟高可能引起应用线程阻塞,导致 CPU 等待或上下文切换增加。
推荐分析流程:
用 top 查看整体负载,识别异常资源(CPU idle 低 / iowait 高 / 内存 free 极少)。
用 vmstat 1 观察进程队列(r)、上下文切换(cs)、中断(in)、交换(si/so)等,初步判断短板类型。
针对性地使用 iostat、pidstat、perf、tcpdump 等工具深入定位。
结合应用日志,确定是不是因业务思路(如慢查询、大文件传输)导致。
优化后再次监控,证实效果。