Skip to content

3. 性能分析方法论

本章目标

  • 掌握 USE 方法:对任何资源做 Utilization / Saturation / Errors 三连问
  • 掌握工作负载特征化:先问"是什么负载",再问"为什么慢"
  • 能把一句"存储慢了"的口头投诉转化为可执行的排查流程

工具是武器,方法论是作战地图。没有方法论的排查叫"碰运气":跑 20 个命令,总有一个看起来不对。

3.1 USE 方法

每一种资源依次问三个问题 —— This is your "不知道从哪开始"时的万能起手式:

text
for 资源 in [CPU, 内存, 网卡, 磁盘, ...]:
    Utilization  使用率:资源忙的时间比例
    Saturation   饱和度:排队/挤压程度
    Errors       错误:  计数器是否非零

以存储运维最相关的两类资源为例:

资源UtilizationSaturationErrors
磁盘设备iostat%util(注意并行失真)aqu-szawait 超基线dmesg 介质错误、smartctl
网络接口带宽占用率(sar -n DEV重传率上升、ss -tiretransip -s link 的 errs/dropped

USE 的价值在于完备性:遍历资源 × 三问,你不会漏掉某个没检查的角落。它定位"系统资源问题"很有效,但它不回答"该不该做这么多工作"—— 那是工作负载特征化的任务。

3.2 工作负载特征化

一半的"性能问题"其实是"容量问题"。 特征化五问:

  1. :哪个进程/哪个客户端/哪个租户在产生负载?(pidstat -dss -ti、网关日志)
  2. 什么操作:读还是写?随机还是顺序?4K 还是 1M?
  3. 多少:IOPS 多少?带宽多少?
  4. 何时:持续还是突发?和业务高峰重合吗?(sar 历史回放)
  5. 预期:业务方认为应该是多少?实际差多少倍?

问完这五个问题,方向自然清楚:负载比预期高 10 倍 → 找业务方(可能是某个定时任务配错了);负载正常但延迟高 → 回到 USE 方法查资源。

3.3 假设驱动的排查循环

text
现象 ──▶ 列出候选假设 ──▶ 选"最便宜可验证"的假设 ──▶ 验证

                  更新/排除假设 ◀── 证据 ◀───────────────┘

关键纪律:

  • 一次只验证一个假设,别同时动三个变量
  • 每个结论附一条工具输出(呼应第 2 章"证据链")
  • 假设被推翻是进展,不是失败 —— 排除法在收窄范围

实战案例:虚拟机磁盘慢

现象:某虚拟机用户反馈写文件慢。

假设验证手段结果
H1: 虚拟机内文件系统满df -i / df -h排除(空间、inode 充足)
H2: 虚拟机内 CPU 饱和vmstat 1r排除
H3: 后端存储慢宿主机 iostat -x待定:await 略高但未爆表
H4: 网络链路劣化ss -ti retrans命中:重传率 8%,正常 <0.1%
H5: 虚拟机内存压力换页vmstatsi/so排除

根因:交换机端口故障导致重传。修复后延迟恢复。注意 H3"略高但未爆表"如果先被当成根因,就会走弯路 —— 略异常的指标是线索,不是结论

3.4 排查流程图

把 USE + 特征化 + 假设循环拼成一张实用的图:

text
"存储慢了"

   ├─ Q1 范围:所有客户端慢 or 个别?          ──▶ 集群问题 / 单节点问题 / 单卷问题
   ├─ Q2 负载:IOPS/带宽比基线高吗?           ──▶ 高 → 特征化五问(找业务)
   │                                            低 → 继续
   ├─ Q3 USE:遍历资源三问(盘/网/内存/CPU)    ──▶ 饱和/错误 → 定位到资源
   └─ Q4 追踪:长尾在哪一层?                  ──▶ biosnoop/fileslower/offcputime

3.5 基线与容量规划

  • 基线(baseline):系统正常时的关键指标采样(IOPS、延迟分布、带宽、重传率)。没有基线就没有"异常" —— 0.8ms 的 await 是好是坏,取决于这块盘平时是 0.3ms 还是 0.9ms
  • 怎么建:部署完成后立刻用 第 2 章体检 Lab 采集存档;开启 sysstat 让 sar 持续记录
  • 容量水位:为第二篇的容量规划埋伏笔 —— 性能也要看水位(如 peak IOPS 的 60%),不只是容量百分比

本章小结

  • USE 方法保证不漏查;工作负载特征化保证不误诊(负载问题 ≠ 资源问题)
  • 假设驱动 + 单变量验证 + 证据链,是生产排障的职业习惯
  • 基线是"异常"的定义来源,第一天就要建

自测

QuizUSE 方法中,iostat 的 aqu-sz(队列深度)属于哪个维度?
Quiz业务方投诉「存储慢」,你采集后发现 IOPS 是平时的 10 倍,来自一个新上的备份任务,延迟等指标都在正常范围。最合理的处置是?
🧪Lab · 综合演练:诊断一次 IO 慢挑战
⏱ 90 分钟🖥 一台 Linux(教员/同伴随机注入一种故障)
1. 同伴从以下任选一种注入,不告诉你选了哪种:高负载(fio 压测)、网络延迟(tc netem delay)、丢包重传(tc netem loss)、IO 限速(cgroup io.max 或 device-mapper throttle)。 2. 你只知道现象:"写文件变慢了"。按本章流程图走:先定性(Q1/Q2),再 USE 遍历,最后追踪定位。 3. **验收标准**:给出证据链 —— 每一步结论附一条工具输出,最终指出注入的故障类型;全程不超过 5 条"假设→验证"记录。

上一章 · 下一章:4. 块设备与文件系统 →