Appearance
100G RoCEv2 无损高速网络配置
在现在万兆交换机已经极其便宜的当下,万兆网络已经是屡见不鲜了。甚至如果不要求全万兆,百来块钱就能买一个 4x2.5g + 2x10g 的交换机,40g 的 qsfp 网卡甚至也就几十块钱。但是对于需要正经高速交换机的 RDMA 网络来说,依旧非常麻烦而且费劲

设备选择
目前 Mellanox 家的交换机基本垄断了二手市场,好用低功耗。消费级市场和服务器市场不一样,小体积、静音、低功耗的设备反而有很高的溢价(说的就是你,博通小太阳!)
- 40G:配合原厂模块可以开 56G 的 ETH
- SX6012:12 口 40G 交换机,2000 左右,半宽
- SX6036:36 口 40G 交换机,2000 左右
- 100G
- SN2010:4 口 100G 18 口 25G 交换机,8000 左右,半宽
- SN2100:16 口 100G 交换机,8000 左右
- SN2700:32 口 100G 交换机,6000 左右
- MikroTik CRS 504:4 口 100G 交换机,4000 左右
网卡的选择相对较少,其实也是 Mellanox 家的
- 40G:配合原厂模块可以开 56G 的 ETH
- flr 544+:40G 网卡,没什么好说的,就是要一个转接卡
- 100G
- CX4:3.0 的网卡,太老了,不建议
- CX5:3.0/4.0 的网卡,还算比较新,可以刷成同系列的任意几乎一致的型号(解锁 4.0)。但是不支持 CX6 的免交换机支持 RDMA 特性,当然也没太大所谓
- CX6+:4.0 的网卡,又新又好,但是太热。CX7 是 5.0,这两张卡都没法那么肆无忌惮的刷型号了
至于光模块,作为功耗仙人我优先推荐几乎 0 耗电的 DAC 线缆,然后就是随便买多模的光模块,各家基本都是一个代工水平
其实对于我来说,最简单的就是用 sn2010 一把梭哈,核心和高速交换机都有了。但是一方面是这个交换机要 8000,另一方面是 50W 的功耗我不太满意。因此最终的配置是 CRS504 再加上几张刷成 4.0 模式的 MCX556M 网卡
网络配置
出于耗电量和需求较少的考虑,我选择的是 MikroTik 的 CRS504-4XQ-IN 交换机。但是这玩意其实也是天坑,23 年 1 月份 Server The Home 测试的时候还是没有 RDMA 的,也就 24 年 5 月的时候更新了 PFC 和 ECN 特性,才部分支持了 RoCEV2。写这篇文章的时候有了 7.17beta 版本,算是支持了全功能的 RDMA
MikroTik CRS504-4XQ-IN Review Momentus 4x 100GbE and 25GbE Desktop Switch

MikroTik 的交换机除了低功耗比较戳我以外,其实还有一点就是他家一贯的巧思。这个交换机除了冗余电源供电外还有 POE 供电、DC 供电、直流供电三种方式(当然实际上都是同一个电压,36-57 V)
但是 MikroTik 这个芯片布置其实也很搞笑。就像下图的这个芯片图一样,四个 100G 的端口挂载在Marvell Prestera 98DX4310芯片上,然后有个单核的外挂Qualcomm Atheros QCA9531L 650MHz single-core CPU管理芯片通过千兆网络连接到高速芯片上。但是管理网口依旧只有百兆水平,如果不自量力的调整成路由模式,居然有高达 454Mbps 的转发速度!被群友戏称为傻瓜机上挂了个软漏油

交换机设置
MikroTik 的交换机设置方式非常多,有管理口、新旧管理软件(winbox)和 web 四种主要的方式。但是和东欧 TP-Link 的名头一样,具体交换机的配置比较混乱,各个不一样。好在文档很齐全(巧合的是我的其他设备基本上都是 TP 的)
以下是新旧 WinBox 的对比,毫无疑问比起更接近 xp 年代的旧版,新版在可读性和 UI 上都是遥遥领先的。虽然新版还在 beta 阶段,但是考虑到这个软件没有什么逻辑功能,单纯是 GUI,因此我还是建议使用新版。至于 web 版本,页面基本上和旧版是一致的,就懒得截屏了

