SMB Direct - 基于 RDMA 的 SMB3

本文档描述如何设置 Linux SMB 客户端和服务器以使用 RDMA。

概述

Linux SMB 内核客户端支持 SMB Direct,这是一种 SMB3 的传输方案,它使用 RDMA(远程直接内存访问)来提供高吞吐量和低延迟,从而绕过传统的 TCP/IP 协议栈。 Linux SMB 客户端上的 SMB Direct 可以针对 KSMBD(一个内核空间的 SMB 服务器)进行测试。

安装

  • 安装 RDMA 设备。只要内核支持 RDMA 设备驱动程序,它就应该可以工作。这包括软件仿真器(soft RoCE,soft iWARP)和硬件设备(InfiniBand,RoCE,iWARP)。

  • 安装具有 SMB Direct 支持的内核。第一个同时支持客户端和服务器端 SMB Direct 的内核版本是 5.15。因此,需要与内核 5.15 或更高版本兼容的发行版。

  • 安装 cifs-utils,它提供 mount.cifs 命令来挂载 SMB 共享。

  • 配置 RDMA 堆栈

    确保您的内核配置已启用 RDMA 支持。在 Device Drivers -> Infiniband support 下,更新内核配置以启用 Infiniband 支持。

    根据您的硬件,启用相应的 IB HCA 支持或 iWARP 适配器支持。

    如果您使用的是 InfiniBand,请启用 IP-over-InfiniBand 支持。

    对于 soft RDMA,启用 soft iWARP (RDMA _SIW) 或 soft RoCE (RDMA_RXE) 模块。安装 iproute2 包并使用 rdma link add 命令来加载模块并创建 RDMA 接口。

    例如,如果您的本地以太网接口是 eth0,您可以使用

    sudo rdma link add siw0 type siw netdev eth0
    
  • 在内核配置中为服务器和客户端启用 SMB Direct 支持。

    服务器设置

    Network File Systems  --->
        <M> SMB3 server support
            [*] Support for SMB Direct protocol
    

    客户端设置

    Network File Systems  --->
        <M> SMB3 and CIFS support (advanced network filesystem)
            [*] SMB Direct support
    
  • 构建并安装内核。 SMB Direct 支持将在 cifs.ko 和 ksmbd.ko 模块中启用。

设置和用法

  • 按照 KSMBD 文档中所述,设置并启动 KSMBD 服务器。 还要将“server multi channel support = yes”参数添加到 ksmbd.conf 中。

  • 在客户端上,使用 rdma 挂载选项挂载共享以使用 SMB Direct(使用 vers 指定 SMB 版本 3.0 或更高版本)。

    例如

    mount -t cifs //server/share /mnt/point -o vers=3.1.1,rdma
    
  • 要验证挂载是否正在使用 SMB Direct,您可以在挂载后检查 dmesg 中是否有以下日志行

    CIFS: VFS: RDMA transport established
    

    或者,验证 /proc/mounts 中共享的 rdma 挂载选项

    cat /proc/mounts | grep cifs