5139 字
26 分钟

Linux 性能监控与故障排查完全指南:top/htop/iotop/strace/perf/sar 从入门到实战

服务器突然变慢、CPU 飙高、内存不足、磁盘 IO 瓶颈、网络异常——这些是每个运维者和后端开发者迟早会遇到的问题。Linux 提供了丰富的性能分析工具,但工具太多反而让人无从下手。本文以 USE 方法论 为框架,按 CPU → 内存 → 磁盘 IO → 网络四大维度系统讲解,配合实战案例,帮你建立完整的性能排查能力。

Linux 性能监控与故障排查完全指南

本文内容:

  • USE 方法论:统一的性能分析框架
  • CPU 分析:top / htop / vmstat / mpstat / perf
  • 内存分析:free / vmstat / top / pidstat / smem
  • 磁盘 IO:iostat / iotop / vmstat / dstat
  • 网络分析:ss / netstat / tcpdump / nethogs / iftop
  • 进级工具:strace / lsof / dmesg / journalctl
  • 持续监控:sar / atop / Prometheus
  • 实战案例:4 个典型故障排查全过程
  • 红线指标速查表

一、USE 方法论#

1.1 什么是 USE 方法论#

USE(Utilization / Saturation / Errors)是 Brendan Gregg 提出的性能分析方法论,适用于任何资源:

U - Utilization(利用率) 资源忙碌的时间比例
S - Saturation(饱和度) 资源排队/等待的程度
E - Errors(错误) 资源产生的错误计数
对每种资源检查这三个指标:
资源 Utilization Saturation Errors
────────────────────────────────────────────────────────────────
CPU top %CPU runqueue 长度 thermal throttle
内存 free used% swap 使用 / OOM page faults
磁盘 IO iostat %util iostat await / queue dmesg I/O errors
网络 ifconfig 速率 ss 连接队列溢出 ifconfig drops/errors

1.2 60 秒快速分析清单#

接到告警后,60 秒内执行以下命令获取全景:
uptime # 1. 负载均衡(1/5/15分钟平均负载)
dmesg | tail # 2. 内核日志(OOM/硬件错误/磁盘故障)
vmstat 1 # 3. CPU/内存/IO 总览
mpstat -P ALL 1 # 4. 每 CPU 核心利用率
pidstat 1 # 5. 进程级 CPU/内存
iostat -xz 1 # 6. 磁盘 IO 延迟和利用率
free -m # 7. 内存使用概览
sar -n DEV 1 # 8. 网络吞吐
ss -s # 9. 网络连接数统计
top # 10. 进程总览(按需交互)

二、CPU 分析#

2.1 top — 最常用的实时监控#

Terminal window
# 基础用法
top # 交互式
top -b -n 1 # 非交互式输出 1 次
top -b -n 1 | head -20 # 前 20 行
# 交互快捷键(top 运行时)
P # 按 CPU 占用排序
M # 按内存占用排序
H # 显示线程(而非进程)
1 # 展开各 CPU 核心详情
c # 显示完整命令行
R # 反转排序
k # 杀进程(输入 PID)
q # 退出
top 输出解读:
top - 14:23:01 up 30 days, 3:21, 2 users, load average: 1.52, 1.10, 0.85
↑ 当前时间 ↑ 运行时间 ↑ 用户数 ↑ 1/5/15分钟负载
Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie
↑ 僵尸进程(>0 需排查)
%Cpu(s): 12.5 us, 3.2 sy, 0.0 ni, 83.8 id, 0.5 wa, 0.0 hi, 0.0 si, 0.0 st
↑用户态 ↑内核态 ↑nice ↑空闲 ↑IO等待 ↑硬中断 ↑软中断 ↑窃取
MiB Mem: 7854.0 total, 1024.3 free, 4096.2 used, 2733.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3251.2 avail Mem
关键字段:
us (user) 用户态 CPU — 应用程序计算
sy (system) 内核态 CPU — 系统调用/中断
wa (iowait) IO 等待 — >5% 说明磁盘瓶颈
st (steal) 窃取时间 — >0 说明虚拟化被抢资源(云服务器常见)
id (idle) 空闲 — 越低越忙
负载(load average)含义:
- 值 = CPU 核心数 → 满负荷
- 值 > CPU 核心数 → 有进程在排队
- 看 3 个值的趋势:1min > 5min > 15min = 突发;1min < 5min = 正在恢复

2.2 htop — 更友好的交互式监控#

Terminal window
# 安装
apt install htop # Debian/Ubuntu
yum install htop # CentOS/RHEL
brew install htop # macOS
# 运行
htop
# 交互快捷键
F5 # 树状视图(显示进程父子关系)
F6 # 排序(选择排序字段)
F7 # 降低 nice 值(提高优先级)
F8 # 提高 nice 值(降低优先级)
F9 # 发送信号(kill)
/ # 搜索进程
H # 显示/隐藏线程
. # 只显示活跃进程
htop 相比 top 的优势:
┌────────────────┬──────────────┬──────────────┐
│ 特性 │ top │ htop │
├────────────────┼──────────────┼──────────────┤
│ 界面 │ 文字 │ 彩色条形图 │
│ 鼠标操作 │ ❌ │ ✅ │
│ 树状视图 │ ❌ │ ✅ │
│ 横向滚动 │ ❌ │ ✅ │
│ 自定义列 │ 有限 │ 灵活 │
│ 杀进程 │ 输入 PID │ 选中按 F9 │
│ 推荐 │ 脚本中使用 │ 日常交互使用 │
└────────────────┴──────────────┴──────────────┘

2.3 vmstat — 系统级综合监控#

Terminal window
# 每秒输出 1 次,共 5 次
vmstat 1 5
# 输出解读
procs ─────────memory──────── ────swap──── ───io──── ──system── ──cpu────
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1048576 524288 2799360 0 0 10 20 100 150 12 3 84 1 0
# procs
r # 运行队列长度(>CPU核心数 = CPU 瓶颈)
b # 阻塞在 IO 上的进程数
# memory (KB)
swpd # 已使用 swap(>0 说明内存不足过)
free # 空闲内存
buff # 缓冲区(块设备 IO 缓存)
cache # 页面缓存(文件系统缓存)
# swap (KB/s)
si/so # swap 换入/换出(>0 = 内存不足,性能严重下降)
# io (blocks/s)
bi/bo # 块设备读/写(磁盘 IO 量)
# system
in # 每秒中断数
cs # 每秒上下文切换数(>10万 可能过高)
# cpu (%)
us/sy/id/wa/st # 同 top

2.4 mpstat — 多核 CPU 分析#

Terminal window
# 安装
apt install sysstat
# 所有 CPU 核心每秒采样
mpstat -P ALL 1 5
# 输出
10:00:01 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:00:02 AM all 8.50 0.00 2.30 0.10 0.00 0.20 0.00 0.00 88.90
10:00:02 AM 0 15.20 0.00 3.10 0.00 0.00 0.10 0.00 0.00 81.60
10:00:02 AM 1 2.10 0.00 1.50 0.20 0.00 0.30 0.00 0.00 95.90
# 用途:发现单核打满问题
# 如果 all 显示 50% 但某个核心 100%,说明应用是单线程的

2.5 perf — 内核级性能分析#

Terminal window
# 安装
apt install linux-tools-common linux-tools-$(uname -r)
# 全局 top(类似 top 但按函数聚合)
sudo perf top
# 分析特定进程
sudo perf top -p <PID>
# 采集 10 秒数据后分析
sudo perf record -p <PID> -g -- sleep 10
sudo perf report
# 统计 CPU 周期分布
sudo perf stat -p <PID> sleep 10
# 火焰图(可视化分析)
sudo perf record -F 99 -p <PID> -g -- sleep 30
sudo perf script > out.perf
# 用 FlameGraph 工具生成 SVG
git clone https://github.com/brendangregg/FlameGraph
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > flame.svg