然后来谈谈重中之重的交换机具体配置吧,由于我实在是不想为了截个图而重置交换机,因此就简单的做个介绍
首先先重置系统,然后在 quickconfig 中配置成桥接模式。然后升级系统,配置文档里的指令有些是在 7.16 版本才有效的

QSFP 类的端口实质上是四个 sfp 端口黏在一起的,比如说 QSFP 就是四个 10G 的 SFP+黏在一起,100G 的 QSFP28 也是四个 25G 的 SFF28 黏的
然后找到 interface 界面,在这里你能看到一个非常奇怪的结构,这个四口交换机居然显示了 16 个端口。东欧 TP-Link 在这里的配置非常的奇怪,居然把端口拆散了分开配置。对于交换机上的第 x 个物理端口而言,只需要配置 qsfp-x-1 就行了,如果想要拆分,则需要配置每一个端口

剩下的其实我也不太懂,也没什么好说的,翻一翻官网的配置指南,然后找一下 offload 相关的字眼,然后全打开就行
而 RDMA 的配置才是重点,和官方只有命令行的配置不同,其实在 GUI 的 Switch -> Qos 里也可以图形化配置。但是毫无疑问的,命令行的使用其实更直白一点。后文基本都是按照命令行的配置来讲解
参考文档:建议都读一遍,这样就心里有数了
bash
# 一个典型的命令如下,先切换到对应的目录下,然后按tab键看有哪些功能,最后执行
[admin@MikroTik] /interface/ethernet/switch/qos> /interface/ethernet/switch/qos/
map port priority-flow-control profile settings tx-manager export monitor
[admin@MikroTik] /interface/ethernet/switch/qos> monitor
total-packet-cap: 32 768
total-packet-use: 0
total-byte-cap: 8.0MiB
total-byte-use: 0
multicast-packet-cap: 3 276
multicast-packet-use: 0
multicast-byte-cap: 819.0KiB
multicast-byte-use: 0
shared-pool0-packet-cap: 10 240
shared-pool0-packet-use: 0
shared-pool0-byte-cap: 2560.0KiB
shared-pool0-byte-use: 0
wred-packet-cap: 4 096
wred-byte-cap: 1024.0KiB
wred-shared-pool-packet-cap: 2 048
wred-shared-pool-byte-cap: 512.0KiB具体的 RDMA 的配置我参照了官方的配置文件做了一些调整和讲解。---符号下面的是 print 的输出
注意!
这是按照 CRS504 调整后的语句,其他型号必须参考 MikroTik 的官网说明进行调整
配置 tx-manager 的队列优先级
这一步和官网不一样的是 CRS504 没法设置每个队列的 显式拥塞通知(ECN) 开关,所以我们设置 tx-manager 的默认配置的 ECN 为 yes。ECN 要求使用共享缓冲区,应该是默认打开的
bash
/interface ethernet switch qos tx-manager
set queue-buffers=auto ecn=yes numbers=0
print
---
Flags: H - HW-OFFLOADED
Columns: NAME, QUEUE-BUFFERS, ECN
# NAME QUEUE-BUFFERS ECN
0 H default auto yes
;;; Use this for permanently disconnected ports
1 H offline auto no然后给队列 3 配置流量优先级,简言之就是一把梭哈第三级就行,还能开增强传输选择 (ETS)
传统优先级队列是低优先级死等高优先级的队列,ETS 宽松了一点,不是严格优先级设置的都可以加权传输,可以降低时延
bash
/interface ethernet switch qos tx-manager queue
set 3 schedule=high-priority-group use-shared-buffers=yes
print
---
Flags: I - INACTIVE, H - HW-OFFLOADED
Columns: TX-MANAGER, TRAFFIC-CLASS, SCHEDULE, WEIGHT, QUEUE-BUFFERS, USE-SHARED-BUFFERS, WRED-ACTUAL, ECN-ACTUAL
# TX-MANAGER TRAFFIC-CLASS SCHEDULE WEIGHT QUEUE-BUFFERS USE-SHARED-BUFFERS WRED-ACTUAL ECN-ACTUAL
0 I default 0 low-priority-group 1 auto yes no no
1 H default 1 low-priority-group 2 auto yes yes yes
2 I default 2 low-priority-group 3 auto yes no no
3 H default 3 high-priority-group 3 auto yes yes yes
4 I default 4 high-priority-group 4 auto yes no no
5 I default 5 high-priority-group 5 auto yes no no
6 I default 6 strict-priority auto yes no no
7 I default 7 strict-priority auto yes no no添加 QoS 配置文件
流量优先级可以参考官方中的内容,记住这里 traffic-class 设置的是第三级
bash
/interface ethernet switch qos profile
add name=roce-profile traffic-class=3
print
---
Flags: H - HW-OFFLOADED
Columns: NAME, PCP, DSCP, TRAFFIC-CLASS
# NAME PCP DSCP TRAFFIC-CLASS
0 H default 0 0 1
1 H roce-profile 0 0 3添加 PFC 配置文件
这一步用到了之前设计的队列 3,新建一个配置文件
bash
/interface ethernet switch qos priority-flow-control
add name=roce-pfc tx=yes rx=yes traffic-class=3
print
---
Flags: H - HW-OFFLOADED
Columns: NAME, TRAFFIC-CLASS, RX, TX, PAUSE-THRESHOLD, RESUME-THRESHOLD
# NAME TRAFFIC-CLASS RX TX PAUSE-THRESHOLD RESUME-THRESHOLD
0 H disabled no no
1 H roce-pfc 3 yes yes auto auto对端口应用配置文件
记得按照自己机器的端口进行修改
bash
/interface ethernet switch qos port
set qsfp28-1-1 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-1-2 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-1-3 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-1-4 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-2-1 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-2-2 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-2-3 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-2-4 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-3-1 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-3-2 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-3-3 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-3-4 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-4-1 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-4-2 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-4-3 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
set qsfp28-4-4 egress-rate-queue3=100.0Gbps pfc=roce-pfc profile=roce-profile trust-l3=keep
print
---
Flags: R - RUNNING
Columns: NAME, SWITCH, PROFILE, MAP, TRUST-L2, TRUST-L3, TX-MANAGER, PFC
# NAME SWITCH PROFILE MAP TRUST-L2 TRUST-L3 TX-MANAGER PFC
0 R ether1 switch2
1 R qsfp28-1-1 switch1 roce-profile default ignore ignore default roce-pfc
2 qsfp28-1-2 switch1 roce-profile default ignore ignore default roce-pfc
3 qsfp28-1-3 switch1 roce-profile default ignore ignore default roce-pfc
4 qsfp28-1-4 switch1 roce-profile default ignore ignore default roce-pfc
5 R qsfp28-2-1 switch1 roce-profile default ignore ignore default roce-pfc
6 qsfp28-2-2 switch1 roce-profile default ignore ignore default roce-pfc
7 qsfp28-2-3 switch1 roce-profile default ignore ignore default roce-pfc
8 qsfp28-2-4 switch1 roce-profile default ignore ignore default roce-pfc
9 R qsfp28-3-1 switch1 roce-profile default ignore ignore default roce-pfc
10 qsfp28-3-2 switch1 roce-profile default ignore ignore default roce-pfc
11 qsfp28-3-3 switch1 roce-profile default ignore ignore default roce-pfc
12 qsfp28-3-4 switch1 roce-profile default ignore ignore default roce-pfc
13 R qsfp28-4-1 switch1 roce-profile default ignore ignore default roce-pfc
14 qsfp28-4-2 switch1 roce-profile default ignore ignore default roce-pfc
15 qsfp28-4-3 switch1 roce-profile default ignore ignore default roce-pfc
16 qsfp28-4-4 switch1 roce-profile default ignore ignore default roce-pfc
17 switch1-cpu switch1 default default ignore ignore default
18 switch2-cpu switch2优化配置
7.17 终于可以启用 LLDP 数据中心桥接功能交换协议 (DCBX)了,貌似 Vmware 必须有这个才能启用 RDMA
bash
# 启用硬件卸载
/interface ethernet switch
set switch1 qos-hw-offloading=yes
# 启用LLDP 数据中心桥接功能交换协议 (DCBX)了
/ip neighbor discovery-settings
set lldp-dcbx=yes
# 增大MTU加强性能
/interface ethernet
set [find switch=switch1] l2mtu=9500最后在 winbox 的 Switch-QoS 页面里也能看到在命令行里修改好的配置了

