抖动的性质
抖动指存储延迟或吞吐在短时间尺度上反复跳动,业务感受是「忽快忽慢」,而看小时级平均值时一切正常。它几乎从不来自单一原因,而是排队、后台任务、缓存水位、链路错误几件事叠加的结果。因此排查的第一步不是调参数,而是把抖动的时间特征画出来,用周期性去反推触发源。
基本信息
| 必看指标 | P99 / P99.9 延迟、平均队列长度、IOPS 与带宽的同步波动、链路错误计数 |
|---|---|
| 采样粒度 | 抖动排查用秒级采样,分钟级平均值会把尖刺抹平 |
| 分层来源 | 介质(重建、GC、介质错误)、控制器(缓存下刷、保护部件自检)、路径(误码、切换)、网络(拥塞、丢包)、主机(队列深度、同宿干扰) |
| 时间特征 | 周期性、水位相关、持续性抬升、随机尖刺四类,对应完全不同的原因 |
| 判读基线 | 与业务无变更时的历史同期对比,绝对值意义有限 |
| 副作用风险 | 为压抖动而盲目放大队列深度,会把排队问题变成更长的排队时间 |
典型使用场景
- 业务反馈「白天正常、整点前后变慢」,需要定位是否为快照或备份任务占用带宽时
- 虚拟化集群中个别虚拟机卡顿,需要区分是存储侧抖动还是主机侧 CPU 争抢时
- 新开快照策略或精简置备卷扩容后出现抖动,验证是否与空间分配动作相关时
- 阵列重建期间性能明显下滑,评估是否需要限制重建速率或调整窗口时
- 同一批次服务器表现不一致,排查是否由链路亚健康而非负载差异导致时
秒级采样与对照观察
秒级采样与对照观察
# 秒级看设备级延迟拆分与队列积压,连续观察多个周期
iostat -x 1 60
# 分别看读写延迟与队列深度,判断是排队还是介质本身变慢
sar -d 1 30
# 采集分位数而不是平均值,尖刺只在 P99 以上可见
fio --name=jit --rw=randread --bs=4k --iodepth=32 --runtime=60 --percentile_list=50:99:99.9
# 内核日志里的链路重置、超时、下刷异常往往与抖动时间点吻合
journalctl -k --since '1 hour ago' | grep -Ei 'i/o error|reset|timeout|fault'时间特征反推原因
| 表现 | 优先怀疑 | 验证方式 |
|---|---|---|
| 整点或固定间隔出现 | 快照、备份、巡检等计划任务 | 对齐任务时间表与抖动时刻 |
| 几分钟一次的波动 | 缓存下刷水位、控制器自检 | 查缓存策略与保护部件状态 |
| 重建期间持续抬升 | 重建占用、未限速 | 查重建进度与限速配置 |
| 无规律随机尖刺 | 链路重传、多路径切换 | 查误码计数与路径事件日志 |
抖动排查要固定变量:同一时间段、同一负载模型、同一采样粒度。改变其中一个维度后对比出来的差异,往往只是时间点在变,而不是问题在变。
降级运行或重建期间本身就处于高抖动状态,此时不要同时执行其他存储侧变更,否则一旦出现二次故障,可回退的选项会被大幅压缩。