最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Linux如何查看具体的磁盘写缓存状态
时间:2026-08-10 11:45:49 编辑:袖梨 来源:一聚教程网
用 hdparm -I 查看磁盘硬件写缓存开关状态的正确方法是:sudo hdparm -I /dev/sda | grep -i "write cache",输出“Write cache: enabled”或“disabled”;NVMe 设备需用 sudo nvme get-feature -f 0x08 /dev/nvme0n1。
用 hdparm -I 查看磁盘硬件写缓存开关状态
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 - 若设备是 NVMe,改用
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 和 echo $(( $(cat /sys/block/sda/queue/rq_affinity) )) 都不反映写缓存
很多人误以为 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"可辅助识别
真正麻烦的不是怎么查,而是查出来是 enabled 却不敢关——因为关了性能掉一半,开了又怕掉电丢事务。生产环境务必配合 UPS 和文件系统 barrier 设置(如 ext4 的 barrier=1)来平衡。