土法炼钢 · 系统与基础设施

SPDK / 用户态存储栈:从 Reactor 到 NVMe-oF

文章导航

分类入口
storagelinux
标签入口
#spdk#nvme#nvme-of#bdev#reactor#userspace#vfio#vhost#storage

目录

站内 NVMe 协议 已讲清接口与 NVMe-oF 扩展;O_DIRECT 与 io_uringio_uring 系列 覆盖仍走内核的高 IOPS 提交路径。云块 / 新硬件 提到 DPU 与 NVMe-oF 卸载。中间仍缺一层:驱动与块栈搬进用户态之后,一次 I/O 如何经 reactor → NVMe qpair → bdev →(可选)NVMe-oF/vhost,以及相对内核路径各自保证什么、丢掉什么。

本系列回答:用户态轮询存储栈里,延迟与失败落在哪一层,何时不该离开内核块 I/O。

写:

不写:Ceph/MinIO 全书、DPDK 网卡教程、未实测 IOPS 排行、完整 virtio 规范。对照内核异步见 io_uring;分布式 RADOS 见 distributed/38(非本系列范围)。

系列状态:01–16 已全部发布(2026-08-13)。 规划见 PLAN.md。无直通 NVMe / RDMA 环境则不粘贴伪造 fio 或 RPC 输出。

版本锚定:SPDK v26.01(LTS;官方文档 / 源码 tag v26.01)。非 LTS 特性(如仅出现在 v26.05+)须显式标注。

适合谁看

与 storage/03·79 的分工

维度 storage/03 / 79 本系列
定位 协议演进;内核 Direct+io_uring 组合 16 篇用户态栈机制
深度 规范与内核提交路径 官方文档路径、源码目录、失败模式、开放问题
对照 略述 NVMe-oF / 用户态可能 显式外链 03·79 / io_uring;不重写内核全书

读法:只要「本机数据库盘用不用 O_DIRECT+io_uring」→ 79 足够;要「用户态 target 卡在哪、为何 CPU 空转」→ 本系列 01 → 02 → 04 → 06 → 08 → 14。

一、这个领域最值得关注的 5 个问题

  1. 一次 I/O 的延迟与失败点落在哪一层? → 第 1–7、14 篇。
  2. 用户态独占设备后,运维与共置付出什么? → 第 3、12、14–16 篇。
  3. bdev 相对 Linux block 层统一了什么、砍掉了什么? → 第 6–7 篇。
  4. NVMe-oF 如何把远端命令落到本地 bdev?传输模式差在哪? → 第 8–10 篇。
  5. 何时选 SPDK 而非内核 NVMe / io_uring? → 第 15–16 篇。

二、篇目依赖关系与推荐阅读路径

flowchart TD
  overview["01 Overview"] --> reactor["02 Reactor"]
  reactor --> env["03 Env VFIO"]
  env --> nvme["04 NVMe Driver"]
  nvme --> dma["05 DMA Mempool"]
  dma --> bdev["06 bdev Core"]
  bdev --> modules["07 bdev Modules"]
  modules --> nvmf["08 NVMe-oF Target"]
  nvmf --> xport["09 Transport"]
  xport --> init["10 Initiator"]
  init --> vhost["11 vhost"]
  vhost --> rpc["12 JSON-RPC"]
  rpc --> obs["13 Observability"]
  obs --> trouble["14 Troubleshoot"]
  trouble --> vs["15 vs Kernel"]
  vs --> select["16 Selection"]
  overview --> select
路径 篇目 适合
必读核心 1 → 2 → 4 → 6 → 8 → 14 快速建立坐标系
本机用户态盘 3 → 4 → 5 → 6 → 7 绑盘与 bdev
NVMe-oF 深挖 8 → 9 → 10 → 14 远端块与互通
对照选型 1 → 15 → 16 路径选型
完整通读 1 → … → 16 系统掌握

三、目录与每篇价值点

第一部分:运行时与本地 NVMe(01–06)

  1. 用户态存储全景
    • 相对 03/79/io_uring 的缺口;五条坐标系与 16 篇路线。
  2. Reactor 与线程模型
    • event framework、poller、message passing、I/O 路径无锁边界。
  3. 环境与绑盘
    • hugepage、CPU 亲和、VFIO/UIO、设备独占与回退。
  4. 用户态 NVMe 驱动
    • controller、qpair、poll group;admin vs I/O。
  5. DMA 与 mempool
    • 可 DMA 内存、缓冲池、对齐与零拷贝约束。
  6. bdev 核心
    • 统一块接口、I/O 生命周期、排队与完成。

第二部分:模块、远端与虚拟化(07–12)

  1. bdev 模块边界
    • nvme / aio / malloc / raid / lvol;叠层代价。
  2. NVMe-oF target
    • subsystem、listener、namespace→bdev。
  3. 传输层
    • RDMA / TCP;轮询 vs 26.01 RDMA interrupt mode。
  4. Initiator 与互通
    • SPDK host 与内核 initiator 对接边界。
  5. vhost / virtio 边界
    • 对 VMM 块后端的位置;非完整 virtio 教程。
  6. JSON-RPC 与生命周期
    • 配置面、热插拔、重启与状态边界。

第三部分:观测、排障与收束(13–16)

  1. 可观测与性能口径
    • iostat / trace;官方 performance report 读法。
  2. 排障坐标系
    • 绑盘、空转、队列满、传输超时、多路径。
  3. 对照内核路径
    • SPDK vs 内核 NVMe vs O_DIRECT+io_uring。
  4. 选型收束与开放问题
    • 排除树;ZNS/KV、DPU、与分布式存储用户态栈关系。

四、延伸阅读

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .