如何在香港机房服务器的 Windows Server 上把 SMB Direct 调到“万兆满速”?

凌晨 1:40,香港葵涌机房 17 楼,我蹲在 42U 柜子前,抱着一台刚刚上架的存储节点,指尖还沾着刚撕下理线魔术贴的细屑。客户催的是“万兆要真能打满、延迟要稳”,而我的牌面是:Windows Server + SMB Direct(RDMA)+ 10GbE。下面这篇,就是我那一夜把吞吐从“还行”拉到“真满”的全过程。
拓扑与目标
- 场景:两台 Windows Server 2022 Datacenter(中文 UI),一台做存储(文件服务器 / SOFS 角色),一台做计算(Hyper-V 主机 + 业务)。
- 链路:双口 10GbE SFP+(Mellanox ConnectX-4 Lx,RoCE v2),直连到 ToR 交换机(Arista 7050 系列,DCB/ETS 可配)。
目标:
- SMB Direct(RDMA)稳定启用,单链路跑满 10Gbps(≈1.1–1.2 GB/s);
- 延迟回落到 <150 µs 级别(IO 模式下),碎写不抖;
- 业务期峰值 CPU 降到可接受水平(相比无 RDMA)。
实际硬件与版本(现场清单)
| 角色 | 型号/位置 | CPU / 内存 | 存储 | 网卡 | 固件/驱动 | OS |
|---|---|---|---|---|---|---|
存储节点 HK-FS01 |
2U 机架服务器(Equinix HK2) | 2× Gold 6130 / 256 GB | 4× NVMe(Intel P4510 2 TB)+ 8× SATA SSD(RAID10) | 2× Mellanox ConnectX-4 Lx 10GbE (RoCE v2) | NIC FW 14.2xx / WinOF-2 驱动 2.5x | Windows Server 2022 Datacenter |
计算节点 HK-HV01 |
1U 机架服务器 | 2× Silver 4210R / 192 GB | 本地系统 SSD | 2× Mellanox ConnectX-4 Lx 10GbE (RoCE v2) | 同上 | Windows Server 2022 Datacenter |
| ToR 交换机 | Arista 7050 系列(2×10G 下联) | — | — | — | EOS 4.2x,DCB/ETS 支持 | — |
如果你用 iWARP(如 Chelsio),下文的 PFC/DCB 可以简化很多;RoCE v2 则强烈建议配置 PFC/ETS(或至少端到端无丢包保障),这是能否稳定触发 RDMA 的分水岭。
方案选型与关键点
- SMB Direct = SMB over RDMA:Windows 自带,端口 445,握手成功后会协商 RDMA 通道(RoCE v2 / iWARP / iSER 等),大量数据走网卡 DMA,CPU 压力明显下降。
- 多通道(SMB Multichannel):默认开启,每块 NIC、每个队列都可能形成子通道;不要用 NIC Teaming 去“叠加”带宽,RDMA 场景下 Teaming 容易踩雷,多通道 + 多口独立 IP才是正道。
- RoCE v2:走 UDP,靠 PFC 做无丢包;需要 DCB(PFC/ETS) 参数在交换机与主机两端匹配。
- Jumbo Frame(MTU 9014):减少 CPU 与中断开销,RDMA 下收益依然明显;必须端到端一致。
- RSS/NUMA:让队列分布到多个核心,避免单核瓶颈;Windows 下 RSS + vRSS(若穿过虚拟交换机)要核对。
网络与地址规划(落地参数)
| 项 | 设定 |
|---|---|
| 专用 VLAN | VLAN 130(只承载 SMB/RDMA) |
| IP 规划 | 10.130.10.0/24(存储/计算各 2 口,独立 IP,不做 Team) |
| MTU | 9014(两端 NIC 与交换机端口都改,端到端一致) |
| DCB | 优先级 3 用于 SMB(PFC on),ETS 至少 50% 保底 |
| QoS | 端到端基于 802.1p 优先级标签,必要时映射 DSCP |
Windows 端:一步步把 RDMA 点亮
以下命令除非特别说明,两台主机都做。把你的 RDMA 网卡别名设为 RDMA1/RDMA2 更容易看清。
1) 基础角色/功能与驱动
# 安装文件服务与 DCB
Install-WindowsFeature FS-FileServer -IncludeManagementTools
Install-WindowsFeature Data-Center-Bridging
# 确认 SMB Direct/多通道处于启用状态(默认就是 True)
Get-SmbServerConfiguration | Select EnableSMBDirect, EnableMultiChannel
# 如需显式开启
Set-SmbServerConfiguration -EnableSMBDirect $true -Force
Set-SmbServerConfiguration -EnableMultiChannel $true -Force
驱动/固件:把 Mellanox 驱动(WinOF-2)与固件升级到同一代次,不同步会出现“RDMA True 但速率忽高忽低”的怪相。
2) NIC 基础参数(MTU / 关闭节能)
# 设置 MTU 9014(别名按需修改)
Get-NetAdapter | Where Name -Match "RDMA" | % { Set-NetIPInterface -InterfaceAlias $_.Name -NlMtuBytes 9014 }
# 关闭 EEE(节能),不同厂商键值不一,以下是通用示例:
Get-NetAdapterAdvancedProperty -Name "RDMA*" | ft DisplayName, DisplayValue
# 常见:Energy Efficient Ethernet = Disabled, Interrupt Moderation = On(RDMA 下保持默认即可)
MTU 校验(务必两端都能过):
ping 10.130.10.11 -f -l 8972 # 8972 = 9014 - IP/ICMP 头开销
3) 打开 RDMA & RSS
# 启用 RDMA
Enable-NetAdapterRdma -Name "RDMA1","RDMA2"
Get-NetAdapterRdma | ft Name, Enabled, OperationalStatus, RoceMode
# RSS 绑核(按 CPU 情况微调)
Enable-NetAdapterRss -Name "RDMA1","RDMA2"
Set-NetAdapterRss -Name "RDMA1" -BaseProcessorNumber 0 -MaxProcessors 8
Set-NetAdapterRss -Name "RDMA2" -BaseProcessorNumber 8 -MaxProcessors 8
经验:每口 NIC 8 条 RSS 队列对 10GbE 已足够,关键是打散到不同 NUMA 节点,减少跨 NUMA 拖慢。
4) DCB/QoS(RoCE v2 场景必做)
# DCBX 建议主机设置为不“Willing”,避免被交换机协商改写
Set-NetQosDcbxSetting -Willing $false
# 基于端口 445 的 SMB 优先级策略(802.1p priority = 3)
New-NetQosPolicy -Name "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3 -PolicyStore ActiveStore
# 仅对优先级 3 启用 PFC,其它优先级禁用,避免“全局 Pause 风暴”
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
# ETS:给优先级 3 保留 50% 带宽
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 50 -Algorithm ETS
# 让网卡感知 QoS / 打开 802.1p 打标
Set-NetAdapterQos -Name "RDMA1" -QosAware $true -PriorityTagging $true
Set-NetAdapterQos -Name "RDMA2" -QosAware $true -PriorityTagging $true
# 验证
Get-NetQosFlowControl
Get-NetQosTrafficClass
小贴士:如果你的交换机也开了 DCBX 且“willing”,很可能彼此争夺话语权。把主机设为 not willing最稳。
5) 让 SMB 只走 RDMA 专网(可选但推荐)
# 只允许指定接口去访问指定服务器的多通道(避免走管理网/前端网)
New-SmbMultichannelConstraint -InterfaceAlias "RDMA1","RDMA2" -ServerName "HK-FS01"
Get-SmbMultichannelConstraint
6) 存储端创建共享(禁用缓存/加密以拉满性能)
# 存储节点上
New-Item -ItemType Directory -Path "D:\VMs" -Force | Out-Null
New-SmbShare -Name "VMs" -Path "D:\VMs" -CachingMode None -EncryptData $false -FullAccess "DOMAIN\Domain Admins","DOMAIN\HVAdmins"
# 如果是 SOFS + Hyper-V,建议打开 Continuous Availability(群集场景)
Set-SmbShare -Name "VMs" -ContinuousAvailability $true
安全域可控的专用后端网络,为了纯性能可以关 SMB 加密;跨租户或不可信域,还是要开加密但吞吐会下降。
7) 客户端挂载与通道验证
# 客户端(HK-HV01)
New-PSDrive -Name V -PSProvider FileSystem -Root "\\HK-FS01\VMs" -Persist
# 查看多通道 + RDMA 是否启用
Get-SmbMultichannelConnection | ft ServerName, ClientIP, ServerIP, RDMA, RSS, ClientInterfaceIndex
# 也可以直接看 RDMA 活动
Get-Counter '\RDMA Activity(*)\RDMA Active Connections','\SMB Direct Connection(*)\Inbound Bytes/sec','\SMB Direct Connection(*)\Outbound Bytes/sec' -SampleInterval 1 -MaxSamples 5
交换机侧(以 Arista/Cisco 为例)
只放关键段落,不同平台命令略有差异,核心是 PFC 打开优先级 3 & ETS 保底,并确保上/下行端口一致。
Arista EOS(示意):
dcbx application priority 3
priority-flow-control priority 3 enable
traffic-class map 3 bandwidth 50
interface Ethernet1
mtu 9216
priority-flow-control mode on
priority-flow-control priority 3 enable
spanning-tree portfast
!
interface Ethernet2
mtu 9216
priority-flow-control mode on
priority-flow-control priority 3 enable
spanning-tree portfast
Cisco NX-OS(示意):
system qos
service-policy type network-qos lossless
qos map cos 3 tx-queue 3
policy-map type network-qos lossless
class type network-qos class-default
pause no-drop cos 3
mtu 9216
性能验收:怎么测才靠谱
1) 基线:磁盘能力先量清楚
在存储节点本地跑:
# 顺序读写基线(避免文件系统缓存)
diskspd -c20G -d30 -w0 -t8 -Sh -o32 D:\VMs\baseline.dat
diskspd -c20G -d30 -w100 -t8 -Sh -o32 D:\VMs\baseline_w.dat
目标:本地顺序读写带宽应 ≥ 2–3 GB/s(NVMe + RAID10 轻松到),否则网络再快也没用。
2) 端到端:SMB 读写
在客户端(HK-HV01):
# 顺序读(从共享读)
diskspd -c10G -d30 -w0 -t8 -Sh -o32 V:\rd_test.dat
# 顺序写(写到共享)
diskspd -c10G -d30 -w100 -t8 -Sh -o32 V:\wr_test.dat
# 现实世界复制
robocopy C:\ISO V:\ISO /MT:32 /R:0 /W:0 /NFL /NDL /NP
我那晚的成绩(稳定段落):
| 项目 | 吞吐 | CPU(客户端/服务器) | 备注 |
|---|---|---|---|
| 顺序读 | 1.18 GB/s | 9% / 7% | RDMA 通道 2 条均衡,MTU 9014 |
| 顺序写 | 1.12 GB/s | 11% / 12% | 受存储写入与缓存策略影响 |
| 4K 随机读(o=32,t=8) | 180–220K IOPS | 16% / 15% | 端到端低抖动,99th < 1.2 ms |
关键观察:Get-SmbMultichannelConnection 里 RDMA=True,Get-Counter '\SMB Direct Connection(*)\*' 的 Bytes/sec 明显爬升,同时 \Processor(_Total)\% Processor Time 不会像 TCP 那样飙升。
现场踩坑与解法(我真遇到了)
| 症状 | 根因 | 快速定位 | 解决 |
|---|---|---|---|
RDMA=False,多通道只有 1 条,吞吐卡在 3–4 Gbps |
DCB/PFC 未生效 或 DCBX 被交换机改写 | Get-NetQosFlowControl 显示优先级 3 未启用;交换机端口无 PFC |
主机 Set-NetQosDcbxSetting -Willing $false;交换机端明确开启 PFC/ETS |
ping -f -l 8972 不通 |
MTU 不一致(某一段没改) | 从主机 -> 交换机 -> 对端逐段测 | 两端 NIC/交换机端口统一到 MTU 9216/9014 |
| RDMA 时快时慢,偶现高延迟 | 混杂流量/拥塞 导致丢包,RoCE 恐慌 | 交换机统计里有丢包;BytesIn/Out 抖动大 | 专网 VLAN,ETS 给足 50%+;必要时拆分物理口 |
| CPU 升高但吞吐没上去 | RSS 绑核不合理 / 只有 1 个队列在跑 | Get-NetAdapterRss 看队列 |
Set-NetAdapterRss 调整 Base/Max,分散到不同 NUMA |
| 做了 NIC Teaming 后 RDMA 消失 | 团队不支持 RDMA offload | Get-NetAdapterRdma 显示 Disabled |
拆 Team,用 SMB Multichannel 取代 |
| Hyper-V vSwitch 上的 RDMA 无效 | 绑定到 vSwitch 的口没直出 | Get-SmbServerNetworkInterface 看不到 RDMA 能力 |
RDMA 专口不进 vSwitch;若要 VM 受益,研究 SET + SR-IOV(复杂) |
| 驱动升级后吞吐下降 | 固件/驱动代次不匹配 | mlnx (WinOF-2) 版本对不上 |
驱动与固件成对升级,必要时回退到已知稳定组合 |
| 测试很强,业务偏弱 | 实时杀软/防毒扫描文件 | 业务盘 IO 抖动,CPU 异常 | 测试期间临时排除目录;生产期做细粒度策略 |
一键化脚本(核心配置收敛)
把下段保存为 Enable-SmbDirect10G.ps1,按需改网卡别名与服务器名:
param(
[string[]]$RdmaNics = @("RDMA1","RDMA2"),
[int]$Mtu = 9014,
[string]$ServerName = "HK-FS01"
)
# 1) Features
Install-WindowsFeature FS-FileServer -IncludeManagementTools | Out-Null
Install-WindowsFeature Data-Center-Bridging | Out-Null
Set-SmbServerConfiguration -EnableSMBDirect $true -EnableMultiChannel $true -Force
# 2) MTU / RDMA / RSS
$base = 0
foreach($nic in $RdmaNics){
Set-NetIPInterface -InterfaceAlias $nic -NlMtuBytes $Mtu
Enable-NetAdapterRdma -Name $nic
Enable-NetAdapterRss -Name $nic
Set-NetAdapterRss -Name $nic -BaseProcessorNumber $base -MaxProcessors 8
$base += 8
}
# 3) DCB/QoS
Set-NetQosDcbxSetting -Willing $false
if (-not (Get-NetQosPolicy -Name "SMB" -ErrorAction SilentlyContinue)) {
New-NetQosPolicy -Name "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3 -PolicyStore ActiveStore
}
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
if (-not (Get-NetQosTrafficClass -Name "SMB" -ErrorAction SilentlyContinue)) {
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 50 -Algorithm ETS
}
foreach($nic in $RdmaNics){
Set-NetAdapterQos -Name $nic -QosAware $true -PriorityTagging $true
}
# 4) Multichannel 绑定(限制只走 RDMA 专网)
if (-not (Get-SmbMultichannelConstraint -ErrorAction SilentlyContinue | ? {$_.ServerName -eq $ServerName})) {
New-SmbMultichannelConstraint -InterfaceAlias $RdmaNics -ServerName $ServerName
}
Write-Host "SMB Direct baseline config applied."
Get-SmbMultichannelConnection | ft ServerName, RDMA, ClientIP, ServerIP, RSS
最后 10 分钟:交付前的“熄灯检查”清单
| 检查项 | 命令/动作 | 通过标准 |
|---|---|---|
| RDMA 是否启用 | Get-SmbMultichannelConnection |
RDMA=True,至少 2 条通道 |
| PFC/ETS 是否到位 | Get-NetQosFlowControl / 交换机 show 命令 |
仅优先级 3 启用 PFC,带宽 50%+ |
| MTU 端到端 | ping -f -l 8972 |
不分段成功 |
| RSS/队列分布 | Get-NetAdapterRss |
两口分散到不同 CPU 组 |
| 磁盘基线 | diskspd |
本地 > 网络目标带宽 |
| 实战复制 | robocopy |
吞吐稳定,抖动不大于 ±10% |
| 安全域隔离 | VLAN/ACL | SMB 专网不可被前端/公网访问 |
| 监控项 | PerfMon/采集器 | SMB Direct/CPU/丢包/重传曲线平滑 |
经验延伸与取舍
- 25G/100G 平滑升级:把 MTU/DCB 方案、SMB Multichannel 思路原封不动套上去,换更高速光模块即可。
- 加密与性能:Windows 的 SMB 加密在新 CPU 上也很能打,但想要极致吞吐还是专网 + 关闭加密;合规要求严格的环境请权衡。
- iWARP 的“省心”:不配 PFC 也能跑,很适合不想碰 DCB 的小团队;但在大二层或跨交换网络,拥塞控制策略仍需关注。
- 不要依赖 Teaming:RDMA 与 Teaming 天然合不来;让 SMB Multichannel 和 RSS 干它该干的事。
凌晨 3:05,我把最后一条 Get-SmbMultichannelConnection 输出截了图——两条 RDMA 通道并行,吞吐压在 1.18 GB/s 上下,PerfMon 的曲线像一道平直的光。把工具箱收好,抬头看见对面柜子里的指示灯像城市的窗户。那一刻你会明白,所谓“万兆满速”,不是某个神奇的开关,而是一串细节的串联:固件、驱动、MTU、PFC、RSS、NUMA、磁盘、隔离的专网,还有你在冷通道里反复确认后的那一声“OK”。
如果你也在香港的某个机房里为这 10Gb 的最后 10% 咬牙,不妨按这份手记走一遍。把路修直,带宽自然就流了出来。