目录
2. Set Features:WCE 位(Dword 11 的第 0 位)
各位看官,今天咱们来聊一聊 NVMe 协议里那个让人又爱又恨的 Flush 命令。它就像是游戏里的“强制存盘”功能,看似简单,却关乎你的数据安危!
一、Flush 是何方神圣?
在 NVMe 的江湖里,江湖” 中,Flush 命令(操作码 00h)是所有 SSD 必支持的 “硬核角色”,属于 I/O Commands,却不负责数据传输,不参与性能加速,但扛起数据安全的 “大梁”,专门负责把缓存里的数据立即、马上、刻不容缓地送到非易失存储的老巢!
二、为什么需要 Flush?
现代 SSD 控制器个个都是“心机boy”,为了提升性能,它们设置了易失性写缓存(Volatile Write Cache) 这个“临时工”,它是 SSD 里的 “矛盾体”:既是性能功臣,也是安全隐患。
- 数据先扔到缓存:“主人,写好了!”(其实还在缓存里)
- 缓存偷偷干活:攒一波数据再一起写入
- 断电就悲剧:要是突然断电,缓存里的数据就“灰飞烟灭”了
这时候 Flush 命令就化身“监工”:“别偷懒!立刻把数据写到闪存里去!”
三、缓存里的“临时工”VWC
Flush 能否生效,首先关注 SSD 是否支持 VWC?需要通过 Identify 查看 VWC field 状态。
其次关注VWC 的开关状态,而开关由 NVMe 的 “Feature 功能(标识符 06h)” 控制,核心是WCE 位(Write Cache Enable)。
1. Identify VWC

2. Set Features:WCE 位(Dword 11 的第 0 位)

- WCE=1:启用 VWC,Flush “有活干”;
- WCE=0:禁用 VWC,数据直接进 NAND,Flush “没活干”。
特别提醒:无 VWC 时,Flush 怎么办?
若 SSD 无 VWC 或 VWC 已禁用,NVMe “江湖规矩”(协议)规定:
- 未执行 “擦除操作(sanitize)”:Flush 无效果,但必须返回成功;
- 正在执行 “擦除操作(sanitize)”:Flush 无效果,可返回成功(非强制)。
调试时若 Flush “成功却无动作”,先查 VWC 是否启用。
3. 别搞混:VWC vs 非易失性缓存
非易失性缓存(如带电容的 DRAM、NAND 缓存)“自带断电保护”,无需依赖 Flush,且不受 WCE 位控制—— 别以为关了 WCE,非易失性缓存就不工作。
4. 实操:查 / 调 VWC 状态
(1)查状态:Get Features 命令
- 功能标识符:06h;
- 结果:CQE 的 Dword 0 中,仅第 0 位(WCE 位)有效,其余为保留值;
- 用途:调试前确认 VWC 状态,避免 Flush “白干活”。
(2)调状态:Set Features 命令
- 功能标识符:06h;
- 参数:通过 “Command Dword 11” 修改 WCE 位(仅第 0 位有效);
- 注意:修改后用 Get Features 验证,部分 SSD 需重启生效。
三、Flush 的十八般武艺
Flush 通过 “提交队列条目(SQE)” 传参,64 字节格式中,以下字段是关键(非保留字段已省略):
Flush 命令 SQE “出招表”
| 字段名称 | 位置(字节) | 招式说明 | 避坑提醒 |
|---|---|---|---|
| Opcode (OPC) | 0 | 00h | |
| Namespace Identifier(NSID) | 4-7 | 指定刷新范围:
| NVMe 1.4 之后的版本别填 0! 传 FFFFFFFFh 前通过 identify 确认控制器是否支持。 |
| PRP/SGL 相关字段 | 16-39 | Flush 无数据传输,这些字段必须全设为 0h | 漏填非 0 会导致命令失败 |
| 命令专属 Dword(CDW10~15) | 40-63 | 无专属参数,所有字段需设为 0h | 保留字段别瞎填,置 0 即可 |
招式出错
要是你在使用 Flush 时出错招式了,那么就会得到 SSD 的警告 status code:
- Invalid Namespace or Format(0Bh) :“大哥,给的 NSID 不存在,无效啊!”
- Attempted Write to Read Only Range(82h) :“这空间是只读的,刷不动啊!”
- Invalid Field in Command(02h) :“命令格式错了,重写!”
四、什么时候该用 Flush?
1. 关键时刻必须刷
- 数据库提交事务:事务提交后立即 Flush,确保数据安全
- 重要文件保存:保存关键文档后 Flush,防止断电丢失
- 系统关机前:优雅关机时自动 Flush,保证数据完整性
2. 性能敏感场合慎用
Flush 虽然是数据安全的“守护神”,但也是性能的“杀手”:
结论:Flush 虽好,可不要贪杯哦!
五、趣味知识:Flush 的“兄弟姐妹”
在 NVMe 大家庭里,Flush 还有几个“亲戚”:
- FUA (Force Unit Access):写入时直达NAND,相当于“VIP直达通道”
- Write Through:透写模式,每次写入都自动持久化
- Power Loss Protection:硬件级掉电保护(大电容),Flush 的“终极梦想”
六、总结:Flush 使用心法
- 知其然知其所以然:了解你的 SSD 是否支持全局 Flush
- 该出手时就出手:关键数据立即 Flush,不要犹豫
- 不要过度使用:频繁 Flush 会影响性能,找到平衡点
- 结合其他机制:配合 FUA、Write Through 等使用效果更佳
Reference
NVM Express® Base Specification, Revision 2.0e
各位看官,今天的“戏说 NVMe”就到这里。记住:Flush 不是万能的,但没有 Flush 是万万不能的!
1834

被折叠的 条评论
为什么被折叠?



