linux-performance-analysis · git:20260810.2f916d1 · 2026-08-10 · sha256 be8e4aec2e50936c

linux-performance-analysis git:20260810.2f916d1A

Immutable. This exact content never changes and is served at /api/v1/blob/be8e4aec2e50936c.

---
name: linux-performance-analysis
description: 在分析 Linux 主机性能问题时使用。适用于系统变慢、负载高、延迟高、CPU 飙高、内存不足、swap、磁盘阻塞、I/O wait、丢包、连接异常、超时,或需要判断瓶颈在 CPU、内存、I/O、网络、内核态还是应用态的场景。
---

# Linux 性能分析

## 目标

用低侵入方式定位 Linux 性能瓶颈。  
先看系统整体压力,再下钻到 CPU、内存、I/O、网络和具体进程,最后明确瓶颈子系统、内核态/应用态归因,以及主要触发进程。

## 何时使用

- Linux 主机运行缓慢、卡顿、过载、延迟高
- load average 高、CPU 使用率异常、CPU 主频异常降低、I/O wait 高
- 内存紧张、频繁 swap、OOM、major fault 异常
- 磁盘读写慢、文件系统满、inode 耗尽、进程阻塞在 I/O
- 丢包、重传、连接堆积、超时、网络吞吐或延迟异常
- 用户只提供了命令输出,需要基于现有证据判断瓶颈

## 何时不要使用

- 问题不是 Linux 主机或容器运行时性能问题
- 用户只是在问某个命令的语法,不需要做诊断
- 已经明确是业务代码逻辑 bug,应优先用系统化排查

## 安全级别

默认使用最低侵入方式,尤其是生产环境。

- L1:默认,只读、低开销观察,例如 `uptime`、`top`、`vmstat`、`iostat`、`ss`
- L2:短时间采样,有明确时长和目标,例如 `pidstat 1 3`
- L3:attach、trace、抓包、eBPF、主动压测,例如 `perf`、`strace`、`tcpdump`、`iperf3`

执行 L3 前必须先确认:

1. 主机是否生产环境
2. 采样时间窗口
3. 预期风险或开销
4. 明确的 duration、packet count 或 sample cap

## 基本流程

1. 明确症状、时间窗口、影响范围
2. 复用用户已有输出;不足时先补轻量 baseline
3. 横向检查 CPU、内存、I/O、网络,避免只盯第一个异常指标
4. 对可疑子系统从系统级下钻到进程、线程、设备、socket
5. 判断主要瓶颈在内核态还是应用态
6. 给出证据、结论、下一条最能减少不确定性的命令

## Baseline

优先从这些只读命令开始:

```bash
uname -a
uptime
top -b -n 1
vmstat 1 5
pidstat 1 3
```

如果某个方向已经明显异常,再读取对应参考:

- CPU:[references/cpu.md](references/cpu.md)
- 内存:[references/memory.md](references/memory.md)
- I/O:[references/io.md](references/io.md)
- 网络:[references/network.md](references/network.md)
- 报告模板:[references/report-template.md](references/report-template.md)

## 判断规则

- 高 `%wa` 通常先查 I/O,不要简单归为 CPU 问题
- load 高但 CPU 不高时,重点看阻塞任务、I/O、锁等待
- CPU 忙但吞吐低或延迟高时,检查 governor、性能模式、当前主频、最大/最小频率限制和热降频
- 高 `%sy`、`%si`、`%hi`、重传、backlog 压力通常指向内核或网络路径
- swap、major fault、reclaim stall、OOM 指向内存压力
- 网络问题可能由 CPU 饱和、socket backlog、应用读写慢共同触发

## 内核态与应用态

- 应用态:用户进程、业务线程、GC、SQL、序列化、压缩、请求处理等成本占主导
- 内核态:调度、软中断、中断、回收、文件系统、块层、TCP/IP、驱动、系统调用路径占主导
- 混合场景:如果应用触发大量内核工作,要同时说明“瓶颈层在内核态”和“触发进程是谁”

## 输出要求

最终结论必须明确回答:

1. 主要瓶颈是 CPU、内存、I/O 还是网络
2. 瓶颈主要在内核态还是应用态
3. 如果涉及应用态,哪个进程是主要触发者

证据不足时,不要强行定论。说明已经确认什么、仍然怀疑什么,并给出下一条最值得执行的命令。

## 关键约束

- 先看证据,再下结论
- 先系统级,再进程级
- 不主动运行有负载或高侵入命令
- 不把缓存占用直接当成内存泄漏
- 不把单个异常指标直接当成根因