【SPDK 用户态存储】用户态存储全景:从 Reactor 到 NVMe-oF 的坐标系
定位 SPDK 相对内核块层、O_DIRECT+io_uring 与 NVMe 协议百科的生态位;钉住 I/O 路径、线程模型、设备独占、块抽象、远端传输五条坐标系,并给出 16 篇阅读路线。
Linux 内核、存储与网络、可观测性、系统架构与大模型基础设施的工程笔记:机制拆解、踩坑复盘与可核对证据,少空谈。
共 16 篇文章 · 返回首页
定位 SPDK 相对内核块层、O_DIRECT+io_uring 与 NVMe 协议百科的生态位;钉住 I/O 路径、线程模型、设备独占、块抽象、远端传输五条坐标系,并给出 16 篇阅读路线。
钉住 SPDK event framework:每核 reactor、事件队列、poller 轮询与跨核消息;说明 shared-nothing 边界,以及在 reactor 上阻塞等于饿死同核所有工作。
说明 SPDK 运行前 env:大页分配、CPU 绑核语义、setup.sh 将 NVMe 从内核驱动解绑到 VFIO/UIO;钉住设备独占代价与 reset 回退路径。
拆解 SPDK 被动式 NVMe 库:probe/attach、admin 与 I/O qpair、完成轮询与 poll group;说明单线程独占 qpair、零拷贝提交路径及相对内核驱动的边界。
解释为何 SPDK 数据缓冲必须经 DMA 安全分配:物理/IOVA 翻译、PRP 约束、hugepage 与 IOMMU;并说明 mempool 复用、对齐失败模式及零拷贝相对显式拷贝的边界。
把 SPDK bdev 钉成用户态块栈:相对 Linux block 层统一了什么、砍掉了什么;一次 I/O 从提交、多无锁队列排队到完成回调的落点;队列满与 reset 的失败语义。
按后端与虚拟层两类划清 SPDK bdev 模块边界:nvme、aio、malloc、null、raid、lvol 各自保证什么;说明叠层何时伤害延迟与排障,并拒绝做成模块百科。
拆解 SPDK NVMe-oF target:lib/nvmf 中 tgt/subsystem/listener/namespace 与 bdev 的映射;说明 poll group 如何驱动 I/O,以及 app/nvmf_tgt 相对库的角色。
对比 SPDK NVMe-oF 的 RDMA 与 TCP 传输约束;说明默认轮询模型,并依据 v26.01 changelog 与官方 Interrupt Mode 文档钉住低负载 RDMA/TCP 中断驱动模式的适用边界。
对照 SPDK NVMe-oF host 路径与 Linux 内核 nvme-rdma/nvme-tcp initiator;厘清互通边界、bdev_nvme 附着方式,并在无伪造数字前提下说明多路径与 ANA 的谨慎用法。
把 SPDK vhost-user 钉成对 QEMU/VMM 的块后端位置:共享内存与跳过提交通知、vhost-scsi/blk 差异、cpumask 与 hot-attach 边界;不写完整 virtio 规范教程。
拆解 SPDK JSON-RPC 配置面:STARTUP/RUNTIME、framework_start_init、save_config/-c、热插拔与进程重启后哪些状态还在;钉住 rpc.py 与 app 框架,不伪造 RPC 输出。
钉住 bdev_get_iostat 等字段语义与 reset 副作用;说明延迟 ticks/直方图如何读;把官方 Performance Reports 标成硬件绑定的外部方法,从不冒充本机结果。
把 SPDK 常见症状映射到绑盘/环境、reactor CPU、bdev 队列、传输超时、多路径五轴;给出可核对清单与观测入口,不虚构延迟数字与 RPC dump。
从机制对照 SPDK 用户态轮询栈、内核 NVMe 块路径与 O_DIRECT+io_uring;写清共置约束与迁移税,外链 storage/79 与 io_uring 系列,不做跨方案延迟排行。
用机制排除树收束 SPDK 相对内核 NVMe 与 O_DIRECT+io_uring 的选型;回收阅读路径,并列出 ZNS/KV、DPU 卸载、与 Ceph OSD 用户态边界等开放问题;不做延迟排行榜。