三、内存分析#

3.1 free — 内存概览#

Terminal window
free -h # 人类可读格式
free -m # MB 为单位
free -g # GB 为单位
free -s 1 -c 5 # 每秒刷新,共 5 次
# 输出解读
total used free shared buff/cache available
Mem: 7.7Gi 4.0Gi 1.0Gi 120Mi 2.7Gi 3.2Gi
Swap: 2.0Gi 0B 2.0Gi
# 关键:看 available 而非 free!
# available = 系统实际可用内存(含可回收的 buff/cache)
# free = 完全未使用的内存(Linux 会尽量用 buff/cache 提速,free 偏低是正常的)
#
# 判断标准:
# available > 总内存的 20% → 正常
# available < 总内存的 10% → 需要关注
# available < 总内存的 5% → 紧急,可能触发 OOM

3.2 /proc/meminfo — 详细内存信息#

Terminal window
# 查看关键内存指标
grep -E "MemTotal|MemFree|MemAvailable|Buffers|^Cached|SwapTotal|SwapFree|Slab|SReclaimable" /proc/meminfo
# 输出
MemTotal: 8234296 kB
MemFree: 1048576 kB
MemAvailable: 3318620 kB # ← 最重要的指标
Buffers: 524288 kB
Cached: 2279360 kB # 页面缓存
SwapTotal: 2097152 kB
SwapFree: 2097152 kB
Slab: 312544 kB # 内核 slab 缓存
SReclaimable: 180000 kB # 可回收的 slab

3.3 pidstat — 进程级内存监控#

Terminal window
# 安装(sysstat 包)
apt install sysstat
# 每秒显示各进程内存使用
pidstat -r 1
# 输出
11:00:01 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command
11:00:02 AM 0 1234 0.10 0.00 512000 102400 1.20 nginx
11:00:02 AM 0 5678 10.50 0.00 2048000 512000 6.10 python3
# 关键字段
RSS # 实际使用的物理内存(KB)← 最重要
VSZ # 虚拟内存大小(含映射文件/共享库,偏大正常)
%MEM # 占总内存百分比
minflt/s # 次要页错误(从缓存满足,正常)
majflt/s # 主要页错误(需磁盘 IO,>0 需关注)
# 查看特定进程
pidstat -r -p <PID> 1
# 同时看 CPU + 内存 + IO
pidstat -urd 1

3.4 smem — PSS 内存分析#

Terminal window
# 安装
apt install smem
# 按内存使用排序(PSS 视角更准确)
smem -rs pss | tail -20
# PSS (Proportional Set Size):
# 将共享内存按比例分摊到各进程,比 RSS 更准确
# 适合评估进程"真实"内存占用
# 查看某进程
smem -P nginx
# 生成饼图
smem --pie name -c pss

3.5 OOM Killer 分析#

Terminal window
# 查看 OOM Killer 历史
dmesg | grep -i "out of memory"
dmesg | grep -i "oom-killer"
# 或从系统日志
journalctl -k | grep -i oom
# OOM Killer 触发时日志示例:
# Out of memory: Killed process 5678 (python3) total-vm:2048000kB, anon-rss:512000kB
# 查看 OOM 评分(越高越容易被杀)
cat /proc/<PID>/oom_score
cat /proc/<PID>/oom_score_adj # 可调整 (-1000 到 1000)
# 保护关键进程不被 OOM 杀
echo -1000 > /proc/<PID>/oom_score_adj
# 或在 systemd service 中:
# [Service]
# OOMScoreAdjust=-1000

四、磁盘 IO 分析#

4.1 iostat — 磁盘 IO 统计#

