超时与队列是一对约束
发起端(主机侧 HBA 或软件发起端)的超时与队列参数决定了两件事:故障发生时多久才认为 I/O 失败并触发切换,以及在正常负载下能同时挂多少请求。超时设得太短,正常波动就被判为失败,引发不必要的重试与切换;设得太长,故障切换迟钝、应用卡顿时间被拉长。队列深度同理:过小浪费带宽,过大则让延迟在队列里堆积,表现为响应时间上升而吞吐不增。
基本信息
| 超时类参数 | 设备超时、链路丢失超时、快速失败超时 |
|---|---|
| 队列类参数 | 设备队列深度、请求队列长度、单次传输上限 |
| 多路径配合 | 路径不可用时的重试次数与排队策略 |
| 操作系统差异 | Linux 暴露在 sysfs 与多路径配置中,Windows 主要在注册表与多路径设置中 |
| 权限要求 | 主机 root/管理员,需在变更窗口内调整 |
典型使用场景
- 存储维护窗口内希望减少应用报错,调整超时与切换行为的配合关系
- 延迟抖动排查,确认是否需要降低队列深度以缓解排队
- 性能压测时确定队列深度对吞吐与延迟的影响曲线
- 故障切换演练中记录切换耗时并回填参数
- 迁移到新阵列后重新校准超时基线
常见调整入口(示例)
常见调整入口(示例)
# 1) 设备超时与队列深度(运行期,重启后可能失效)
cat /sys/block/sda/device/timeout
cat /sys/block/sda/device/queue_depth
# 2) 多路径侧的链路丢失与快速失败超时、路径重试策略
# 在 multipath.conf 的 devices/defaults 段配置
# 3) 单次传输大小上限,影响大块 I/O 的行为
cat /sys/block/sda/queue/max_sectors_kb
# 4) 生效值核对:改完后确认内核实际使用的参数
multipath -ll参数影响判读
| 参数类别 | 调大的效果 | 调小的效果 |
|---|---|---|
| 设备超时 | 容忍更长的响应波动,故障发现更慢 | 快速失败,易误判与频繁重试 |
| 链路丢失超时 | 故障后等待更久,切换更慢 | 切换更快,但抖动时易触发 |
| 队列深度 | 并发请求更多,延迟可能堆积 | 延迟低但可能跑不满带宽 |
| 重试次数 | 容忍瞬时错误 | 错误更早暴露给应用 |
| 单次传输上限 | 大块 I/O 效率更高 | 小 I/O 更灵活,大块效率下降 |
参数名、默认值与可调范围随内核版本与驱动版本变化,实施前应确认当前系统的实际默认值,并以对应版本的官方文档为准。
盲目加大超时会掩盖真实故障并延长应用卡顿时间;调整前应明确应用侧超时窗口,确保主机超时小于应用超时,否则调整反而把问题推到更上层。