两条命令,两份不同的契约
Dataset Management 的 Deallocate 位是一个提示:主机声明某段 LBA 不再有用,盘可以处理,也可以忽略,读回什么由 Identify Namespace 中的 DLFEAT 字段决定。Write Zeroes 则是硬承诺,读回必须是全零。这个差别直接决定固件的实现自由度。Deallocate 可以只做映射标记;Write Zeroes 若按字面写零页,会白白消耗一次编程,正确做法是同样落在映射层,把该段 LBA 指向零页标识,将一次数据写降级为一次元数据更新。
有效页计数才是回收的调度输入
选块靠的是每个 Block 的有效页计数。映射标记为无效后计数立刻下调,这个 Block 在选块队列中的优先级随之上升,被选中时需要搬运的数据也真实减少。收益不来自删除动作本身,而来自计数下调的及时性:如果固件把 Deallocate 排到后台慢慢消化,回收在这段窗口里看到的仍是旧计数,仍会按旧的搬运量执行。因此我们把映射更新放在前台命令路径内完成,只把日志落盘做异步化处理。
粒度与对齐吃掉的那部分
映射表按固定粒度组织,落在粒度边界内部的零散区间无法整条置无效,只能保留原映射。文件系统按 4KB 释放、盘按更大粒度映射时,这类残留会明显削弱效果。Dataset Management 允许一条命令携带多个 LBA Range,把成百上千个离散区间合并成一次提交,既降低命令开销,也让固件有机会先排序合并再更新映射,把跨粒度的碎片凑成整段。
回归测试里盯住的几条曲线
在 J750/J770 的工程平台上,我们在随机写达到稳态之后注入不同覆盖率的 Deallocate,记录三条曲线:写放大、回收搬运字节数,以及 4KB 随机写吞吐的恢复过程(J750 目标 300 KIOPS,J770 目标 600 KIOPS)。判据不是峰值有多高,而是曲线抬升的时间常数是否可预测——不可预测的恢复过程,在数据库与虚拟化场景里比低吞吐更难接受。产品当前处于产品定义/EVT 阶段,这组用例已纳入固件回归。
