iostat无法查看写入放大,因其仅统计主机层逻辑I/O;唯一可行方法是用sudo nvme smart-log读取NVMe Log Page 0x02中的host_write_commands与media_write_commands计算WAF,消费级SSD通常不支持该功能。

iostat 根本不能查看写入放大,它连这个指标都不采集。 你看到的 wkB/s、avgrq-sz 全是主机层逻辑 I/O 统计,和 NAND 实际写入量无关。想靠 iostat -d 或 iostat -x 推算 WAF(Write Amplification Factor),纯属徒劳。
为什么 nvme smart-log 是唯一可行入口
只有部分企业级 NVMe SSD(如 Intel DCPMEM、某些三星/WD 数据中心盘)在 NVMe Log Page 0x02(SMART/Health)中暴露了真实物理写入数据:host_write_commands 和 media_write_commands(或 host_bytes_written / nand_bytes_written)。WAF ≈ 后者 ÷ 前者。
- 必须用
sudo nvme smart-log /dev/nvme0n1,普通用户无权限读取日志页 - 输出里没有这两项?说明你的盘不支持——消费级盘(如 Samsung 970 EVO、WD Blue SN570)基本都返回 0 或空白
- 别信
/sys/block/nvme0n1/device/model,得实测命令输出;单次读数无意义,需在稳态负载下多次采样取比值 - 注意单位:有些盘返回的是“sector”(512B),有些是“bytes”,计算前务必确认
mmcblk 设备(eMMC/UFS)怎么查
eMMC 和部分 UFS 设备可能通过 sysfs 暴露 FTL 级统计,但依赖内核驱动支持和厂商实现:
- 检查是否存在
/sys/block/mmcblk0/device/ftl_stats—— 若有,可读取其中类似host_writes、phy_writes的字段 - 更常见的是用
smartctl -a /dev/mmcblk0查看Media_Wearout_Indicator或厂商自定义属性(如Wear_Leveling_Count) - 但注意:
smartctl对 eMMC 支持不稳定,部分平台需加-d marvell或-d sat+megaraid,0等参数才能通信 - 没有
ftl_stats也不代表没写放大,只是你无法直接观测 —— 它依然在发生
别被 iostat 的 await 和 %util 带偏
高 await(比如 >20ms)或持续 %util == 100 并不等于高 WAF:
- 可能是温度降频(查
sudo nvme smart-log /dev/nvme0n1 | grep temperature) - 可能是 PCIe 链路拥塞或队列深度不足(
nvme get-feature -f 0x01 /dev/nvme0n1查Queue Depth) - 也可能是 TRIM 未启用导致 GC 效率暴跌 —— 用
sudo fstrim -v /手动触发后观察await是否回落 - 真正影响 WAF 的是 workload 特征:随机写比例、空闲空间占比、是否启用 TRIM,而不是扇区对齐或
avgrq-sz数值
最易被忽略的一点:WAF 不是静态值,它随剩余空间线性恶化。一块新盘空闲率 80% 时 WAF 可能是 1.1,掉到 15% 时可能飙到 4.0 以上。所以监控必须结合 df -h 和 SMART 健康度一起看,孤立看任一指标都会误判。


















