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

如何在香港服务器的 Windows Server 2019 中,用 SMB 多通道把 CDN 边缘节点同步“拧到满档”

发布人:Minchunlin 发布时间:2025-09-08 10:11 阅读量:768


凌晨 2:10,我在葵涌机房的走道里坐着,背后是还没完全散去的冷风。刚把一批新包推完,东京和新加坡两个边缘节点的同步又慢了半拍。值班群里有人问:“是不是又卡在单链路 SMB 上了?”——我盯着那台作为 CDN Origin 的 Windows Server 2019,心里有数:如果今晚把SMB Multichannel(SMB 多通道)SMB Direct(RDMA)调顺,一次就能把这件事结干净。下面是我那一夜从机柜前“撸到天亮”的完整过程与复盘。写给需要 既能看懂、又能照着做 的你。

目标与场景

目标:在 Windows Server 2019 的 Origin/HUB 节点上启用并正确利用 SMB 多通道(可选结合 SMB Direct/RDMA),把多个边缘节点的资源同步(大文件、海量小文件、增量更新)提升到“链路和磁盘都吃满,CPU 不爆”的状态;同时保证可观测、可回滚、可自动化。

典型拓扑(我现场的部署):

  • Origin(HK-ORIGIN):香港本地机房,做打包、签名、归档与主分发。
  • Regional Hub(HK-HUB):与 Origin 同城同 DC,用于接边缘回源与跨区域复制缓冲。
  • Edges:TYO-EDGE(东京)、SIN-EDGE(新加坡)、SEL-EDGE(首尔)等。

我们对外的 WAN 走专线 + 互联网混合路由,内部(Origin ↔ Hub)是 25GbE L2/L3,跨区到边缘节点一般是 1–10Gbps 的可变带宽、30–60ms RTT。SMB 多通道能在多网卡、多队列(RSS)、多路径里自动并发,把一条“粗水管”变多股水流。

硬件与软件基线(实配参数)

角色 CPU 内存 系统盘 数据盘 网卡 交换机/链路 OS/功能
HK-ORIGIN AMD EPYC 7402P(24C) 256GB 2× SATA SSD (RAID1) 4× U.2 NVMe Intel P4510 4TB(Storage Spaces 条带) 2× Mellanox ConnectX-4 Lx 25GbE(RoCEv2)+ 1× Intel X710 10GbE 上连 2×25G 至 Arista 7050,Jumbo 9000,DCB 启 PFC Windows Server 2019 Datacenter + File Server + Storage Replica
HK-HUB Xeon Silver 4314(16C) 128GB 同上 2× NVMe 2× Intel X710 10GbE 2×10G 上联 Windows Server 2019 Datacenter
边缘(示例:SIN-EDGE) Xeon E-2278G(8C) 64GB SATA SSD 2× NVMe 1× Intel X710 10GbE 10G 上联(RTT≈36ms) Windows Server 2019 Standard

关键点:

  • 同城高速(Origin↔Hub)尽量上 RDMA(RoCEv2 / iWARP),SMB Direct 让 CPU 更低、吞吐更稳。
  • 跨区(Hub↔Edges)即便只有 单 NIC,RSS 也能让 SMB 多通道在单卡多队列上起并发;若有 双 NIC/双公网/双隧道,多通道会自动多路并发。
  • Windows 2019 默认启用 SMB 多通道,但 驱动、RSS、RDMA、Jumbo、DCB 都要逐项确认。

步骤一:网络与主机内核调优(把“车道”先拓宽)

1. 网卡/驱动/固件与 RSS/RDMA/Jumbo

# 1) 看网卡、驱动、链路、RSS
Get-NetAdapter | ft Name, Status, LinkSpeed, DriverInformation
Get-NetAdapterAdvancedProperty -Name "Ethernet 25G*" | ? {$_.DisplayName -match "RSS|Jumbo|RoCE|RDMA"}

# 2) 开启 RSS(单卡也能让 SMB 多通道开多通道)
Get-NetAdapterRss -Name "Ethernet 25G #1","Ethernet 25G #2"
Enable-NetAdapterRss -Name "Ethernet 25G #1","Ethernet 25G #2"

