返回首页

Linux 系统性能排查全景指南 — USE 方法论 + 四维排查 + eBPF 实战

📅 创建于 2026-06-02 🔄 更新于 2026-06-02 📝 560 字

来源:运维技术圈 | 发布日期:2026-05-25

Linux 系统性能排查全景指南

排查框架: Brendan Gregg USE 方法论(Utilization 使用率、Saturation 饱和度、Errors 错误)逐层递进,从宏观概览到微观取证,再到 eBPF 深度追踪。


一、宏观概览:四步摸清系统状态

不要上来就盯着一个指标。按顺序跑这四个命令,建立全局认知。

1. uptime — 负载趋势

uptime
# 16:20:15 up 45 days, 1 users, load average: 45.15, 20.05, 10.12
  • 1min > 15min → 突发流量
  • 15min 持续高位 → 系统长期高压
  • ⚠️ Load Average ≠ CPU 使用率。磁盘 I/O 等待(D 状态进程)也会计入。Load 高但 CPU 空闲时,去查磁盘

2. dmesg — 内核"遗言"

dmesg | tail
  • Out of memory → 内存爆了
  • TCP: time wait bucket table overflow → 连接数过多

3. vmstat — 系统健康度

vmstat 1 3

关键列(CPU 瓶颈场景):

r  b  us sy id wa st
8  0  85 15  0  0  0

r(运行队列)=8 > CPU 核数,us=85%,id=0 → CPU 瓶颈

关键列(I/O 瓶颈场景):

r  b  us sy id  wa st
0  3   5 10 15  70  0

b(阻塞队列)=3,wa=70%,bi 极高 → 磁盘 I/O 瓶颈

排查决策树

vmstat 发现瓶颈
  │
  ├─ r 高 + us 高 → CPU 瓶颈 → top → perf → 查代码/GC
  ├─ wa 高 → I/O 瓶颈 → iostat → iotop → 查存储
  ├─ si/so > 0 → 内存不足 → free -h → 查泄漏
  └─ 一切正常但业务慢 → 网络/容器限流/eBPF

二、四大子系统排查

2.1 CPU 飙高

# ① 找进程
top -o %CPU   # 或 pidstat -u 1
# ② 找线程(对应 jstack 等日志)
top -H -p <PID>
# ③ 看调用栈
perf top -p <PID>

典型案例: perf top 看到 GCTaskThread::run() 占 45% → Java Full GC 打满 CPU → 排查方向转向 JVM 堆内存。

2.2 内存泄漏与 OOM

# 看 available 列,不是 free 列
free -h
# 找大户:看 RES(常驻内存),不是 VIRT
top -o %MEM
# OOM 死亡回放
grep "Killed process" /var/log/messages

2.3 磁盘 I/O

iostat -xz 1

关键指标:

  • %util = 100% → 磁盘被榨干
  • await > 100ms → I/O 队列严重堆积(SSD 正常应在 1-5ms)
  • iotop -o → 找到写磁盘的进程

2.4 网络

ss -s                 # 连接状态概览
# TIME_WAIT 过多 → 短连接耗尽端口
# CLOSE_WAIT 大量 → 代码未关闭 Socket
sar -n DEV 1          # 网卡带宽是否跑满
tcpdump -w dump.pcap  # 抓包分析三次握手/重传

三、K8s 环境特供:CPU 限流排查

K8s 容器中,宿主机 top 显示空闲,但容器业务延迟高——很可能是 Cgroups CPU 限流

cat /sys/fs/cgroup/cpu/cpu.stat
# nr_periods 54321
# nr_throttled 12500        ← 被限流的周期数
# throttled_time 450000000000

12500 / 54321 ≈ 23% 的时间被挂起,限流严重。

对策: 调大 resources.limits.cpu,或检查 Java GC 线程数 / Go GOMAXPROCS 是否误识别了宿主机物理核数。


四、eBPF 显微镜:偶发玄学卡顿的终结者

常规工具抓不到的短暂进程和偶发延时,eBPF(bcc-tools)在不改代码、不重启服务的情况下直接洞察内核。

execsnoop — 抓毫秒级进程

execsnoop -T
# TIME(s)     PCOMM     PID  PPID  ARGS
# 03:25:01    cron      4521 1024  /usr/sbin/cron -f
# 03:25:01    sh        4522 4521  /bin/sh -c /app/monitor.sh
# 03:25:02    curl      4523 4522  /usr/bin/curl -s http://internal.api/health

揪出 cron → monitor.sh → curl 链路——几毫秒就跑完,top 根本抓不到。

opensnoop — 查文件打开失败

opensnoop -x
# PID   COMM   FD  ERR PATH
# 20485 nginx  -1   2  /etc/nginx/conf.d/proxy.conf

ERR=2 = ENOENT(文件不存在)。配置改了不生效?应用缺文件报错?秒杀。

biolatency — I/O 延迟分布直方图

biolatency -m
#  usecs          : count    distribution
#  16 -> 31      : 128     |********** |
#  32 -> 63      : 512     |****************************************|
#  4194304 -> 8388607 : 3  |*          |

绝大多数 I/O 在 32-63 微秒,但有 3 次耗时 4-8 秒——这就是偶发超时的根因。iostat 的均值无法暴露这类长尾问题。


核心经验

性能排查不是死记命令。USE 模型层层递进:从系统负载 → Cgroups 限制 → 常规指标 → eBPF 追踪。用数据说话,在混沌中找到那根线头。


关联页面

页面 说明
server-performance-four-dimensions 服务器五维排查(CPU/内存/磁盘/网络/文件系统)
cpu-spike-troubleshooting-guide CPU 飙高排查方法论
linux-load-average-guide Load Average 完全解读
linux-memory-management-deep-dive Linux 内存管理深度解析
k8s-resource-limits-configuration K8s 资源限制与 CPU 限流