三种操作的时间尺度差了两个数量级
NAND 页读取在数十微秒量级,页编程在数百微秒到毫秒量级,而块擦除通常需要 2 至 5 毫秒。擦除既是最慢的一步,也是唯一无法被拆细的一步——它必须对整个块施加完整的擦除脉冲序列并做校验。GC 的成本因此不均匀地压在这一环节上。
阻塞发生在 die 层面,不只是通道
常见的误解是把它当成带宽问题。实际上 NAND 的忙状态粒度是 die 或 LUN:某个 die 正在擦除时,所有映射到该 die 的读请求只能排队等待,通道再宽也无济于事。这是资源占用问题。在低队列深度场景下后果尤其明显——J750/J770 规划的 QD1 平均读延迟为 65 µs,而一次不巧撞上擦除的读会被推到毫秒量级,直接反映在 P99.9 上。
Erase Suspend 与它的隐藏成本
企业级 NAND 普遍支持挂起擦除去服务读,随后再恢复。这个能力有用,但不是免费的:恢复后的擦除需要重新施加脉冲,累计擦除时间被拉长;挂起过于频繁还可能让擦除不够充分,抬高后续编程的误码率,把问题从延迟域转移到可靠性域。固件必须限制单次擦除允许被挂起的次数,超过阈值就让它跑完。
把擦除铺开:配额、错峰与水位
合理的 GC 不是发现哪个块最脏就立刻擦。调度器为每个通道和每个 die 维护擦除配额,在时间窗口内均匀分摊,并主动避开前台 I/O 的突发时段。空闲块水位分两档:高于高水位时 GC 完全后台化,可被前台随时抢占;一旦跌破低水位则切换为前台限流,宁可主动降低主机写入的接纳速率,也不让延迟分布整体塌陷。
稳态才是需要关注的工况
新盘上跑不出擦除引起的问题,因为空块充裕、GC 几乎不工作。任何有意义的评估都必须先做足量预处理,把盘写到写放大稳定之后再采数。J770 规划的 600 KIOPS 与 J750 的 300 KIOPS 4KB 随机写都是按稳态定义的,两者的差距很大程度上来自预留空间不同带来的 GC 压力差异,而不是主控算力差异——两款产品的顺序读 7,400 MB/s 与顺序写 5,500 MB/s 完全一致。
