【转载】Linux 性能排查实战:CPU、内存、IO 问题定位方法
📋 转载说明:本文转载自知乎专栏,作者:运维老司机,
原文已注明 CC BY-SA 4.0 协议。
原文链接:知乎专栏

Linux 性能排查工具全景图(来自 Brendan Gregg)
性能问题的排查有一个反直觉的地方:越紧张越容易乱,越乱越没方向。这篇文章整理了一套方法论,帮助你在系统变慢时有条理地定位问题,而不是凭感觉猜。
一、CPU 问题排查
1.1 快速定位
# 查看整体 CPU 使用
top -bn1 | head -20
# 或者更直观的
htop
# 查看每个核的使用率
mpstat -P ALL 1 3
# 找 CPU 占用最高的进程
ps aux --sort=-%cpu | head -10
1.2 区分 us、sy、wa
top 里 CPU 那行最重要的三个指标:
- us(user):用户态 CPU,应用程序在跑。高 us 说明业务代码本身有性能问题,去 profiling 应用。
- sy(system):内核态 CPU。高 sy 通常是系统调用频繁(大量小文件读写、socket 操作)或内核 bug。
- wa(iowait):等待 IO 的时间。高 wa 说明磁盘/网络 IO 是瓶颈,CPU 在干等。
- hi/si:硬中断/软中断,通常和网卡有关,高流量服务器需要关注。

htop 界面:CPU、内存、进程状态一览
1.3 定位具体函数
# perf 采样,找热点函数(需要 linux-perf 包)
perf top -g -p <pid>
# 生成火焰图(需要 brendangregg/FlameGraph)
perf record -F 99 -p <pid> -g -- sleep 30
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flame.svg
火焰图是性能排查的神器:横轴是函数占用 CPU 时间的比例,纵轴是调用栈,宽的"平台"就是热点。
二、内存问题排查
2.1 内存泄漏的信号
# 查看内存使用
free -h
cat /proc/meminfo | grep -E "MemTotal|MemFree|Cached|Buffers|Swap"
# 观察内存随时间的变化(每秒采样)
vmstat 1 | awk '{print strftime("%H:%M:%S"), $0}'
内存泄漏的特征:进程的 RSS 随时间单调增长,即使负载不变。用 ps aux 每隔几分钟看一次目标进程的 RSS,如果持续增长就基本可以确定。
2.2 OOM 排查
# 查看 OOM killer 日志
dmesg | grep -i "out of memory"
dmesg | grep -i "oom_kill"
# 查看各进程的 OOM score
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
comm=$(cat /proc/$pid/comm 2>/dev/null)
score=$(cat /proc/$pid/oom_score 2>/dev/null)
echo "$score $pid $comm"
done | sort -rn | head -20

内存使用分解:RSS、PSS、VSZ 的区别
三、磁盘 IO 问题排查
# 实时查看磁盘 IO(最直观)
iostat -xz 1
# 关键指标:
# %util: 磁盘利用率,接近 100% 说明已饱和
# await: IO 平均等待时间(ms),正常 SSD < 1ms,HDD < 10ms
# r/s w/s: 每秒读写次数(IOPS)
# rkB/s wkB/s: 每秒读写吞吐量
找出哪个进程在大量写
# iotop 实时显示每个进程的 IO 速率
iotop -o -d 2
# 或者用 pidstat
pidstat -d 1
文件级别的 IO
# 用 inotifywait 看哪些文件被频繁访问
inotifywait -m -r --format '%w%f %e' /var/log/ 2>/dev/null | head -50
# 用 opensnoop(bpftrace)看进程打开了哪些文件
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s
", comm, str(args->filename)); }'
四、网络问题排查
# 连接状态统计
ss -s
ss -tnp | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看重传率(TCP 重传多说明网络质量差)
netstat -s | grep -i retransmit
# 实时流量监控
iftop -n -P # 或者
nethogs # 按进程显示流量
Linux 系统性能排查完整实战演示(B站)
五、综合排查流程
推荐的顺序(Brendan Gregg 的 USE 方法论):对每个资源检查 Utilization(使用率)、Saturation(饱和度)、Errors(错误)。
- 先
uptime看负载均值,判断问题是持续的还是突发的 dmesg -T | tail -20有没有内核级错误top/htop看哪类 CPU 使用高(us/sy/wa)free -h+vmstat看内存和 swapiostat -xz 1看磁盘 IOss -s+sar -n DEV 1看网络- 根据 3-6 步的结果,定向深挖
原文作者:运维老司机 · 发布于知乎专栏 · 转载已获授权(CC BY-SA 4.0)· 本站排版有调整