Terminal window
# 安装
apt install sysstat
# 扩展统计,每秒采样
iostat -x 1
# 输出解读
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %util await ...
sda 50.00 20.00 1024.00 512.00 2.00 1.00 85.00 5.20 ...
nvme0n1 100.00 50.00 4096.00 2048.00 5.00 3.00 45.00 1.10 ...
# 关键字段:
%util # 磁盘利用率(>80% 接近饱和,>95% 瓶颈)
await # 平均 IO 延迟 ms(HDD <10ms 正常,SSD <2ms 正常,>20ms 异常)
r/s w/s # 每秒读/写请求数
rkB/s # 每秒读 KB
wkB/s # 每秒写 KB
# 判断:
# %util 高 + await 低 = 吞吐量高但正常
# %util 高 + await 高 = 磁盘瓶颈,需要优化或换 SSD
# %util 低 + await 高 = 可能是存储后端问题(云盘/网络存储)

4.2 iotop — 哪个进程在读写磁盘#

Terminal window
# 安装
apt install iotop
# 只显示有 IO 活动的进程
sudo iotop -oP
# 输出
Total DISK READ: 1024.00 K/s | Total DISK WRITE: 512.00 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1234 be/4 root 512.00 K/s 256.00 K/s 0.00 % 5.20 % mysqld
5678 be/4 www-data 256.00 K/s 0.00 K/s 0.00 % 2.10 % nginx: worker
# 非交互式(脚本中使用)
sudo iotop -b -n 3 -oP | grep -v "Total DISK"

4.3 vmstat — IO 等待快速判断#

Terminal window
vmstat 1
# 关注列:
procs
r b # b = 阻塞在 IO 的进程数(>0 说明 IO 阻塞)
cpu
wa # IO 等待 CPU 占比(>5% 说明 IO 是瓶颈)
# 示例:IO 瓶颈
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 5 0 512000 524288 2799360 0 0 2048 1024 200 300 5 2 80 13 0
IO 量大 13% IO 等待 = 瓶颈

4.4 dstat — 多维度综合监控#

Terminal window
# 安装
apt install dstat
# 同时看 CPU + 磁盘 + 网络
dstat -cdn
# CPU + 内存 + IO + 网络 + 最耗 CPU 进程
dstat -cdnmy --top-cpu --top-mem --top-io
# 输出更直观,适合多维度同时监控

五、网络分析#

5.1 ss — 替代 netstat 的现代工具#

Terminal window
# 连接数统计(快速概览)
ss -s
# 输出
Total: 156
TCP: 45 (estab 12, closed 5, orphaned 0, timewait 3)
# Transport Estab-listen Closed Orphaned Synrecv
TCP 12 8 5 0 0
# 所有 TCP 连接
ss -t -a
# 只看已建立的连接
ss -t state established
# 查看某端口的连接
ss -tnp | grep :80
# 查看监听端口
ss -tlnp
# 统计各状态连接数(排查连接泄漏)
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# 45 ESTAB
# 12 TIME-WAIT
# 8 LISTEN
# 3 CLOSE-WAIT ← 大量 CLOSE-WAIT = 应用没正确关闭连接
# 查看 socket 队列溢出
ss -lnt | grep -E "Recv-Q|Send-Q"
# Recv-Q > 0 = 接收队列积压(处理不过来)
# Send-Q > 0 = 发送队列积压(对端不接收)

5.2 netstat — 经典工具(部分系统仍有)#

Terminal window
# 各状态连接统计
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
# 查看某端口连接数
netstat -an | grep :80 | wc -l
# 查看连接最多的 IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

5.3 nethogs — 按进程查看网络流量#

Terminal window
# 安装
apt install nethogs
# 按进程显示网络流量
sudo nethogs
# 指定网卡
sudo nethogs eth0
# 输出
PID USER PROGRAM DEV SENT RECEIVED
1234 root /usr/bin/curl eth0 1.2 MB/s 0.5 MB/s
5678 www nginx: worker process eth0 512 KB/s 2.1 MB/s