# 3) Jumbo MTU(同域内建议 9000;跨域/公网链路要和对端一致)
Get-NetIPInterface -InterfaceAlias "Ethernet 25G #1" | ft InterfaceAlias, NlMtu
Set-NetIPInterface -InterfaceAlias "Ethernet 25G #1" -NlMtu 9000
Set-NetIPInterface -InterfaceAlias "Ethernet 25G #2" -NlMtu 9000

# 4) RDMA(RoCEv2 建议配合 DCB/PFC;iWARP 则不依赖 PFC)
Get-NetAdapterRdma
Enable-NetAdapterRdma -Name "Ethernet 25G #1","Ethernet 25G #2"

# 5) DCB(RoCEv2 推荐,在交换机/主机双方启用 PFC,略)

不要用 LBFO NIC Teaming 叠在 RDMA 之上(会吞掉 RDMA)。RDMA 网卡保留“原生”多通道;非 RDMA 的多口汇聚,如果一定要聚合,优先 Switch-Independent + Dynamic,但多数情况下 直接让 SMB 多通道接管吞吐与故障切换即可。

步骤二:确认并调优 SMB 多通道

Windows Server 2019 默认开启 SMB 多通道,但我每次都会显式核查并微调客户端参数,让多通道“更激进”。

# 服务器侧配置与状态
Get-SmbServerConfiguration | ft EnableSMB1Protocol, EnableSMB2Protocol, EncryptData, EnableLeasing, EnableMultiChannel
# 建议:禁 SMB1,留 SMB2/3
Set-SmbServerConfiguration -EnableSMB1Protocol $false -EnableSMB2Protocol $true -Force

# 客户端侧(在发起复制的一端执行;我们用 Hub/Edges 作为“客户端”去拉 Origin/HUB)
Get-SmbClientConfiguration | fl EnableMultichannel, ConnectionCountPerRssNetworkInterface, ConnectionCountPerServer, DirectoryCacheLifetime, FileInfoCacheLifetime, FileNotFoundCacheLifetime, DisableBandwidthThrottling

# 我常用的“偏积极”参数(按需调整)
Set-SmbClientConfiguration -EnableMultichannel $true `
  -ConnectionCountPerRssNetworkInterface 8 `
  -ConnectionCountPerServer 64 `
  -DisableBandwidthThrottling $true -Force

通道可见性(同步时实时观察):

# 在客户端或服务端看多通道连接细节
Get-SmbMultichannelConnection | ft ServerName, ClientIP, ServerIP, RSS, RDMA, ClientInterfaceIndex, ServerInterfaceIndex, SessionId, Channel, BytesSent, BytesReceived

经验值:

  • 25GbE + RSS 典型会出现 6–8 条通道(取决于队列数与连接参数)。
  • RDMA=true 时吞吐接近线速且 CPU 占用显著下降。
  • 单 10GbE 没有 RDMA 的边缘节点,开启 RSS 和把 ConnectionCountPerRssNetworkInterface 拉到 8,吞吐仍会明显提升,特别是海量小文件。

步骤三:文件共享与权限(让“人”站得住,再让“车”跑得快)

在 Origin/HUB 建立专门的 Assets 共享,权限只给同步账户(最小权限原则)。

# 新建同步专用本地组与账户(也可接入域)
New-LocalGroup -Name "CDN-Syncers" -Description "Accounts allowed to sync CDN assets"
$pwd = Read-Host -AsSecureString "Set password for sync account"
New-LocalUser -Name "cdn_sync" -Password $pwd -PasswordNeverExpires $true
Add-LocalGroupMember -Group "CDN-Syncers" -Member "cdn_sync"

# 创建共享(可按需启用加密;跨公网建议走隧道/VPN 或 IPSec)
New-SmbShare -Name Assets -Path "E:\cdn_assets" -FullAccess "CDN-Syncers" -EncryptData $false
# 如果你跨不可信网络直连 SMB(不推荐),可以:
# Set-SmbShare -Name Assets -EncryptData $true

安全建议:SMB 445 端口不要直接暴露公网。我们在跨区时走 IPsec 或 WireGuard 站点隧道,再在隧道内跑 SMB;同城内网段可按安全等级决定是否启用 SMB 加密。

步骤四:Origin↔Hub 用 Storage Replica“打底”,Hub↔Edges 用 Robocopy/SMB“铺开”

思路:

  • 同城高速(Origin↔Hub)用 Storage Replica(SR) 做块级镜像(SMB3 之上、吃多通道/SMB Direct 的红利)。
  • 跨区多站点(Hub↔Edges)用 Robocopy + SMB 多通道 拉取增量(可并行、多线程、断点续传)。

4.1 Storage Replica(Origin↔Hub)

Windows Server 2019 Datacenter 无限制;Standard 有 1 个 partnership 与 2TB 限制,注意版本规划。

# 安装 SR(两端都装)
Install-WindowsFeature -Name Storage-Replica -IncludeManagementTools

# 创建复制卷与日志卷(示例:源 E: 数据卷,源 L: 日志卷)
New-SRPartnership `
 -SourceComputerName HK-ORIGIN -SourceRGName ORG-RG -SourceVolumeName E: -SourceLogVolumeName L: `
 -DestinationComputerName HK-HUB -DestinationRGName HUB-RG -DestinationVolumeName E: -DestinationLogVolumeName L: `
 -ReplicationMode Synchronous

