要确认 Linux 系统中磁盘硬件写缓存是否开启,常见且可靠的方式是执行:sudo hdparm -I /dev/sda | grep -i "write cache"。如果结果显示“Write cache: enabled”,说明磁盘写缓存已启用;如果显示“disabled”,则表示当前未开启。需要特别注意的是,这条命令不适用于 NVMe 设备,查看 NVMe 写缓存状态应改用 sudo nvme get-feature -f 0x08 /dev/nvme0n1。

用 hdparm -I 查看磁盘硬件写缓存开关状态
在 Linux 环境中,所谓“磁盘写缓存”,本质上指的是硬盘控制器上的 **Write Cache**,也就是常说的 Write-Back Cache。这个功能由硬件层控制,开启后通常能明显提升随机写入性能;但与此同时,如果突然断电,也确实会带来一定的数据丢失风险。还要注意区分的是,它与 Linux 内核中的 page cache 完全不是同一个概念,二者彼此独立,因此不能通过 free 或 /proc/meminfo 来判断磁盘写缓存状态。
正确的查看方法,是使用 hdparm 读取设备的 ATA/SCSI IDENTIFY 信息:
sudo hdparm -I /dev/sda | grep -i "write cache"—— 输出通常类似Write cache: enabled或disabled- 如果设备属于 NVMe 类型,应改用
sudo nvme id-ctrl /dev/nvme0n1 | grep -i "wctemp|wpc”,其中WCTEMP表示 write cache temp,WPC表示 write protect control;不过更直接、也更适合查看 NVMe 写缓存开关状态的方法是sudo nvme get-feature -f 0x08 /dev/nvme0n1(feature ID 0x08 对应 volatile write cache) - 注意:普通用户通常没有权限执行
hdparm -I,必须配合sudo使用;否则可能报错HDIO_DRIVE_CMD(identify) failed: Invalid argument
blockdev --getra 和 echo $(( $(cat /sys/block/sda/queue/rq_affinity) )) 都不反映写缓存
很多人在排查 Linux 磁盘写缓存状态时,会误以为 blockdev --getra /dev/sda(查看预读值)或 /sys/block/*/queue/ 目录下某些参数可以代表写缓存是否开启——实际上并不能。
这些路径主要控制的是内核 I/O 调度策略、队列深度、请求合并等行为,与硬盘固件层面的 Write Cache 开关没有直接关系。例如:
/sys/block/sda/queue/discard_granularity只影响 TRIM 行为/sys/block/sda/queue/logical_block_size表示逻辑扇区大小/sys/block/sda/device/cache_type在大多数 SATA 设备上通常并不存在(返回No such file)
确认写缓存是否生效:用 hdparm -tT 对比测试
仅仅看到 hdparm -I 输出为“enabled”并不一定完全够用——有些厂商固件可能会出现假报告,或者在特定场景下临时禁用写缓存,例如启用了 SMART 自检,或电池备份模块故障。要进一步确认磁盘写缓存是否真正生效,还需要结合读写性能差异进行验证:
- 先关闭写缓存:
sudo hdparm -W0 /dev/sda,然后执行sudo hdparm -tT /dev/sda,观察 “Timing cached reads” 数值(通常 >1000 MB/s)以及 “Timing buffered disk reads”(通常 80–200 MB/s) - 再开启写缓存:
sudo hdparm -W1 /dev/sda,重复测试;如果 “buffered disk reads” 提升明显(尤其是在小块随机写场景下),就说明缓存确实发挥了作用 - ⚠️警告:
hdparm -W属于运行时开关,系统重启后会失效;部分企业级 SAS 硬盘还需要通过sg_inq或厂商专用工具(例如megasasctl)才能实现持久化设置
RAID 卡或 NVMe 控制器可能绕过 hdparm
当系统接入了硬件 RAID 卡(例如 LSI/Broadcom MegaRAID),或者使用 PCIe NVMe SSD 并启用了控制器级缓存(例如 Intel Optane PMem 模式)时,hdparm -I 往往会失效——因为它只能直接与 ATA/SATA 直连设备通信。
这种情况下应分别处理:
- RAID 卡:使用厂商提供的管理工具,例如
/opt/MegaRAID/MegaCli/MegaCli64 -AdpCacheRead -aALL查看读缓存,-AdpCacheWrite查看写缓存 - NVMe:优先执行
sudo nvme get-feature -f 0x08 /dev/nvme0n1,返回结果中的 bit 0 表示 volatile write cache 是否已启用;如果为 0x0,则说明缓存处于关闭状态 - 如果暂时无法确定控制器类型,可通过
lspci -vv | grep -A 10 -B5 "cache|write"辅助识别相关设备信息
真正棘手的问题往往不是“Linux 怎么查看磁盘写缓存状态”,而是查到 enabled 之后是否敢关闭——关闭后性能可能明显下降,开启后又担心断电导致事务丢失。因此,在生产环境中,建议务必结合 UPS 供电保障以及文件系统 barrier 配置(例如 ext4 的 barrier=1)一起权衡性能与数据安全。
