Linux 系统性能排查:从 CPU 到磁盘的完整方法论
生产环境突然变慢,你会从哪里入手?本文整理了一套可复用的排查方法论。
第一步:快速定位瓶颈
先用 top 或 htop 看整体负载,重点关注三个指标:
- Load Average:1/5/15 分钟平均负载,超过 CPU 核数说明有排队
- %wa:I/O 等待,超过 20% 需要重点排查磁盘
- %si/%hi:软中断/硬中断,网络密集型应用常见
# 每秒刷新一次,只看前 20 行
top -b -n 1 | head -20
# 更直观的 CPU 使用分布
mpstat -P ALL 1 3
CPU 排查
找出 CPU 热点进程
# 按 CPU 排序,找 top 5
ps aux --sort=-%cpu | head -6
# 查看进程内哪个线程在消耗 CPU
top -H -p <PID>
# perf 采样,找热点函数
perf top -p <PID>
判断是用户态还是内核态
%us 高 → 应用代码问题,检查业务逻辑、算法复杂度
%sy 高 → 系统调用频繁,检查文件 I/O、网络收发、锁竞争
# 查看系统调用频率
strace -c -p <PID>
内存排查
# 查看内存整体使用
free -h
# 查看各进程内存占用(RSS 是实际物理内存)
ps aux --sort=-%mem | head -10
# 查看内存分配详情
cat /proc/meminfo | grep -E 'MemTotal|MemFree|Buffers|Cached|SwapUsed'
重点关注 Swap 使用量,频繁 swap 会导致严重性能下降。
磁盘 I/O 排查
# 查看磁盘 I/O 实时状态
iostat -x 1 5
# 找出 I/O 最高的进程
iotop -o -d 1
# 查看具体文件的读写
lsof -p <PID> | grep -E 'REG|DIR'
%util 接近 100% 说明磁盘已饱和,await 高说明 I/O 延迟大。
网络排查
# 查看网络连接状态统计
ss -s
# 查看 TIME_WAIT 数量(过多说明短连接频繁)
ss -ant | awk '{print $1}' | sort | uniq -c
# 实时网络流量
sar -n DEV 1 5
排查清单
| 现象 | 优先检查 |
|---|---|
| Load 高但 CPU 不高 | I/O wait,检查磁盘 |
| CPU %sy 高 | 系统调用,用 strace 定位 |
| 内存持续增长 | 内存泄漏,用 valgrind 或 pmap |
| 网络延迟高 | TCP 队列、连接数、丢包率 |
性能排查没有银弹,关键是建立系统化的思维框架,从宏观到微观逐步缩小范围。