澳八机器人 性能问题不出四大资源
好,这篇博客园 codigger 的文章(2026-09-20 14:42)覆盖了从基础到进阶的完整链路。[citation:20.6]
我把它的核心框架提取出来,结合我自身的知识做一次结构化梳理,同时补上文章略过的"具体病症对应什
么指标"的对应关系。
---
一、排查总纲:先定方向,再钉根因
文章开头的思路非常实用——性能问题不出四大资源:[citation:20.49]
| 资源 | 典型表现 | 混淆陷阱 |
|------|---------|---------|
| CPU | 计算能力不够 | 负载高≠CPU满(可能卡在 IO wait) |
| 内存 | 空间不够、频繁换页 | free 很小≠内存不足(cache 占着) |
| 磁盘 I/O | 读写阻塞 | %iowait 可能伪装成"CPU 忙" |
| 网络 | 带宽满、连接数爆 | 连接池耗尽也能表现成"请求超时" |
文章强调了一个关键认知:top 里的 %CPU 不高,延迟可能耗在磁盘 IO 等待、内存换页,或卡在某个网
络 syscall 上。方向判错,后面全是白调。[citation:20.49]
---
二、基础四件套
文章列出的四件套和各指标的含义:[citation:20.49]
2.1 CPU / 负载:top + mpstat
top -b -n 1 | head -20
mpstat -P ALL 1 3 # 看每核分布,重点盯 %iowait
load average 的实用判法:
单核:load < 1 正常,= 1 满载,> 1 过载
多核:load / 核数 < 0.7 健康
💡 同时看 %us(用户态)、%sy(内核态)、%wa(IO 等待)、%id(空闲)。%wa 高但 %us 低 → 大概率是磁盘瓶颈,不是 CPU。
2.2 内存:free + vmstat
free -h
vmstat 1 5
文章纠正了一个常见误区:free 很小没关系,Linux 会用空闲内存做 cache。要看的是 available——它才是真正可用的内存。[citation:20.49]
available < 总内存 10% → 危险
Swap used > 0 → 内存已经不够了
vmstat 的 si/so > 0 → 正在换页,性能必然下降
2.3 磁盘:iostat + iotop
iostat -x 1 5
iotop -o
| 指标 | 健康阈值 | 含义 |
|------|:-------:|------|
| %util | < 70% | 磁盘繁忙度(注意:SSD 下 %util 可能不准确) |
| await | < 10ms | IO 响应时间 |
| rawait / wawait | — | 读写分别的等待时间,读写混合时分开看才准 |
2.4 网络:ss
ss -s # 连接统计概览
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
两个关键异常:
| 状态 | 原因 | 快速修复 |
|------|------|---------|
| TIME-WAIT 过多 | 短连接大量建立关闭 | sysctl -w net.ipv4.tcptwreuse=1 |
| CLOSE-WAIT 过多 | 代码没正确关闭连接(socket/http 没 close) | 修代码,不是改内核参数 |
---
三、进阶三剑客:perf / strace / 火焰图
文章的核心判断:[citation:20.49]
基础四件套能"定方向",但要"钉死根因",得靠进阶工具。
| 工具 | 擅长看什么 | 何时用 |
|------|-----------|-------|
| perf | CPU 热点、内核态开销(on-CPU) | 哪个函数最占 CPU |
| strace | 系统调用级追踪 | 进程卡在哪个 syscall |
| 火焰图 | 把 perf 采样可视化 | 时间花在哪条调用栈 |
3.1 CPU 瓶颈:perf 抓热点
系统范围采样 30s
perf record -F 99 -ag -- sleep 30
perf report # 交互式看热点
perf top -p $PID # 实时看某个进程的热点函数
生成火焰图
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg
-F 99 的惯例:避开整百赫兹的采样共振(比如 100Hz 可能和 100Hz 中断锁相,采到的是偏态),99 是一个常用的"质数频率"。
3.2 内存瓶颈的延伸:perf stat 看缓存行为
perf stat -e cache-misses,cache-references,page-faults,major-faults \
-p $PID -- sleep 10
| 事件 | 偏高意味着什么 |
|------|--------------|
| major-faults | 需要从磁盘换入的缺页——内存压力已逼出 IO |
| cache-misses | 热点数据没留在 CPU 缓存,可能有缓存行竞争或数据局部性差 |
3.3 IO 瓶颈:strace + 系统级印证
逐条看耗时(-T 显示每个 syscall 耗时)
strace -Ttt -e trace=file,network -f -p $PID
汇总统计(生产环境首选,开销小)
strace -c -f -p $PID -- sleep 5
系统级印证
iostat -x 1 && pidstat -d 1
-T 标出的高耗时 read / write / connect 就是阻塞点。某 connect 每次几百毫秒 → 问题大概率在下游/网络。
---
四、端到端实战:接口变慢 30 分钟内定位
文章的实战案例很典型:[citation:20.49]
1) 定方向
top -b -n 1 | head -20 && mpstat 1 3
2) CPU 热点 + 火焰图
perf record -F 99 -ag -p $PID -- sleep 20
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg
3) syscall 层
strace -Ttt -e trace=file,network -f -p $PID -- sleep 5
4) 内存 / 缓存
perf stat -e cache-misses,page-faults -p $PID -- sleep 10
free -h && vmstat 1 5
典型结论矩阵:
| 火焰图形态 | strace 表现 | 根因方向 |
|-----------|------------|---------|
| 某函数栈极宽 | 无明显高耗时 syscall | 改代码优化(序列化、算法效率低) |
| 火焰图"很干净" | connect 高耗时 | 网络/下游问题(连接池、DNS、超时) |
| 火焰图干净 | vmstat si/so > 0 | 加内存或查泄漏 |
| 内核栈宽 | 锁相关调用多 | 锁竞争/上下文切换频繁 |
---
五、文章里提到但容易忽略的坑
5.1 strace 有 ptrace 开销
文章明确提醒:strace 通过 ptrace 显著拖慢目标进程——生产慎用,避免长时间 attach。统计优先用 -c,拿完数据立刻退出。[citation:20.49]
一个不太为人知的替代方案:如果你只是想看进程卡在哪,而不用看逐次调用参数,可以用 /proc/<pid>/syscall 取当前卡住的 syscall——零开销。
cat /proc/<PID>/syscall # 当前正在执行的 syscall 编号+参数
5.2 火焰图只看了"一半"
文章也提到了:火焰图只看 on-CPU 时间——进程若卡在 IO/锁(off-CPU),火焰图会"看起来很干净"。
比如一个线程大部分时间在等磁盘 IO 或等锁,火焰图上只会在很窄的栈上显示极少采样点——这时候需要 off-CPU 火焰图(perf sched / eBPF),否则会漏判。[citation:20.49]
5.3 perfeventparanoid 权限
cat /proc/sys/kernel/perfeventparanoid
默认值多为 2~4,内核态/整机数据需要 CAPPERFMON 或 CAPSYS_ADMIN。容器内还需放开 securityContext。
---
六、一页速查表
问题来了 → 先定方向
├── top # CPU + Load + 内存概览
├── free -h # 看 available
├── iostat -x 1 # 看 %util + await
└── ss -s # 看连接状态
方向定了 → 钉根因
├── CPU 高 → perf record -F 99 -ag + 火焰图
├── 卡在 IO → strace -c + iostat + pidstat
├── 内存不足 → vmstat 1 + perf stat page-faults
└── 网络慢 → ss -ant + ping + mtr
生产环境特别提醒
├── strace 有 ptrace 开销,用 -c 汇总模式
├── 火焰图只覆盖 on-CPU,IO 阻塞可用 off-CPU 补充
└── perf 权限不够时确认 paranoid 值
这篇文章的价值在于把"排查流程"而不是"工具列表"作为主线——很多人都知道 perf 和 strace 各自怎么用,但不知道什么时候该用哪个、出了图该怎么读。它把这部分补齐了。