SMB Direct 通常被当成一种自动增强能力来看待,但它能否真正生效,取决于网卡、驱动、操作系统、网络策略和会话协商多个环节是否同时满足。很多环境里网卡面板上标注着 RoCE 或 iWARP,文件复制却仍然走传统 TCP 路径,CPU 占用居高不下。要确认 SMB 是否已经直通 RDMA,不能只靠映射盘符成功与否,而需要逐层检查 RDMA 能力和实际选择状态。

SMB Direct 的硬件与驱动前提
SMB Direct 依赖 SMB 3.x 协议的多通道协商机制。它并不是一个独立的 Windows 功能开关,而是在 SMB 客户端与服务器建立会话时,根据双方网络接口的 RDMA 能力自动尝试升级传输路径。如果条件满足,SMB 连接会绕过传统 TCP/IP 协议栈,将数据直接写入对端内存区域。要走到这一步,首先要求两端网卡都具备 RDMA 能力。当前主流的 RDMA 网络有三类:InfiniBand、RoCE v2 和 iWARP。其中 InfiniBand 原生支持 RDMA,但需要专用交换机和子网管理器;RoCE v2 在以太网上承载 RDMA,通常要求支持 DCB/PFC 的无损以太网;iWARP 则基于 TCP/IP,使用普通以太网交换机即可。
光有网卡还不够,Windows 中的网卡驱动必须切换到支持 RDMA 的模式。不少 25G/40G 网卡出厂驱动默认关闭 NDK 或 RoCE 模式,需要安装厂商提供的完整驱动并用 PowerShell 或厂商工具打开。可以用 Get-NetAdapterRdma 查看适配器的 RDMA 状态。如果输出为空,说明当前系统没有发现任何支持 RDMA 的网络适配器。
Get-NetAdapterRdma | Format-Table Name, InterfaceDescription, RdmaCapable, RdmaStatus
操作系统和协议版本方面,Windows Server 2012 R2 开始完整支持 SMB Direct,但实际生产环境通常建议使用 Windows Server 2016 或更高版本。客户端 Windows 10 企业版、专业工作站版以及 Windows 11 相应版本也可以使用 SMB Direct。SMB 多通道默认开启,但部分安全加固脚本会关闭多通道或 SMB2 协议,需要先确认。
开启配置与网络策略
确认硬件能力后,下一步是保证 SMB 多通道和 SMB 协议开关处于启用状态。默认情况下,Windows Server 不需要额外启用 SMB Direct,因为 SMB 客户端和服务器在建立会话时会自动尝试 RDMA 通道。管理员只需要确保没有通过组策略或 PowerShell 关闭 EnableMultichannel。下面命令可以快速检查服务器和客户端的配置。
Get-SmbServerConfiguration | Select-Object EnableSMB2Protocol, EnableMultichannel Get-SmbClientConfiguration | Select-Object EnableMultichannel
对于 RoCE v2 环境,网络侧的无损配置常常被忽略。RoCE 依赖以太网层不丢包,因此交换机和网卡需要配置 PFC 优先级、ETS 带宽分配,必要时还需要启用 DCB。Windows 端可以通过安装 Data Center Bridging 功能并配置 QoS 策略来配合交换机。很多协商失败的问题都出在交换机队列和优先级不匹配上。iWARP 没有这个要求,这也是它在通用网络中更容易部署的原因。
建立映射后,SMB 多通道可能会同时创建 TCP 和 RDMA 多条路径。正常情况下,如果两张 RDMA 网卡同时在线,SMB 会为每条路径建立独立会话,并自动选择 RDMA。可以通过 Get-SmbMultichannelConnection 看到每一条连接的接口信息以及客户端和服务器的 RDMA 能力与选择状态。
验证 RDMA 会话是否真正生效
验证是否真正走 RDMA,不能只看映射成功或拷贝速度。SMB 连接可能同时具备 RDMA 能力,却因为网络策略或驱动问题回退到 TCP。更有迷惑性的是,某些环境里 RDMA 能力显示为 True,但实际数据传输仍然使用 TCP。最直接的判断命令是查看每个多通道连接中的 ClientRdmaChosen 和 ServerRdmaChosen 字段。只有两端都显示 True,才说明该连接正在使用 RDMA。
Get-SmbMultichannelConnection -ServerName fileserver01 | Select-Object ServerName, ClientInterfaceFriendlyName, ServerInterfaceFriendlyName, ClientRdmaCapable, ServerRdmaCapable, ClientRdmaChosen, ServerRdmaChosen
还可以通过性能计数器进一步确认。运行大文件拷贝任务时,观察网卡吞吐和 CPU 占用。RDMA 直通的典型特征是吞吐接近网卡线速,而 CPU 占用保持在较低水平。如果 25G 网络下拷贝速度只有 1.2GB/s 左右,同时 CPU 核心占用超过 60%,大概率没有走 RDMA。Diskspd 可以生成更稳定的负载,避免 Windows 资源管理器的缓存影响。下面是一个在客户端向共享路径压测的示例,注意路径需要替换为实际共享。
diskspd.exe -c2G -t8 -o32 -b1M -w100 -d60 "C:\Test\testfile.dat"
如果验证结果显示 RDMA Capable 为 True,但 Chosen 为 False,建议从防火墙、IP 子网、VLAN 和路由几个方面排查。SMB Direct 使用 TCP 5445 端口,部分主机防火墙会拦截该端口,导致协商退化。IP 地址不在同一子网或经过路由器时,RDMA 流量可能无法穿透。对于 RoCE,还需要确认交换机 PFC 是否对测试流量生效,因为普通 ping 无法暴露 RDMA 丢包问题。
定位协商失败与性能对比
在真实环境中,最常见的一类问题是网卡显示支持 RDMA,但 SMB 会话从未选择 RDMA。此时建议先运行 Get-NetAdapterRdma 确认网卡 RDMA 是否已经启用,再运行 Get-SmbMultichannelConnection 对比 ClientRdmaCapable 和 ClientRdmaChosen。如果 Capable 为 False,问题在驱动或网卡模式;如果 Capable 为 True 而 Chosen 为 False,问题在网络策略或防火墙。
另一类问题是 RoCE 环境中的交换机配置不一致。某些交换机需要为 PFC 指定优先级 3,而网卡默认使用优先级 5,导致 RDMA 流量被当作普通流量转发,一旦拥塞就出现降速或回退。建议统一网卡和交换机上的 CoS/DSCP 标记,或者在 Windows 中创建 QoS 策略,将 SMB 流量打上固定优先级。对于 iWARP,交换机几乎不需要额外配置,但驱动和 TCP 卸载功能要保持开启。
性能对比方面,可以拿传统 TCP 拷贝和 RDMA 直通分别测试。以 25GbE 网络为例,传统 SMB over TCP 在无 RDMA 时通常能跑到 1.8GB/s 到 2.2GB/s,但 CPU 占用很高;使用 RDMA 后吞吐可以接近 2.8GB/s,CPU 占用明显下降。对于 100GbE 网络,差距会更加悬殊,传统模式很可能在 4-6GB/s 就撞上 CPU 瓶颈,而 RDMA 可以接近线速。注意这些数值受存储、文件大小、客户端内存和交换机影响,不能绝对化,但 CPU 占用是一个可靠的判断依据。