# 监控
Get-SRGroup
Get-SRPartnership
Get-WinEvent -LogName "Microsoft-Windows-StorageReplica/Operational" -MaxEvents 20

收益:Origin 的写入几乎同步落到 Hub,Hub 再对外“风筝”式喂给各边缘;SR 走 SMB3/多通道/RDMA,带宽吃满时 CPU 仍可控。

4.2 Hub↔Edges:Robocopy + SMB 多通道并发

脚本(在 边缘节点定时拉取;或在 Hub 推送,任选一边执行):

# 文件:C:\scripts\cdn_sync.ps1
param(
  [string]$Source="\\HK-HUB\Assets",
  [string]$Dest="E:\cdn_assets",
  [int]$Threads=64,             # /MT
  [int]$Retry=1, [int]$Wait=1
)

$logDir = "C:\logs\cdn"
New-Item -ItemType Directory -Force -Path $logDir | Out-Null
$ts = Get-Date -Format "yyyyMMdd-HHmmss"
$log = Join-Path $logDir "robocopy-$ts.log"

$opts = @(
  "/MIR", "/FFT", "/Z", "/W:$Wait", "/R:$Retry",
  "/MT:$Threads", "/NP", "/NFL", "/NDL",
  "/XD", ".git",".svn",  # 可按需排除
  "/LOG+:$log"
)
# 注意:跨平台时间戳差异用 /FFT;中断续传用 /Z
robocopy $Source $Dest *.* $opts
if ($LASTEXITCODE -le 3) { exit 0 } else { exit $LASTEXITCODE }

计划任务(每 10 分钟):

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -File C:\scripts\cdn_sync.ps1"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes 10) -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "CDN Edge Sync" -Action $action -Trigger $trigger -User "NT AUTHORITY\SYSTEM" -RunLevel Highest

结合 SMB 多通道 + /MT,跨区 10Gbps 链路在 30–40ms RTT 里也能高效吃满,尤其文件量大时效果明显。

步骤五:带宽治理与“邻里相处”

当同一台文件服务器既承担复制、又承担别的 SMB 负载(例如运维拷包、CI 产物),可以用 SMB 带宽分类控一下“谁先吃饭”。

# 给“默认复制类”总量上限(比如 1.6GB/s ≈ 12.8Gbps),避免把 25G 一口吃干
Set-SmbBandwidthLimit -Category Default -BytesPerSecond 1717986918

# 观察与回调(需要时可按时段调整)
Get-SmbBandwidthLimit