5.4 iftop — 按连接查看流量#

Terminal window
# 安装
apt install iftop
# 指定网卡
sudo iftop -i eth0
# 显示端口
sudo iftop -i eth0 -P
# 交互快捷键
n # 显示/隐藏域名
p # 显示/隐藏端口
t # 切换显示模式

5.5 tcpdump — 抓包分析#

Terminal window
# 抓取 80 端口流量
sudo tcpdump -i eth0 port 80
# 抓取特定 IP 的流量
sudo tcpdump -i eth0 host 192.168.1.100
# 抓取 SYN 包(排查连接异常)
sudo tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'
# 写入文件后续分析
sudo tcpdump -i eth0 -w capture.pcap port 443
# 读取 pcap 文件
tcpdump -r capture.pcap -n
# 组合条件
sudo tcpdump -i eth0 'src 192.168.1.100 and dst port 443' -c 100
# -c 100 只抓 100 个包

六、进阶排查工具#

6.1 strace — 系统调用追踪#

Terminal window
# 追踪进程的系统调用
strace -p <PID>
# 追踪特定进程的启动
strace -f -e trace=network python3 app.py
# 统计系统调用次数和时间
strace -c -p <PID>
# 输出示例
strace: Process 5678 attached
read(3, "HTTP/1.1 200 OK\r\n...", 8192) = 2845
write(1, "Response received\n", 18) = 18
poll([{fd=3, events=POLLIN}], 1, 5000) = 1 ([{fd=3, revents=POLLIN}])
# 常用过滤
strace -e trace=file -p <PID> # 只看文件操作
strace -e trace=network -p <PID> # 只看网络操作
strace -e trace=process -p <PID> # 只看进程操作
strace -T -tt -p <PID> # 显示每个调用的耗时和精确时间
# 用途:
# - 进程卡住不知在等什么 → strace 看阻塞在哪个系统调用
# - 程序启动失败找不到原因 → strace -f -e trace=file 看哪个文件打不开
# - 性能问题 → strace -c 统计哪个系统调用耗时最多

6.2 lsof — 查看打开的文件#

Terminal window
# 查看进程打开的文件
lsof -p <PID>
# 查看哪个进程占用了端口
lsof -i :8080
# 查看哪个进程占用了文件
lsof /var/log/app.log
# 查看所有网络连接
lsof -i
# 查看已删除但仍被占用的文件(磁盘空间不释放)
lsof | grep deleted
# 解决:kill 持有该文件的进程,空间才会释放
# 统计各进程打开的文件描述符数量
lsof -n | awk '{print $2}' | sort | uniq -c | sort -rn | head

6.3 dmesg — 内核日志#

Terminal window
# 查看最近内核日志
dmesg | tail -50
# 持续监控
dmesg -w # 类似 tail -f
# 搜索关键词
dmesg | grep -i error
dmesg | grep -i oom # OOM Killer
dmesg | grep -i i/o error # 磁盘错误
dmesg | grep -i eth # 网卡错误
dmesg | grep -i thermal # 温度过高
# 常见问题:
# [ 123.456789] Out of memory: Killed process 5678 (java) → OOM
# [ 234.567890] EXT4-fs error (device sda1) → 磁盘文件系统错误
# [ 345.678901] link is down → 网线断开
# [ 456.789012] CPU6: Core temperature above threshold → CPU 过热降频

6.4 journalctl — systemd 日志#

Terminal window
# 查看系统日志
journalctl -n 100 # 最近 100 条
journalctl -f # 实时跟踪
journalctl --since "1 hour ago"
# 查看特定服务
journalctl -u nginx
journalctl -u docker --since today
# 按优先级过滤
journalctl -p err # 仅错误及以上
journalctl -p warning
# 查看内核日志(替代 dmesg)
journalctl -k

七、持续监控#

7.1 sar — 历史数据回放#

