【SPDK 用户态存储】NVMe-oF 传输层:RDMA vs TCP,轮询与 v26.01 中断模式
内容提要
本文介绍SPDK NVMe-oF传输层:RDMA与TCP两种传输的机制差异、默认轮询模型及v26.01新增的RDMA中断驱动模式。轮询适合高吞吐,中断模式降低低负载CPU开销。选型需匹配网络与运维能力,中断模式要求所有组件支持事件模型,否则无效。
延伸解读
选型先看网络与运维,再看轮询或中断
文章强调,RDMA 与 TCP 的选择应首先匹配现有网络与运维能力,而非单纯追求性能。RDMA 依赖 RoCE/IB 与 verbs 栈,需处理 MR 上限等限制;TCP 部署简单,但可能牺牲零拷贝。传输选错时,中断模式无法弥补拓扑缺陷。
轮询空转是低负载下的预期成本
SPDK 默认轮询模型在高吞吐下有利,但低负载或空闲时会造成 CPU 空转。若 target CPU 高而网卡 pps 低,应优先怀疑轮询空转,而非 bdev 介质。这是设计取舍,并非异常。
中断模式是全局契约,不是省电开关
v26.01 为 RDMA 新增 interrupt-driven 模式,但需所有组件支持事件模型,否则非 interrupt poller 会迫使继续轮询。开启前应确认传输、poller 等均支持,并用官方方法验证 idle 状态。
混合传输增加排障维度
同一 target 可同时创建 RDMA 与 TCP transport,按 listener 分流。但排障时需先确认连接使用的 trtype,再谈中断或轮询。混合模式下,interrupt 要求两侧组件都支持事件模型,否则一个传输拖住整核。
Q&A
SPDK NVMe-oF 传输层中 RDMA 和 TCP 的主要区别是什么?
RDMA 基于 libibverbs 和 rdmacm,提供零拷贝路径,但需要 RoCE/IB 网络和 verbs 运维,且受 MR 数量限制;TCP 基于套接字,部署简单,兼容普通以太网,但可能涉及额外拷贝。选择取决于网络环境和运维能力。
为什么 SPDK NVMe-oF 默认使用轮询模式?
轮询模式持续检查完成事件,避免中断和上下文切换,适合高队列深度和高 IOPS 的工作负载,但低负载时会导致 CPU 空转。
SPDK v26.01 中 RDMA interrupt-driven 模式是什么?
v26.01 为 NVMe-oF RDMA 传输新增了中断驱动模式,通过 completion channel 和 ibv_req_notify_cq() 实现事件唤醒,降低低负载下的 CPU 开销,同时保留轮询模式供高吞吐场景使用。
如何启用 SPDK NVMe-oF 的中断模式?
使用 nvmf_tgt --interrupt-mode 启动,或通过库 API spdk_interrupt_mode_enable() 启用。需确保所有组件支持中断模式,否则无效。
在什么情况下应该使用中断模式而不是轮询模式?
当负载昼夜差异大、空闲时 CPU 成本敏感时,可评估中断模式;但持续高负载或延迟 SLO 极紧时,轮询模式更合适。
SPDK NVMe-oF 中断模式有哪些限制?
仅支持 Linux;FC 不支持;TCP 的 uring socket 实现不支持,需使用 POSIX socket;所有组件必须支持中断模式,否则会退化为轮询。
如何验证 SPDK NVMe-oF 中断模式是否生效?
使用 framework_get_reactors 或 spdk_top 确认停流量后 reactor 进入 idle 状态。
RDMA 传输在 SPDK 中如何实现零拷贝?
RDMA 路径通过 NIC 直接与主机内存和 SSD 交互,避免主机内存内的二次拷贝,实现零拷贝。