Linux 系统性能排查:从 CPU 到磁盘的完整方法论

生产环境突然变慢,你会从哪里入手?本文整理了一套可复用的排查方法论。

第一步:快速定位瓶颈

先用 tophtop 看整体负载,重点关注三个指标:

  • 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 队列、连接数、丢包率

性能排查没有银弹,关键是建立系统化的思维框架,从宏观到微观逐步缩小范围。

← 返回文章列表