Terminal window
# 安装并启用
apt install sysstat
# 编辑 /etc/default/sysstat → ENABLED="true"
systemctl enable --now sysstat
# 查看今天的 CPU 历史
sar -u
# 查看指定日期的 CPU
sar -u -f /var/log/sysstat/sa07 # 7号的数据
# 内存历史
sar -r
# 磁盘 IO 历史
sar -d
# 网络历史
sar -n DEV
# 实时采样
sar -u 1 10 # 每秒 1 次共 10 次
# sar 是排查"间歇性变慢"的利器:
# 1. 先用 sar 回放问题时段的数据
# 2. 找到异常的时间点
# 3. 再针对性深入分析

7.2 atop — 带历史记录的全能监控#

Terminal window
# 安装
apt install atop
# 实时监控
atop
# 查看历史快照
atop -r /var/log/atop/atop_20260808
# 交互快捷键(回放时)
t # 前进到下一个快照
T # 后退到上一个快照
b # 跳转到指定时间
1 # 显示每秒数据
# atop 优势:自动记录所有进程的快照
# 事后可以回放某个时间点每个进程的资源使用
# 非常适合"出问题时没在现场"的场景

八、实战案例#

8.1 案例1:CPU 飙到 100%#

Terminal window
# 步骤1:top 找到元凶
top -b -n 1 | head -15
# 发现 PID 5678 (python3) 占用 98% CPU
# 步骤2:查看线程级
top -H -p 5678
# 发现 TID 5679 占用 98%
# 步骤3:查看线程在做什么
# 方法A:strace
strace -p 5679
# 不断调用 read() → 可能在死循环读数据
# 方法B:perf
sudo perf top -p 5678
# 函数 "regex_match" 占 85% → 正则表达式灾难
# 方法C:Python 专用
py-spy top --pid 5678
# 定位到具体代码行:app.py:142 regex.compile()
# 根因:用户输入的超长字符串触发了正则回溯
# 解决:限制输入长度 + 使用非回溯正则

8.2 案例2:内存持续增长(疑似泄漏)#

Terminal window
# 步骤1:确认内存趋势
pidstat -r -p 5678 60 # 每分钟采样
# RSS: 100MB → 150MB → 200MB → 250MB... 持续增长
# 步骤2:检查是否真的泄漏
# 重启进程后 RSS 恢复到 100MB → 确认是泄漏
# 步骤3:定位泄漏点
# 方法A:smaps 查看
cat /proc/5678/smaps | grep -E "^[0-9a-f]|RSS" | head -40
# 方法B:如果是 C/C++ 程序,用 valgrind
valgrind --leak-check=full ./app
# 方法C:如果是 Java,用 jmap
jmap -histo:live 5678 | head -20
# 方法D:如果是 Python,用 tracemalloc
# 在代码中添加:
# import tracemalloc
# tracemalloc.start()
# snapshot = tracemalloc.take_snapshot()
# for stat in snapshot.statistics('lineno'):
# print(stat)
# 根因:字典缓存无限增长,没有设置上限
# 解决:用 LRU 缓存替代普通字典

8.3 案例3:磁盘 IO 瓶颈导致服务变慢#

Terminal window
# 步骤1:确认 IO 瓶颈
iostat -x 1
# sda %util=98% await=25ms → 磁盘饱和
# 步骤2:找 IO 大户
iotop -oP
# mysqld 读取 5000 KB/s,写入 2000 KB/s
# 步骤3:检查 MySQL 慢查询
mysql -e "SHOW PROCESSLIST;"
# 发现大量全表扫描查询
# 步骤4:检查 swap
vmstat 1
# si/so > 0 → 内存不足导致 swap 频繁 IO
# 根因:MySQL 慢查询 + swap 争抢磁盘
# 解决:
# 1. 添加索引优化慢查询
# 2. 增加 innodb_buffer_pool_size
# 3. 系统加内存或限制 swap 使用
# 4. 数据盘换 SSD/NVMe

