用 hdparm -I 查看磁盘硬件写缓存开关状态的正确方法是:sudo hdparm -I /dev/sda | grep -i "write cache",输出“Write cache: enabled”或“disabled”;NVMe 设备需用 sudo nvme get-feature -f 0x08 /dev/nvme0n1。
Linux 中“磁盘写缓存”指的是硬盘控制器上的 Write Cache(也叫 Write-Back Cache),它由硬件控制,开启后可大幅提升随机写性能,但断电可能丢数据。这个开关和内核 page cache 完全无关,不能用 free 或 /proc/meminfo 查。
正确方法是用 hdparm 查询设备的 ATA/SCSI IDENTIFY 信息:
sudo hdparm -I /dev/sda | grep -i "write cache" —— 输出类似 Write cache: enabled 或 disabled
sudo nvme id-ctrl /dev/nvme0n1 | grep -i "wctemp|wpc”,其中 WCTEMP 表示 write cache temp,WPC 是 write protect control,但更直接的是查 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 /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 -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 卡(如 LSI/Broadcom MegaRAID)、或使用 PCIe NVMe SSD 且启用了控制器级缓存(如 Intel Optane PMem 模式),hdparm -I 会失效——因为它只能跟直连的 ATA/SATA 设备通信。
此时应:
/opt/MegaRAID/MegaCli/MegaCli64 -AdpCacheRead -aALL 查读缓存,-AdpCacheWrite 查写缓存sudo nvme get-feature -f 0x08 /dev/nvme0n1,返回值中 bit 0 表示 volatile write cache 是否启用;若为 0x0,则缓存被禁用lspci -vv | grep -A 10 -B5 "cache|write" 可辅助识别真正麻烦的不是怎么查,而是查出来是 enabled 却不敢关——因为关了性能掉一半,开了又怕掉电丢事务。生产环境务必配合 UPS 和文件系统 barrier 设置(如 ext4 的 barrier=1)来平衡。