实务上,跨区会受 ISP/QoS/拥塞影响,建议在 边缘侧再加一层 BITS(更温柔的 HTTP/SMB 之上下载器)做“夜间大刷、白天细水”的策略;但多数 CDN 同步场景 Robocopy 已够用。

步骤六:观测与压测(看得到,才能调得准)

运行时观测:

# 多通道连接
Get-SmbMultichannelConnection | ft ServerName, RSS, RDMA, Channel, BytesSent, BytesReceived

# SMB 客户端/服务器性能计数器(PerfMon)
# - SMB Client Shares / SMB Server Shares:Avg. Bytes/Read, Avg. Bytes/Write, Reads/Sec, Writes/Sec
# - SMB Direct Connection:RDMA Activity, Outstanding Requests

磁盘与端到端压测(示例):

# 磁盘IO(DiskSpd,假设已下载到 C:\tools\diskspd.exe)
# 4 线程顺序读写,验证存储可用带宽(自行按盘设计压测)
C:\tools\diskspd.exe -d60 -Sh -w30 -t4 -o8 -b1M E:\cdn_assets\testfile.dat

# 端到端大文件拷贝
Measure-Command { robocopy \\HK-HUB\Assets E:\tmp bigfile_50G.bin /MT:64 /Z /NP /R:1 /W:1 }

实测数据(我这次的“前后对比”)

场景 配置 吞吐(Avg) CPU(服务器侧) 备注
Origin↔Hub(同城 25G×2) 单通道、无 RDMA、RSS 默认(4) 14.8 Gbps 48–55% 受单连接拥塞窗口与 CPU 限制
Origin↔Hub(同城 25G×2) SMB 多通道 + RDMA(RoCEv2) 46–48 Gbps 18–25% 基本线速,CPU 非常低
Hub↔SIN-EDGE(10G、36ms) 单通道、/MT:8 3.1 Gbps 35–40% 小文件居多,受客户端队列限制
Hub↔SIN-EDGE(10G、36ms) SMB 多通道(RSS×8) + /MT:64 7.2–8.6 Gbps 28–33% 峰值接近 10G,长尾稳定

注:数值为我这次夜间窗口的实测均值,白天拥塞或 ISP 管控会略有波动。

常见坑与“机房就地补救”

RDMA 不起效

症状:Get-SmbMultichannelConnection 里 RDMA=False。

排查:网卡驱动版本、交换机是否开了 DCB/PFC(RoCEv2);主机侧 Get-NetAdapterRdma 是否 Enabled;不要把 RDMA 网卡拉进 LBFO 团队。

临时兜底:先按 RSS 多通道跑,RDMA 后补。

Jumbo MTU 不一致

症状:偶发丢包、吞吐忽上忽下。

处理:两端与中间设备 统一 MTU(9000 / 9216 / 1500),不一致宁可全部 1500。

杀毒/实时扫描拖慢同步

症状:CPU 飙高、拷贝卡顿在边缘。

处理:为同步路径加 实时扫描排除(只排路径,不关防护),或在维护窗口临时下调扫描强度。

SMB 加密全局开导致吞吐腰斩

建议:不可信网络走隧道/VPN/IPSec;SMB 加密只对 特定共享启用(Set-SmbShare -EncryptData $true)。同域内网段可关闭以换吞吐。

单 NIC 场景没起通道

处理:确认 RSS 已启;把 ConnectionCountPerRssNetworkInterface 从默认 4 提到 8;Robocopy 的 /MT 提升到 64(视 CPU 而定)。

防火墙/ACL 漏洞

检查:TCP 445、隧道端口;Windows Defender Firewall with Advanced Security 内入站出站规则;尽量只允许 站点间固定地址段。

跨公网 NAT 后多通道不生效

说明:多通道基于多 IP/队列/路径;对称 NAT/CGNAT 会让“多路径”消失。

解决:站点隧道(WireGuard/IPSec)两端多隧道口,或边缘补第二条物理/虚拟上联。

运行手册(我贴在机柜门背面的那张)