8.4 案例4:网络连接堆积#

Terminal window
# 步骤1:查看连接数
ss -s
# TCP 连接 12000+,异常高
# 步骤2:按状态统计
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# 8000 CLOSE-WAIT ← 应用没有正确关闭连接!
# 3000 ESTAB
# 500 TIME-WAIT
# 步骤3:查看 CLOSE-WAIT 来自哪
ss -ant state close-wait | head -20
# 大量来自同一后端服务
# 步骤4:查看应用连接池配置
# 发现 HTTP 客户端没有设置超时 + 连接池泄漏
# 根因:调用后端 API 后没有关闭响应 Body
# 解决:
# 1. resp.Body.Close() 确保执行
# 2. 设置合理的超时(连接 + 读取)
# 3. 调整连接池大小
# 4. 临时缓解:调整 tcp_keepalive_time 加速回收
sysctl -w net.ipv4.tcp_keepalive_time=600

九、红线指标速查表#

指标 正常范围 告警阈值 危险阈值
────────────────────────────────────────────────────────────────────
CPU 使用率 < 70% > 85% > 95%
CPU 单核使用率 < 70% > 85% > 95%
Load Average (per core) < 1.0 > 1.5 > 2.0
iowait (%) < 2% > 5% > 10%
steal (%) 0% > 5% > 10%
上下文切换 (/s) < 50000 > 100000 > 200000
内存 available (%) > 30% < 15% < 5%
Swap 使用 0 > 0 > 100MB
OOM Kill 次数 0 > 0 > 0
磁盘 %util < 70% > 85% > 95%
磁盘 await (ms, SSD) < 2 > 10 > 20
磁盘 await (ms, HDD) < 10 > 20 > 50
TCP 连接总数 < 1000 > 5000 > 10000
CLOSE-WAIT 连接 < 10 > 50 > 100
SYN_RECV 连接 < 5 > 50 > 100
丢包率 (%) 0 > 0.1 > 1

十、工具速查表#

分析维度 快速检查 深入分析 持续监控
──────────────────────────────────────────────────────────────────
CPU top / uptime perf / strace sar -u
vmstat 1 mpstat -P ALL atop
htop flamegraph
内存 free -h pidstat -r sar -r
top -o %MEM smem / smaps atop
vmstat 1 /proc/meminfo
磁盘 IO iostat -x 1 iotop sar -d
vmstat 1 fio (基准测试) atop
df -h lsof + grep deleted
网络 ss -s tcpdump sar -n DEV
ping / traceroute nethogs / iftop atop
curl -w ss -ant | uniq -c
进程/系统 dmesg | tail strace -p journalctl
journalctl -p err lsof -p sar -A
ps aux /proc/<PID>/status

总结#

性能排查的核心方法论:

  1. 先全局后局部:uptime → vmstat → top,先看系统整体再看进程
  2. 先确认后深入:先确认瓶颈维度(CPU/内存/IO/网络),再深入分析
  3. 先数据后猜测:用工具采集数据,不要靠直觉猜原因
  4. 先保存后分析:sar/atop 持续记录,事后回放比实时盯更高效

日常运维建议:

  • 在所有服务器安装 sysstat(sar)和 atop,开启自动记录
  • 设置基础告警:CPU > 85%、内存 available < 15%、磁盘 > 90%、磁盘 IO await > 20ms
  • 每周回顾一次 sar 数据,建立性能基线
  • 出问题时先跑”60 秒清单”,再针对性深入

记住:性能问题不是”会不会发生”的问题,而是”什么时候发生”的问题。提前部署监控,出问题才能有据可查。

Linux 性能监控与故障排查完全指南:top/htop/iotop/strace/perf/sar 从入门到实战
https://971918.xyz/posts/docs/linux-performance-guide/
作者
九所长
发布于
2026-08-08
许可协议
CC BY-NC-SA 4.0