/sys/block/sdx/device/timeout 是 linux 内核为 scsi/sas/ata 物理磁盘暴露的底层 i/o 超时值(单位秒),控制主机等待设备响应的最长时间,超时后内核中止请求并上报错误,属物理盘级容错第一道防线;仅适用于真实 scsi 类设备(如 sda),不适用于 nvme 或逻辑设备,临时修改需 root 权限且重启失效,永久生效需配合 udev 规则。

/sys/block/sdX/device/timeout 是 Linux 内核为 SCSI/SAS/ATA 类物理磁盘设备暴露的底层 I/O 超时值(单位:秒),它控制的是主机侧向磁盘发送命令后,等待设备响应的最长时间。超过该时限,内核会主动中止请求、上报错误(如 I/O error),并可能触发路径切换(多路径环境)或设备离线(严重超时下)。
这个值不同于上层的 disk.TimeOutValue(Windows 注册表项)或文件系统层的挂载超时,它是直接作用于 SCSI 命令层的硬性保护边界,属于物理盘级容错的第一道防线。
? 如何查看和修改 /sys/block/sdX/device/timeout
✅ 查看当前 timeout 值
cat /sys/block/sdX/device/timeout
例如输出 30,表示该盘单个 SCSI 命令最多等待 30 秒。
⚠️ 注意:
sdX必须是真实物理盘(如sda、sdb),不能是md0、nvme0n1或mpatha这类逻辑设备;NVMe 设备不走 SCSI 协议,因此无此路径。
✅ 临时修改(运行时生效,重启丢失)
需 root 权限,且目标设备未被繁忙 I/O 占用(否则写入可能失败或被忽略):
echo 60 > /sys/block/sdX/device/timeout
建议值范围:
- 普通 SATA/SAS HDD:30–120 秒(机械盘寻道慢,尤其高负载或坏道初期易超时)
- SSD(SATA/SAS 接口):10–30 秒(响应快,过长反而掩盖故障)
- 企业级 SAS SSD 或带缓存 RAID 卡后端盘:可设为 60–120 秒(允许控制器内部重试)
❗ 修改后不会自动刷新队列或重发挂起请求,仅影响后续新发出的命令。
? 修改前必须确认的几件事
-
确认设备类型与协议支持
只有通过 SCSI 子系统识别的设备(包括大部分 SATA 盘在 AHCI 模式下被模拟为 SCSI)才有该接口。执行:ls -l /sys/block/sdX/device
若存在
timeout文件,说明支持;若报No such file or directory,则该设备不适用(如 NVMe、部分 USB-SATA 桥接盘、某些直连 ATA 设备)。 -
避免在根盘或活跃业务盘上随意调大 timeout
过长的超时会导致:- I/O 请求长期阻塞进程(表现为
D状态进程) -
iostat中%util持续 100%、await飙升 - 多路径环境下 failover 延迟,影响高可用切换
- I/O 请求长期阻塞进程(表现为
-
不要替代故障诊断
若频繁触发 timeout,本质是硬件异常(坏扇区、链路不稳定、电源波动)或固件缺陷。调大 timeout 只是延缓报错,不是修复手段。应同步检查:smartctl -a /dev/sdX # 查看 SMART 属性(尤其是 Reallocated_Sector_Ct、Current_Pending_Sector) dmesg | grep -i "sdX\|ata\|error" # 定位底层错误源头
? 永久生效方法(需结合 udev 规则)
因 /sys/ 下值重启即恢复默认(通常为 30 秒),如需固化,可创建 udev rule:
-
创建规则文件:
sudo tee /etc/udev/rules.d/99-disk-timeout.rules
-
重新加载规则并触发:
sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=scsi
✅ 此方式在设备热插拔或系统启动时自动应用,比改 GRUB 参数更精准、安全。
? 对比其他超时参数(别混淆)
| 路径 | 作用层 | 是否持久 | 典型用途 |
|---|---|---|---|
/sys/block/sdX/device/timeout |
SCSI 命令层(物理盘) | 否(需 udev) | 控制单次读写命令最大等待时间 |
/sys/block/sdX/queue/io_timeout |
块设备队列层 | 否 | 较少使用,内核 5.0+ 已弃用 |
/sys/block/sdX/device/eh_timeout |
错误处理超时(用于 LUN reset) | 否 | 一般不手动调整 |
blockdev --setra / ionice
|
应用/调度层 | 否 | 影响预读与优先级,非容错边界 |
不复杂但容易忽略。











