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)
...
如果要强行刷固件,那么就可以加入--allow_psid_change
参数。刷网卡的参照物是同类型的网卡中最强的,比如说我的 CX556M 是 3.0x8 的双口 PCIe 网卡,刷的固件就是 4.0x16 的双口 PCIe 网卡 CX556A
刷之前记得备份固件,部分网卡和 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 内存也算够用呢