变更前:

  • 记录 Get-SmbClientConfiguration、Get-SmbServerConfiguration、Get-SmbMultichannelConnection 基线;
  • PerfMon 启动 SMB Client/Server/Direct 计数器;
  • NetQoS/交换机 DCB 配置双人复核。

变更中:

  • 逐一启 RSS、Jumbo、RDMA,每项后用 Test-NetConnection、大文件试拷确认;
  • 用 5G/50G 两档“哑铃文件”做端到端测速;
  • 观察通道数、是否 RDMA=true、CPU/中断是否均衡。

变更后:

  • Robocopy 任务入计划任务(错峰、重试);
  • Set-SmbBandwidthLimit 上限进 CMDB;
  • 记录吞吐、RTT、失败率 7 天对比;
  • 一键回滚脚本:把客户端配置恢复默认,把 RDMA/MTU 值退回。

FAQ:什么时候该“上 RDMA”,什么时候“多通道就够”?

  • 同城、25G/40G/100G:强烈建议 RDMA(SMB Direct)。能省下大量 CPU,还能让抖动变小。
  • 跨区、仅 1×10G + 稳定 RTT:RSS + SMB 多通道 已能吃到 7–9Gbps;RDMA 需要端到端支持且对网络更挑剔。
  • 大量小文件:在 SMB 多通道基础上,/MT 拉高、目录缓存参数适当放宽,收益很明显。
  • 公网/不可信网络:优先走 站点隧道,SMB 加密只对关键共享开,兼顾安全与吞吐。

我用到的关键命令清单(可直接复制做巡检)

# 状态/能力
Get-NetAdapter | ft Name, Status, LinkSpeed
Get-NetAdapterRss
Get-NetAdapterRdma
Get-SmbServerConfiguration
Get-SmbClientConfiguration
Get-SmbServerNetworkInterface
Get-SmbMultichannelConnection

# 配置调整
Enable-NetAdapterRss -Name "*25G*"
Enable-NetAdapterRdma -Name "*25G*"
Set-NetIPInterface -InterfaceAlias "*25G*" -NlMtu 9000
Set-SmbServerConfiguration -EnableSMB1Protocol $false -EnableSMB2Protocol $true -Force
Set-SmbClientConfiguration -EnableMultichannel $true -ConnectionCountPerRssNetworkInterface 8 -DisableBandwidthThrottling $true -Force
Set-SmbBandwidthLimit -Category Default -BytesPerSecond 1717986918

# 共享与权限
New-LocalGroup -Name "CDN-Syncers"
New-LocalUser -Name "cdn_sync" -Password (Read-Host -AsSecureString)
Add-LocalGroupMember -Group "CDN-Syncers" -Member "cdn_sync"
New-SmbShare -Name Assets -Path "E:\cdn_assets" -FullAccess "CDN-Syncers"

# Storage Replica(同城)
Install-WindowsFeature Storage-Replica -IncludeManagementTools
New-SRPartnership -SourceComputerName HK-ORIGIN -SourceRGName ORG-RG -SourceVolumeName E: -SourceLogVolumeName L: `
                   -DestinationComputerName HK-HUB -DestinationRGName HUB-RG -DestinationVolumeName E: -DestinationLogVolumeName L:

结尾:机房里的一缕风,和稳定落下的吞吐曲线

凌晨 4:35,我把最后一台边缘的计划任务点“启用”,Get-SmbMultichannelConnection 的输出像是点亮的航道:RSS= True,RDMA=True,8 条通道排得整整齐齐。PerfMon 上,Origin↔Hub 的曲线稳稳贴着 45Gbps 往上蹭,跨新加坡的 10G 也不再锯齿状地抖。对讲机里另一个同事笑着说:“这下真的不用守着它刷了。”

SMB 多通道的妙处在于:它让“物理上的多”和“协议里的并”自然叠加起来。你把网卡、队列、路径准备好,它就会聪明地跑满它们;再加上 RDMA,你会发现 CPU 退到后台,带宽成为唯一的上限。CDN 的同步,本来就不该是热闹与焦虑——它应该像此刻机房里吹过的一缕冷风一样,安静、持续、可预期。

目录结构
全文