上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-09-06 09:27 阅读量:997


凌晨 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% 咬牙,不妨按这份手记走一遍。把路修直,带宽自然就流了出来。

目录结构
全文