网卡设置
我是按照使用物理 CX5 网卡 + windows 环境下配置的。linux 和 sriov 的自行寻找教程吧
- Mellanox 网卡工具: Overview
- Mellanox 网卡固件: Firmware Download
- 驱动:
- Linux:MLNX_OFED
- Windows:CX3 是 WinOF,CX4 之后的都是 WinOF-2
- 管理工具:MFT
- 固件下载:https://network.nvidia.com/support/firmware/firmware-downloads/
配置并升级网卡
首先安装管理工具,linux 下记得mst start启动服务,win 下用管理员权限启动终端
powershell
# 查看网卡id
PS C:\Users\hqshi> mst status
MST devices:
------------
mt4121_pciconf0
# 查看网卡配置,输出略有删改。如果是IB模式、没开SRIOV或者是杂七杂八的百度一下,然后设置完重启就行
PS C:\Users\hqshi> mlxconfig -d mt4121_pciconf0 query
Device #1:
----------
Device type: ConnectX5
Name: MCX556A-EDA_Ax_Bx
Description: ConnectX-5 Ex VPI adapter card; EDR IB (100Gb/s) and 100GbE; dual-port QSFP28; PCIe4.0 x16; tall bracket; ROHS R6
Device: mt4121_pciconf0
Configurations: Next Boot
NUM_OF_VFS 16
NUM_OF_PF 2
SRIOV_EN True(1)
NUM_PF_MSIX 63
NUM_VF_MSIX 11
LINK_TYPE_P1 ETH(2)
LINK_TYPE_P2 ETH(2)
...powershell
# 配置 ETH 模式
mlxconfig -d mt4121_pciconf0 set LINK_TYPE_P1=2
mlxconfig -d mt4121_pciconf0 set LINK_TYPE_P2=2如果要强行刷固件,那么就可以加入--allow_psid_change参数。刷网卡的参照物是同类型的网卡中最强的,比如说我的 CX556M 是 3.0x8 的双口 100G PCIe 网卡,需要的网卡是 4.0 的双口 100G,刷的固件就是 4.0x16 的双口 PCIe 网卡 MCX556A-EDAT
先在观望看一下你需要什么类型的卡,ETH 还是 IB,特性对不对的上。Networking Adapters
刷之前记得备份固件,部分网卡和 OEM 版本的网卡可能无法互刷.刷炸了就短接安全模式阵脚JP2然后刷新原本的固件
powershell
flint --allow_psid_change -d mt4121_pciconf0 -i path\to\bin burn
配置操作系统
和两张网卡直插就能用的 RoCE 不同,只有 WinServer 能够最好的支持 RDMA 所有功能,不过好在除了家庭版外,普通的 Windows 也能能享受到一些最新的特性,比如说 ISER。和网传的不一样,除了家庭版的 windows 外,其他的都可以开 RDMA
参考来源
作者:总想搞点奇怪的 出处:bilibili > RDMA Supported Versions of Windows 10/11
在设备管理器-网络适配器中选择你的网卡,然后点开高级。两个端口都这么设置
- NetworkDirect Functionality 设置为 Enable
- NetworkDirect Technology 设置为 iWARP/RoCEv2
然后搜索“启用或关闭 windows 功能”,开启数据中心桥接功能。非 winserver 无法通过Install-WindowsFeature安装 DCBX

