一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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 信息:

  1. sudo hdparm -I /dev/sda | grep -i "write cache" —— 输出类似 Write cache: enableddisabled
  2. 若设备是 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)
  3. 注意:普通用户无权执行 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 开关无关。比如:

  1. /sys/block/sda/queue/discard_granularity 只影响 TRIM 行为
  2. /sys/block/sda/queue/logical_block_size 是逻辑扇区大小
  3. /sys/block/sda/device/cache_type 在多数 SATA 设备上根本不存在(返回 No such file

确认写缓存是否生效:用 hdparm -tT 对比测试

仅看 hdparm -I 输出是“enabled”还不够——有些厂商固件会假报告,或在特定条件下禁用(如启用 SMART 自检、电池备份模块故障)。真实效果得靠读写延迟差异验证:

  1. 先关闭写缓存:sudo hdparm -W0 /dev/sda,再跑 sudo hdparm -tT /dev/sda,观察 “Timing cached reads” 数值(通常 >1000 MB/s)和 “Timing buffered disk reads”(通常 80–200 MB/s)
  2. 再开启写缓存:sudo hdparm -W1 /dev/sda,重复测试;若 “buffered disk reads” 提升明显(尤其小块随机写),说明缓存确实在起作用
  3. ⚠️警告:hdparm -W 是运行时开关,重启失效;部分企业级 SAS 盘需用 sg_inq 或厂商工具(如 megasasctl)才能持久化设置

RAID 卡或 NVMe 控制器可能绕过 hdparm

当系统接了硬件 RAID 卡(如 LSI/Broadcom MegaRAID)、或使用 PCIe NVMe SSD 且启用了控制器级缓存(如 Intel Optane PMem 模式),hdparm -I 会失效——因为它只能跟直连的 ATA/SATA 设备通信。

此时应:

  1. RAID 卡:用厂商工具,例如 /opt/MegaRAID/MegaCli/MegaCli64 -AdpCacheRead -aALL 查读缓存,-AdpCacheWrite 查写缓存
  2. NVMe:优先用 sudo nvme get-feature -f 0x08 /dev/nvme0n1,返回值中 bit 0 表示 volatile write cache 是否启用;若为 0x0,则缓存被禁用
  3. 不确定控制器类型时,lspci -vv | grep -A 10 -B5 "cache|write" 可辅助识别

真正麻烦的不是怎么查,而是查出来是 enabled 却不敢关——因为关了性能掉一半,开了又怕掉电丢事务。生产环境务必配合 UPS 和文件系统 barrier 设置(如 ext4 的 barrier=1)来平衡。

热门栏目