https://lwn.net/Articles/723070/

关于 SMC-R, 读者可以自行阅读 https://tools.ietf.org/html/rfc7609 或者参考 4.11 内核的相关实现。 本质上通过内核层面标准的 socket 接口来实现 tcp/rdma 在传输层层面的融合,并实现自动的软件 failover 功能(不考虑 RoCE lag 之类的 hw/fw 实现)。

主要特点:

  1. socket 语义的兼容性, 兼容 SSL

  2. 应用不用关心底层传输层协议以及切换

  3. 几乎 bypass 协议栈,但是保留 socket 层

  4. 无法很好的支持 zero copy

  5. 软件 failover 协议定义完整,可以跨硬件(不同厂商的硬件),可以支持多网卡 (这点 RoCE lag 是不行的)

  6. IBM 已经产品化

  7. 协议标准化

注:我认为不能 zero copy 是个很大的问题,兼容 socket 语义直接在 userspace 层面也是可以做的,可以全面的 bypass 协议栈,当然 SMC-R 的实现也不是一定在内核态,协议可以全部实现在用户态,SMC-R 对于RDMA 的实现对于兼容 socket 以及 软件 failover 层面的定义不错。但未必是基于性能最大化的考虑,从已经产品化和标准化的角度,总体来说是有参考意义的。

我个人不认为这本质上是一个技术问题,主要是 linux-rdma 阵营和 netdev 阵营的协调性的问题,文章中也提到了 这个 patch 被 merge 进入 4.11 根本没有经过 linux-rdma 相关邮件列表以及 maintainer 的首肯,D.M. 直接就给合并了,导致一定的争论,netdev 的邮件列表,rdma 的相关开发人员也没有特别关注到这个,总之是步调不太一致了。对于我们来说,我们不管他们各自出于什么目的,知道什么是你需要的,各自的优缺点更重要,把它们根据自己的业务需要融合到自己的产品里,而不是是否该进 mainline ,很多好的 patch 也未必都是被社区接受的,还有些 committer 根本不关心这个。