然后在有管理员权限的 powershell 中执行命令
powershell
# 启用ECN(Server版默认开启)(iWARP不需要)
netsh int tcp set global ecncapability=enabled
# 强制使用SMB3.1.1
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" -Name "MinSMB2Dialect" -Value 0x000000311
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" -Name "MaxSMB2Dialect" -Value 0x000000311
# 启用SMBDirect
Enable-WindowsOptionalFeature -Online -FeatureName SMBDirect
# 启用SMB MultiChannel
Set-SmbServerConfiguration -EnableMultiChannel $true
Set-SmbClientConfiguration -EnableMultiChannel $true
# 强制将单端口2条RDMA会话(默认)改为4条
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" ConnectionCountPerRdmaNetworkInterface -Type DWORD -Value 4 –Force
# 网卡启用SMB Direct
Set-NetOffloadGlobalSetting -NetworkDirect Enabled
# 配置DCBX(PFC和ETS)(iWARP不需要)
# 非winserver用之前提到的方法安装,需要重启
Install-WindowsFeature -Name Data-Center-Bridging -IncludeManagementTools
New-NetQoSPolicy "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3
# 小细节,优先级和之前配置的一致
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 60 -Algorithm ETS
Set-NetQosDcbxSetting -Willing $True
Enable-NetAdapterQos -Name "你的网卡名"
#允许SMB Direct跨越三层
Set-NetOffloadGlobalSetting -NetworkDirectAcrossIPSubnets Allow
#验证
Get-WindowsOptionalFeature -Online -FeatureName SMBDirect
Get-SmbServerNetworkInterface
Get-SmbClientNetworkInterface
Get-NetAdapterRDMA
Get-NetOffloadGlobalSetting
Get-IntelEthernetDCBStatus
netstat.exe -xan | ? {$_ -match "445"}验证效果
可以看到是激活 RDMA 了,传输的时候没有看到有网卡流量。但是不知道为什么,最大的速度也没有超过 20Gbps,可能是因为对端的磁盘经过虚拟机过了一手导致的性能下降?

