【转载】Linux 性能排查实战:CPU、内存、IO 问题定位方法

2026-06-18   Linux运维转载
📋 转载说明:本文转载自知乎专栏,作者:运维老司机, 原文已注明 CC BY-SA 4.0 协议。 原文链接:知乎专栏
Linux 性能排查工具全景图(来自 Brendan Gregg)

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 那行最重要的三个指标:

htop 界面:CPU、内存、进程状态一览

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 的区别

内存使用分解: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(错误)。

  1. 先 uptime 看负载均值,判断问题是持续的还是突发的
  2. dmesg -T | tail -20 有没有内核级错误
  3. top/htop 看哪类 CPU 使用高(us/sy/wa)
  4. free -h + vmstat 看内存和 swap
  5. iostat -xz 1 看磁盘 IO
  6. ss -s + sar -n DEV 1 看网络
  7. 根据 3-6 步的结果,定向深挖

原文作者:运维老司机 · 发布于知乎专栏 · 转载已获授权(CC BY-SA 4.0)· 本站排版有调整