查SCSI磁盘当前写缓存模式需读取/sys/block/sdX/device/cache_type,输出为write back、write through或none;该值由内核sd驱动暴露,反映SCSI MODE SENSE实际生效状态,而非hdparm -I显示的硬件能力。

怎么查 SCSI 磁盘的 cache_type 当前值
SCSI 磁盘(如 /dev/sda)的写缓存开关状态,不体现在 hdparm 或 smartctl 里,而是由内核 sd 驱动暴露在 sysfs 中。路径固定为:/sys/block/sdX/device/cache_type(X 是盘符,如 a、b、c)。直接读取即可:
-
cat /sys/block/sda/device/cache_type—— 输出类似write back或write through - 若报错
No such file or directory,说明该设备不是 SCSI 类型(比如 NVMe 或 USB 转接盘),或驱动未导出该属性 - 注意:
sdX必须对应底层 SCSI 设备;/dev/sda1这类分区没有该文件,只能查/dev/sda对应的 block device
hdparm -I 显示的是硬件级缓存能力,不是当前生效状态
hdparm -I /dev/sda 输出里的 WriteCache=enabled 或 BuffSize=16384kB 只表示硬盘本身支持写缓存且缓存大小,但**不反映 Linux 是否允许启用它**。内核可能因安全策略(如挂载时加了 sync)、驱动参数或手动禁用而关闭该功能。所以即使这里显示 enabled,/sys/block/sda/device/cache_type 仍可能是 none 或 write through。
- 硬件缓存能力 ≠ 当前启用状态
- 真正决定 I/O 行为的是内核通过 SCSI 命令(MODE SENSE/SELECT)设置并维持的
cache_type -
hdparm -W只对 ATA 设备有效,对 SCSI 设备无效(会提示SG_IO: bad/missing sense data)
为什么 echo "write back" > cache_type 有时不生效
向 cache_type 写入新值失败,常见原因有三个:
- 设备只读:检查
/sys/block/sdX/device/目录权限,需 root 且文件非只读(ls -l cache_type应含wr) - 硬件拒绝:某些 RAID 卡或企业级盘固件禁止运行时修改缓存模式,写入后读回仍是旧值,且无错误提示
- 依赖同步:必须先执行
sync,再写入,否则内核可能拒绝变更(尤其当有脏页未刷盘时) - 临时 vs 永久:加
temporary前缀(注意末尾空格)可绕过硬件持久化要求,但重启后恢复原状
确认写缓存是否真起作用的最简验证法
光看 cache_type 不等于写缓存已生效——还要看 I/O 行为是否“异步”。最直接方式是测带缓存的随机写延迟:
- 先设为
write back:echo "write back" > /sys/block/sda/device/cache_type - 用
dd测小块同步写:dd if=/dev/zero of=/mnt/test bs=4k count=1000 oflag=sync conv=fdatasync - 对比
write through下同样命令耗时:若write back快 5–10 倍以上,基本确认缓存生效 - 注意:
oflag=sync强制每次写都等落盘,能暴露底层缓存策略差异;不用它的话,上层 page cache 会掩盖效果
真正难搞的不是查值,而是确认那个值有没有被硬件接受、有没有被上层应用绕过(比如数据库自己开 O_DIRECT)、以及会不会在掉电时丢数据。别只盯着 sysfs 文件,得结合实测和业务场景判断。


