后来发现原来是 pcie 转接卡的质量有问题,握手到 PCIe1.1x8 了。之前就因为拆分卡的问题而折腾过很多次,没开 SR-IOV 的时候还以为是单纯正常的省电模式
在更换了一个新的拆分卡,又用经典工具橡皮擦清理了一下网卡的金手指。神奇的事情发生了!内部测速直接跑到了 64Gbps 左右,这个应该是因为 7700 基本被跑满的限制。在未经过任何调优的情况下,CDM 跑测试的带宽直接就有 93Gbps
设备状态监测
顺带教一手如何判断设备的状态,实际上装上网卡的时候就需要进行这一步的测试,查看网卡的实际型号和连接状态
bash
# 查看能不能认到设备
lspci -nn
...
00:18.7 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Device [1022:14e7]
# 注意这一行,告诉你了设备的信息,接近与windows的设备管理器功能。15b3:1019 就是设备编码
01:00.0 Ethernet controller [0200]: Mellanox Technologies MT28800 Family [ConnectX-5 Ex] [15b3:1019]
02:00.0 Non-Volatile memory controller [0108]: Micron Technology Inc 7450 PRO NVMe SSD [1344:51c3] (rev 01)
...
lspci -vvv -d 设备编码
...
01:00.0 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
Subsystem: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
...
# 这个就是带宽了,16GT/s就是4.0的速度,Width就是PCIe位宽,当然直接乘算就完事了
LnkCap: Port #0, Speed 16GT/s, Width x8, ASPM not supported
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 16GT/s, Width x8
TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
...
# 看看握手状态正不正常
dmesg |grep mlx5
[ 3.253787] mlx5_core 0000:01:00.0: enabling device (0000 -> 0002)
[ 3.254050] mlx5_core 0000:01:00.0: firmware version: 16.35.4030
[ 3.254096] mlx5_core 0000:01:00.0: 126.024 Gb/s available PCIe bandwidth (16.0 GT/s PCIe x8 link)
[ 3.656728] mlx5_core 0000:01:00.0: Rate limit: 127 rates are supported, range: 0Mbps to 97656Mbps
[ 3.656975] mlx5_core 0000:01:00.0: E-Switch: Total vports 18, per vport: max uc(128) max mc(2048)
[ 3.661861] mlx5_core 0000:01:00.0: Port module event: module 0, Cable unplugged
[ 3.662139] mlx5_core 0000:01:00.0: mlx5_pcie_event:304:(pid 331): PCIe slot advertised sufficient power
...
[ 4.475315] mlx5_core 0000:01:00.1: MLX5E: StrdRq(1) RqSz(8) StrdSz(2048) RxCqeCmprss(0 basic)
[ 4.490306] mlx5_core 0000:01:00.1 enp1s0f1np1: renamed from eth1
[ 4.506301] mlx5_core 0000:01:00.0 enp1s0f0np0: renamed from eth0性能评估
目前家里的网络流量主要有三个流向,外部南北流向(过外网)、内部南北流向(走 RDMA 交换机)、内部东西流向(内部 SR-IOV)。由于外网经过测试,即使是全万兆的情况下,运营商 2000/100 的套餐的余量也就是 2500/120 左右,实在是没什么好讲的。因此接下来主要研究内网交换
内网有三台机器接入了 100G 的高速网络,除了华为的 SP380 没法刷固件外,其他的都刷了 CX556A 的固件,解锁了 4.0 速率
- NAS:HyperVistor,开了不少虚拟机且充当 NAS
- CPU:7700
- 网卡:CX556M,4.0x8
- 存储
- 日用:2xCD6 + 6xHC550 组镜像加速奇偶校验。U2 和 HBA 都是挂在南桥
- 测速:2x9A3,Raid0 后格式化成 ReFS,和网卡一起在 PCIE_1 槽,拆分 CPU 直连 x16 带宽为 844
- PC:主要的远程测速节点,主力机。win 都是统一 23h2
- CPU:13900KS
- 网卡:CX516,4.0x16
- 存储:普普通通 P5800X
- Node:来凑数的,有很多 Docker 服务
- CPU:i5-9300H
- 网卡:SP350,3.0x16
目前内网主要有几条数据转发路径,这里 PF 指物理网卡,VF 指给虚拟机用的虚拟网卡
- 高速访问:物理机的 PF 通过 CRS504 访问虚拟机的 PF
- 虚拟机互访:虚拟机的 VF 通过 PF 进行 SR-IOV 互访
- 内网访问:其他设备访问高速交换机下的 PF 或 VF
由于考虑到存在不少 Windows 设备且存在必须在 Windows 下运行的程序(比如 Windows Admin Center),因此内网文件服务器用的是 Winserver2022,通过存储池组阵列。虽然我不喜欢 WinServer 的需要重启进行更新和臃肿,实际上不能小瞧使用最广泛的系统。Win 下的 SMB 的 RDMA 基本开箱既用,而且奇偶校验阵列性能也有条带写的支撑(需要命令行配置)
因此本地主要探究 SMB Direct 在三条转发路径下的区别。ISER 和 Iperf 都有一些其他因素限制了,比如说 server2025 才支持当 NVMeof,而且只是 tcp,rdma 的还要一段时间,Iperf 测速 7700 的 cpu 限制了只能跑 80Gbps 左右(iperf3 零拷贝多进程叠加,iperf -P 开销还是大)
假如不考虑虚拟网卡和物理网卡的区别,则文件的主要访问路径为 NAS 为服务端,win 和 linux 下访问 NAS 的 iscsi(块设备)和 smb(文件共享)
缩写参考
- RDMA(Remote Direct Memory Access):远程直接内存访问,和其他高性能框架一样,通过用户态驱动减少对内核的直接调用,大幅降低内核切换和内存拷贝的开销。有 Infiniband,ROCE,iWARP 传输方式
- RoCE(RDMA over Converged Ethernet):基于融合以太网的 RDMA,v1 基本就是把 Infiniband 塞到 IP 上,v2 则是用 UDP 进行改进,可以跨越交换机了
- SMB Direct(又称 SMB over RDMA):支持 RDMA 的 SMB
- iSER(iSCSI Extensions for RDMA):用于 RDMA 的 iSCSI 扩展,相当于支持了 RDMA 的 iSCSI
Windows 客户端
考虑到 win 本身就幽默的磁盘性能以及应该没人正经研究 FIO 的性能,因此主要测试 CDM 和文件管理器的跑分。CDM 统一 8.0.4,文件则是生成了个 100G 的随机二进制文件。通过文件管理器分别拖到 P5800X 和 CD6 里
bashdd if=/dev/random of=/mnt/fast/100G.bin bs=1M count=102400 107374182400 bytes (107 GB, 100 GiB) copied, 178.619 s, 601 MB/s
由于 Windows 本来就对 SMB Direct 的支持非常好,因此想要开起来 SMB 基本没有任何压力。速度也完全没问题
左上:交换机网速记录,右上:本地阵列测试 左下:主力机远程访问,右下:内部 SR-IOV

