FDPFlexible Data Placement— 灵活数据放置 什么是 FDPFDPFlexible Data Placement是 NVMe 2.0 引入的最新特性允许主机精确控制数据写入 NAND 的物理位置从而从根本上降低写放大WAF提升 SSD 寿命与性能。 简单说FDP 让主机告诉 SSD “这批数据放一起那批数据放另一边”——SSD 不再需要盲目猜测数据的生命周期。 FDP 解决什么问题回顾 WAF 产生的根源传统 SSD 的困境 主机混合写入热数据 冷数据 → 同一个 Block ↓ 热数据频繁更新 → 该 Block 变脏 ↓ GC 触发搬移冷数据其实根本没必要动它 ↓ WAF 升高 寿命白白消耗 延迟抖动 根本原因SSD 不知道哪些数据生命周期相似 FDP vs 传统方案对比方案主机控制粒度WAF 改善实现复杂度传统 NVMe❌ 无控制基准简单ZNSZone 级粗粒度显著高需重写应用FDPPlacement Handle 级细粒度极显著中等兼容现有接口Multi-streamStream 级已废弃有限中等FDP 是 ZNS 和传统 NVMe 之间的黄金中间路线——改善效果接近 ZNS但对应用改动远小于 ZNS。⚙️ FDP 核心概念1️⃣ Reclaim UnitRU回收单元FDP 将 NAND 空间划分为多个 RU 每个 RU ≈ 一个或多个 NAND Block RU 是 GC 的最小回收单位2️⃣ Placement HandlePH放置句柄主机写入时携带 PH 标签 相同 PH 的数据 → 写入同一批 RU 不同 PH 的数据 → 写入不同 RU物理隔离3️⃣ Reclaim GroupRG回收组多个 RU 组成一个 RG 每个 PH 对应一个 RG 主机通过分配不同 PH 实现数据隔离 FDP 数据隔离示意没有 FDP混合存放 Block A: [热数据1][冷数据1][热数据2][冷数据2] Block B: [热数据3][冷数据3][热数据4][冷数据4] GC时必须搬移冷数据 → WAF 高 ───────────────────────────────────────────── 有 FDP按生命周期隔离 PH0热数据区: [热数据1][热数据2][热数据3][热数据4] PH1冷数据区: [冷数据1][冷数据2][冷数据3][冷数据4] GC时热数据区整块回收冷数据纹丝不动 → WAF≈1 ️ FDP 在数据库中的应用以RocksDB为例最典型的受益者RocksDB LSM-Tree 数据分层 Level 0最热频繁 Compaction → PH 0 Level 1 → PH 1 Level 2 → PH 2 Level 3最冷极少变动 → PH 3 WAL顺序写日志 → PH 4 效果 ├── 不同 Level 数据物理隔离 ├── Compaction 只影响对应 Level 的 RU ├── WAF 从 ~3.0 降至 ~1.2 └── P99 延迟降低 40% FDP 实测效果业界数据指标传统 NVMeFDP 优化后改善幅度WAF2.5 ~ 4.01.1 ~ 1.5↓ 60%SSD 寿命基准↑ 2~3x大幅延长P99 写延迟基准↓ 30~50%显著改善吞吐量稳定性波动较大极稳定明显改善️ FDP 使用示例# 检查设备是否支持 FDPnvme fdp status /dev/nvme0n1# 查看可用的 Placement Handlenvme fdp usage /dev/nvme0n1# 使用 io_uring 携带 FDP 标签写入伪代码struct io_uring_sqe sqe{.opcodeIORING_OP_WRITE, .fdfd, .addrbuf, .lenlen, .offoffset, .ioprioIORING_RECFSUPD_IPI(placement_handle)// 指定 PH};# RocksDB 开启 FDP 支持OPTIONS: use_fdptruefdp_placement_handles[0,1,2,3,4] FDP vs ZNS如何选择选 ZNS 的场景 ├── 应用天然顺序写日志、对象存储 ├── 愿意重写存储层以获得极致 WAF └── 追求最低硬件成本DRAM 用量最少 选 FDP 的场景 ├── 现有应用改动成本高数据库、文件系统 ├── 需要随机写支持 ├── 想快速获得 WAF 改善而不重构系统 └── 生产环境平滑迁移 两者共存 FDP 和 ZNS 并不互斥 未来 SSD 可能同时支持两种模式 按工作负载特性灵活选择 一句话总结FDP 是 SSD 与软件握手的新方式——主机不再把数据随手一扔而是告诉 SSD 每笔数据的归属让 GC 变得精准高效。这是继 ZNS 之后存储软硬件协同优化的又一次重要突破。