看起来任务管理器单个文件传输的带宽在 5G 左右,总的带宽在 8G 左右。win 的任务管理器见过 40G+的写入,关掉任务管理器应该还能提升。值得注意的是当向远端写入速度达到 5G 之后发现远端使用内存做缓存,但是不会持续吃满
有趣是傲腾虽然存在读写速度不稳定的情况,但是依然比一条直线的 CD6 快。不知道是傲腾的问题还是 RDMA 的问题
命名说明:Fast:通过 SMB 挂载的阵列,桌面:P5800X,下载:CD6


特别说明
目前只有 winserver2025 支持 nvmeof,但是又不是正式版,所以先不进行测试了
但是测试了一下发现了一个很有意思的事情,目前 winserver 并没有原生支持 nvmeof 和 iser。所以直连的速度堪称搞笑

注:2025-11-01 ws2025 正式发布了。使用 server2025 进行简单测试后发现 4k 随机性能略有提升,磁盘统一都是 ReFS

Linux 客户端
警告
目前 Mellanox 的驱动会禁用 CIFS 模块,因此只需要使用内核驱动
从纯理论上说,linux 客户端下的配置非常的简单,内核 CIFS 模块默认支持 rdma,只要小小的加上rdma这个参数就行。但是实际上配置支持 RDMA 内核的 linux 实在是费劲,其中的波折实在是难以用言语形容
虽然 6.x 内核内核很好的支持了 smbdirect,但是就我验证的结果来看,debian(6.1)和 ubuntu(6.8)的内核配置中并没有默认打开这个选项
bash
# 如果启用的话会提示`CONFIG_CIFS_SMB_DIRECT=y`
cat /boot/config-`uname -r` |grep CONFIG_CIFS_SMB_DIRECT
# CONFIG_CIFS_SMB_DIRECT is not set这里使用 debian 官方提供的 cloud-init 镜像为例,演示如何编译内核。源码时直接偷懒用系统内的 debian 官方提供的同款源码和工具,当然直接下载 kernel 源码也不影响。我这个测试镜像分配了 16c16g 的资源,7700 大概编译了 25 分钟
bash
apt install -y --fix-missing linux-source
apt install -y git lz4 build-essential libncurses-dev bison flex libssl-dev
cd /usr/src
tar -xvf linux-source-6.1.tar.xz
cd linux-source-6.1
cp /boot/config-`uname -r` .config # 复制当前配置文件
nano .config # 修改配置文件或者参考下面的
make olddefconfig # 更新配置文件,新设置为默认设置
scripts/config --set-val CONFIG_SYSTEM_TRUSTED_KEYRING n
scripts/config --set-val CONFIG_MODULE_SIG n
scripts/config --set-val CONFIG_MODULE_SIG_KEY '""'
scripts/config --set-val CONFIG_SYSTEM_TRUSTED_KEYS '""'
scripts/config --set-val CONFIG_BUILD_SALT '""'
scripts/config --disable MODULE_SIG_ALL
scripts/config --disable CONFIG_DEBUG_INFO_BTF
scripts/config --enable CONFIG_CIFS_SMB_DIRECT
make bindeb-pkg -j`nproc` # 编译完成后记得重新运行一次,看看有没有报错漏看了
# 编译好的deb包一般在上级目录,安装后重启
#make modules_install
#make install
apt install cifs-utils -y # 不用这玩意,命令行的有些命令会报错...
# 挂载smbdirect,失败了就看看dmesg的报错
mount -t cifs //10.0.1.100/fast /mnt/fast -o credentials=/root/.smbcredentials,vers=3.1.1,rdma,multichannel,max_channels=4看上去很简单?如果你被不同镜像、网卡驱动和编译内核中的一堆问题反复折磨你就不觉得简单了,尤其是编译完发现内核刚刚 EOL 了。正在准备重装内网设备的系统,还得研究如何自动化配置
性能分析
这里做一个有意思的测试。使用 fio 参照 CDM 的测试内容测试本地盘以及 win 和 linux 下 SMB 挂载的差距有多大
以 CDM 常测的 NVMe 4K 多线程写入为例,参数是RND4K-Q32T16 对应到 fio 就是随机写入4K块大小-32队列深度16并行。命令如下,本次测试只会切换最后四个选项,最大写入 size 为 256g。每次先运行 15 秒预热,然后取 60 秒稳态数据,测试后等待 60 秒。引擎分别为 windowsaio 和 libaio
bash
fio -filename=/mnt/fast/test -group_reporting -name=test -direct=1 -thread -ioengine=libaio -ramp_time=15 -runtime=60 -size=1024g -rw=randwrite -bs=4k -iodepth=32 -numjobs=16注意,单位不是 MB,而是统一换算 MiB
毫无疑问,即使是有着 RDMA 的加持,SMB 比起本地访问还是大打折扣的。在此基础上单核越高越强,win 的性能比 linux 强
在测试结果中,iops 最高的毫无疑问是 4k 多队列读取。在 cdm 下有 660K 的 iops,但是用 fio 测试就只有 430K 了。但是使用 sriov 的话 win 也只有 169K 的 iops,linux 更是腰斩,77K。不过 139KS 过交换机的远程访问倒是靠着大力飞砖挽回了颜面,即使是在负优化的 12b bios 下也有 364K 的惊人 IOPS
当然,和 450MiB/s 的普通 SMB 比起来,这个速度简直就是遥遥领先
| 条目(MiB/s) | win-cdm | win-local | win-sriov | linux-sriov | win-remote |
|---|---|---|---|---|---|
| (读)SEQ1M-Q8T1 | 13244 | 12900 | 9562 | 10300 | 8860 |
| (写)SEQ1M-Q8T1 | 7903 | 5041 | 7563 | 5647 | 7822 |
| (读)SEQ1M-Q1T1 | 4652 | 4602 | 2314 | 2527 | 2418 |
| (写)SEQ1M-Q1T1 | 6320 | 5493 | 2242 | 1999 | 2470 |
| (读)SEQ128K-Q32T1 | 11045 | 9889 | 5903 | 5757 | 9122 |
| (写)SEQ128K-Q32T1 | 7718 | 1668? | 5560 | 4894 | 7733 |
| (读)RND4K-Q32T16 | 2603 | 1683 | 662 | 301 | 1425 |
| (写)RND4K-Q32T16 | 1662 | 1223 | 602 | 266 | 1244 |
| (读)RND4K-Q32T1 | 524 | 410 | 178 | 181 | 690 |
| (写)RND4K-Q32T1 | 325 | 245 | 208 | 182 | 710 |
| (读)RND4K-Q1T1 | 51 | 50 | 25 | 28 | 28 |
| (写)RND4K-Q1T1 | 173 | 88 | 30 | 32 | 32 |
在闲得无聊,空等测试结果的时候顺带看了下 webui 的数据,这个 108gbps 我还能理解,136gbps 就纯纯逆天了


总结
从 9 月底折腾到 10 月底,这倒霉催的 RDMA 终于是基本配置好了,期间踩了不知道多少坑!受限于时间和平台,很多更进一步的内容没法继续测试。比如说计划 ces 后更换性能更强的 9950x3d,win server 2025 正式发布后测试 nvmeof 加持的 iscsi 和更强的 refs。不过至少现在这些已经基本够用了
实际上由于 SR-IOV 算直通,分给虚拟机的内存基本无法回收,内存占用大幅提升。如果把大部分的内存塞进去就真要塞爆 192g 内存了,年初的时候还在考虑压一压需求 96g 内存也算够用呢
