如何在香港服务器的 Windows Server 2019 上启用 SMB 多通道,破解跨境文件传输的“慢病”

凌晨 1:40,我在香港荃湾机房的冷风里缩着脖子,盯着一台刚上架的文件服务器。国内团队在抱怨:从内地办公网拉取香港机房的素材,单线程 20~40 MB/s,上下抖,高峰期仿佛拖着铁球走路。链路不差,延迟 60~90 ms,丢包 0.1% 左右,但带宽利用率死活上不去。
一、目标很简单:
不改业务协议(仍然 SMB),不搬家(继续香港机房),把跨境 SMB 吞吐稳定拉满。
二、基础环境与拓扑(把牌桌摆明白)
服务器(香港)
机型:1U 双路(Dell R650 同级)
CPU:Intel Xeon Silver 4314 ×2(支持 AES-NI)
内存:256 GB
系统盘:2× SATA SSD(RAID1)
数据盘:4× NVMe U.2(RAID10,约 6.5 GB/s 顺序读,2.8 GB/s 顺序写)
网卡:
Intel X710-DA2(10 GbE,双口,拆分到不同运营商上联)
板载 1 GbE ×2(留作带外/备援)
OS:Windows Server 2019 Standard(1809,最新累积补丁)
对端(内地办公楼宇机房)
边界出口:双 ISP,SD-WAN 回香港
客户端:Windows 10/11、Windows Server 2019 混合
平均 RTT 到香港:60–90 ms(东区/华南),偶有 120 ms
网络要点
两条跨境链路(不同运营商),BGP 出口,香港侧两张 10G 网卡走不同上联
服务器对外只开放 445(SMB),强制通过公司 VPN 白名单访问
MTU:标准 1500(跨境不玩巨帧,减少黑洞风险)
三、为什么“慢”:延迟 + 单流 + 信用(Credit)约束
高 RTT 下,单个 TCP 流的吞吐受限于 BDP(带宽时延积)。90 ms × 1 Gbps ≈ 11.25 MB 的在途数据窗,需要较多并行请求才能把“管子填满”。
SMB 3.x 使用Credits 机制控制并发 I/O 请求数;默认对“高时延大带宽”不一定激进。
许多工具默认单线程(或者 SMB 会话只有少量并发),一条“细水长流”跑满带宽很难。
SMB 多通道(SMB Multichannel)可以为一个 SMB 会话建立多条 TCP 连接,并结合 NIC/RSS 多队列,显著提高并行度与 CPU 利用率;如果客户端和服务器都有多张可达网卡,还能跨接口并行,把多条跨境线路都“吃上”。
四、落地方案总览(先给路线图)
确认存储与内网不成瓶颈(diskspd + iPerf3)。
确认 SMB 多通道开关(2019 默认开启,但要核验/约束接口)。
启用/校正 RSS、RSC、LSO 等网卡卸载特性(多队列并行)。
为跨境双链路添加精确路由(让 SMB 多通道能走到两张 10G)。
必要时提高 SMB Credits 上限(温和、安全的阈值)。
安全与加密策略(尽量 VPN 统一加密,避免双重加密拖垮吞吐)。
用可复现的测试集验证(表格对比前后)。
设置监控与回滚手册。
五、基线测试(别急着调,先看瓶颈在哪)
5.1 存储能力(香港服务器本地)
# 下载 diskspd:https://aka.ms/diskspd(离线放到 D:\tools\diskspd.exe)
# 顺序读写测试(模拟大文件复制)
D:\tools\diskspd.exe -c50G -b1M -d30 -o8 -t8 -Sh -w0 D:\data\testfile.dat
D:\tools\diskspd.exe -c50G -b1M -d30 -o8 -t8 -Sh -w100 D:\data\testfile.dat
结果(样例):顺序读 6.1 GB/s,顺序写 2.6 GB/s —— 本地盘不是短板。
5.2 网络可达性与裸 TCP 吞吐
香港服务器作为 iPerf3 服务端:
# Windows 下载 iperf3.exe 后:
.\iperf3.exe -s
内地侧客户端:
iperf3.exe -c <HK_10G_IP_A> -P 8 -t 30
iperf3.exe -c <HK_10G_IP_B> -P 8 -t 30
结果(样例):单链路 600–850 Mbps,双链路合计可达 1.2–1.5 Gbps(并行 8 流)。—— 裸 TCP 并行能“吃满”,问题在 SMB 并发度不足。
六、开启与校准 SMB 多通道(Server 2019)
说明:Windows Server 2012 以后默认启用 SMB Multichannel,但现实机房里被策略、安全基线或历史优化改过并不稀奇,务必核验。
6.1 双端检查与开启
# 服务器侧
Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol, EnableMultiChannel, EncryptData
# 建议:禁用 SMB1,开启 SMB2/3、多通道
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
Set-SmbServerConfiguration -EnableMultiChannel $true -Force
# 客户端侧(办公/落地机)
Get-SmbClientConfiguration | Select EnableMultiChannel, ConnectionCountPerRssNetworkInterface
Set-SmbClientConfiguration -EnableMultiChannel $true
6.2 验证多通道是否“真的生效”
发起一次大文件复制后(可用 robocopy),在服务器上看连接:
Get-SmbMultichannelConnection | ft ClientIP, ServerIP, ClientInterfaceIndex, ServerInterfaceIndex, IsRDMA, RdmaCapable, ConnectionId, AggregatedBandwidth
能看到多条连接、指向不同的本地接口(或同一接口多队列/RSS)才算到位。
6.3 约束到指定接口(避免慢口/管理口被用上)
# 查看网络接口
Get-SmbServerNetworkInterface | ft InterfaceIndex, IpAddress, LinkSpeed, RssCapable, RdmaCapable
Get-SmbClientNetworkInterface | ft InterfaceIndex, IpAddress, LinkSpeed, RssCapable, RdmaCapable
# 为某个目标服务器约束多通道仅用 10G 接口
# 在“客户端”上执行(多数情况下内地侧是客户端)
New-SmbMultichannelConstraint -InterfaceIndex 12,14 -ServerName <HK_fileserver_FQDN_or_IP>
# 查看/删除约束
Get-SmbMultichannelConstraint
Remove-SmbMultichannelConstraint -InterfaceIndex 12,14 -ServerName <...>
七、让两条跨境链路都参与(关键:路由与度量)
即便多通道打开,Windows 的路由表仍会把默认路由压到某一张网卡上;要让 SMB 多通道真的“走双线”,需要保证两张 10G 都能到达对端。
7.1 固定到主机对主机的 /32 精确路由
在内地客户端上,为香港服务器 IP 增加两条不同接口的下一跳(每条路走各自 ISP):
# 查看接口
Get-NetIPInterface | Sort-Object InterfaceMetric | ft ifIndex, InterfaceAlias, AddressFamily, NlMtu, InterfaceMetric
# 添加精确路由(示例)
New-NetRoute -DestinationPrefix <HK_Server_IP>/32 -InterfaceIndex 12 -NextHop <ISP_A_Gateway> -RouteMetric 5
New-NetRoute -DestinationPrefix <HK_Server_IP>/32 -InterfaceIndex 14 -NextHop <ISP_B_Gateway> -RouteMetric 5
要点:相同的 RouteMetric 可让并行连接分摊;不同 metric 可能出现偏置。具体取决于运营商对称性与 NAT 行为,必要时抓包调整。
7.2 关闭“坏口”参与
如果某个接口抖动大、丢包高,把它剔除出多通道(见 6.3 约束)。
八、网卡与 TCP 栈调优(把并行的“路”铺好)
8.1 RSS/LSO/RSC
# 查看/启用 RSS(多队列)
Get-NetAdapterRss
Enable-NetAdapterRss -Name "Ethernet 10G A"
Enable-NetAdapterRss -Name "Ethernet 10G B"
# 开启大包分段与接收合并(按网卡驱动能力为准)
Enable-NetAdapterLso -Name "Ethernet 10G A","Ethernet 10G B" -IPv4
Enable-NetAdapterRsc -Name "Ethernet 10G A","Ethernet 10G B" -IPv4
说明:部分老驱动的 RSC 与某些防火墙/虚拟化环境有兼容性问题,先测再上。
8.2 TCP 自动调优
netsh int tcp show global
# 一般保持默认(auto-tuning level: normal)。如果遇到旧设备兼容性问题,可降到 highlyrestricted 再测试。
# ECN 建议保持默认(disabled),跨境链路不一定支持。
8.3 SMB Credits(可选、温和拉高)
默认足够,但在 90 ms 以上 RTT、大文件连续写入时,适当上调服务端最大信用数可减少 Credit Stall。
服务器上:
# 当前值(多数情况下不会暴露)
reg query "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v Smb2CreditsMax
# 建议添加(如果不存在),从 4096 起步,最高 16384,逐级测试
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v Smb2CreditsMax /t REG_DWORD /d 4096 /f
# 同理:Smb2CreditsMin 可设 256~512
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v Smb2CreditsMin /t REG_DWORD /d 512 /f
# 修改后重启服务器服务或维护窗口重启主机
Restart-Service LanmanServer
注意:Credits 不是越大越好。过大可能增加内存占用与极端场景下的拥塞恢复时间。每次只改一个量、做 A/B 测。
九、安全与加密(性能与合规的平衡)
强制 VPN 入场:香港服务器仅接受来自公司 VPN 段的 445;公网永不开放。
New-NetFirewallRule -DisplayName "SMB-In-VPN" -Direction Inbound -Protocol TCP -LocalPort 445 -Action Allow -RemoteAddress <VPN_CIDR> -Profile Domain
SMB 加密(3.1.1 默认可用):跨境场景通常已有 VPN 层加密,避免“双重加密”叠加。建议:
VPN 有 AES-NI 加速、吞吐充足:SMB 侧仅开启签名(默认即可),不强制加密;
若必须端到端(合规要求):开启 SMB 共享级别加密,但要评估 CPU 余量与吞吐下降。
# 对某个共享启用加密(按需)
Set-SmbShare -Name "media" -EncryptData $true
十、可复现的验证流程与结果
10.1 测试命令(客户端侧)
# 复制同一 50GB 大文件(避免小文件元数据噪声)
robocopy \\HK-FS\media D:\_test media_50G.bin /MT:32 /R:0 /W:0 /NP /LOG:robocopy.log
# 观察多通道连接
Get-SmbMultichannelConnection
# 观察客户端计数器(实时)
Get-Counter -Counter "\SMB Client Shares(*)\*Bytes/sec", "\SMB Client Shares(*)\Credit Stalls/sec" -SampleInterval 2 -MaxSamples 30
10.2 前后对比(样例数据,与你网络质量有关)
| 场景 | 设置 | 平均吞吐 | 峰值 | RTT | 备注 |
|---|---|---|---|---|---|
| 基线 | 单链路,单通道,/MT:8 | 38 MB/s | 52 MB/s | 78 ms | Credit Stall 明显 |
| 启用多通道 | 同一 10G 接口,多连接 | 95 MB/s | 130 MB/s | 78 ms | RSS 多队列起效 |
| 双链路参与 | 两张 10G + 路由精确 /32 | 170 MB/s | 210 MB/s | 78 ms | 两个 ISP 分摊 |
| 优化 Credits | Smb2CreditsMax=4096 | 190 MB/s | 235 MB/s | 78 ms | Credit Stall 降低 |
| 强制 SMB 加密 | 共享 encrypt on | 140 MB/s | 175 MB/s | 78 ms | CPU 25–35% 上浮 |
解读:在我们的链路条件下,从 40 MB/s 拉到稳定 180–200 MB/s,峰值 230 MB/s 左右,已经接近两条跨境链路“能给的平均值”。再往上要靠链路本身升级(更低 RTT、更高 SLA)。
十一、常见坑与现场解法
| 症状 | 根因 | 处理 |
|---|---|---|
Get-SmbMultichannelConnection 只有一条连接 |
多通道被策略关闭 / 只有一条接口可达 | 开启多通道;检查路由与防火墙;用约束只启好口 |
| 明明双 10G,流量全压在一条 ISP 上 | 路由度量或 NAT 不对称 | 加 /32 精确路由到两条接口;必要时对端也做策略路由 |
| 吞吐抖动、回落 | 丢包/抖动大、微突发 | 降低并行数试探;核查 ISP 抖动;必要时限速在 85–90% 峰值稳态 |
| 开了 RSC/LSO 反而更差 | 驱动/防火墙不兼容 | 逐项回退,先关 RSC 再测;升级驱动/固件 |
| 小文件比大文件慢很多 | 元数据开销 + 往返 | 用 robocopy /MT:64 /FFT /Z,或打包再传;服务器端提高目录缓存 |
| 打开 SMB 加密后“半腰斩” | CPU 加密瓶颈 | 确认 AES-NI;提升并行;把加密搬到 VPN 层;或升级 CPU |
| 配了 NIC Teaming 但多通道不工作 | LBFO 把多口“虚拟成一口” | 非 Hyper-V 场景建议不组队,让 SMB 多通道自己并行;或用 SET(Hyper-V) |
十二、运维清单(可拷贝到变更单)
- 服务器与客户端:确认 EnableMultiChannel=$true;禁 SMB1。
- 网卡:开启 RSS/LSO/RSC(按驱动能力测试后定夺)。
- 客户端:为目标服务器 IP 下发 两条 /32 精确路由(指向不同 ISP 接口)。
- 客户端:New-SmbMultichannelConstraint 约束只用 10G 接口。
- 服务器(可选):Smb2CreditsMax=4096,Smb2CreditsMin=512,改后重启服务。
- 安全:仅对 VPN 段开放 445;是否启用 SMB 加密视合规与 CPU 决定。
- 验证:robocopy 50GB + Get-SmbMultichannelConnection + iPerf3;记录前后数据。
- 回滚:删除约束与路由,恢复 Credits 键值,重启 LanmanServer。
十三、故障排查脚本(片段)
Write-Host "=== 基本网络与 SMB 状态 ==="
ipconfig /all
Get-NetIPInterface | ft ifIndex, InterfaceAlias, InterfaceMetric, NlMtu, ConnectionState
Get-SmbServerConfiguration | fl EnableMultiChannel, EnableSMB1Protocol, EnableSMB2Protocol, EncryptData
Get-SmbServerNetworkInterface | ft InterfaceIndex, IpAddress, LinkSpeed, RssCapable, RdmaCapable
Get-SmbMultichannelConnection | ft ClientIP, ServerIP, ClientInterfaceIndex, ServerInterfaceIndex, IsRDMA, AggregatedBandwidth
Get-Counter "\SMB Client Shares(*)\Credit Stalls/sec" -SampleInterval 2 -MaxSamples 10
凌晨 3:05,最后一轮 robocopy 落地,日志里是一行行稳定的 190 MB/s。我们把流量图钉在大屏上看了 10 分钟,波形稳得像直尺。临走前,我把那两条 /32 路由和多通道约束写进了变更单,给白班留了个注释:
“如果看到连接只有一条,先看 Get-SmbMultichannelConnection,再看路由表。”
跨境这件事,从来不是一个按钮的浪漫,而是一串参数、几个路由、若干试错,和凌晨机房里的一口凉风。**SMB 多通道不是万能,但在正确的网络与存储前提下,它很值。**下次你在香港或任意高 RTT 环境里遇到“拖铁球”的 SMB,不妨按这篇一步步走一遍——多数时候,它就会乖了。
附:更进一步(有条件可尝试)
SMB over QUIC(Server 2022+):把 SMB 封装到 QUIC/443,可穿越复杂网络,延迟与稳定性更佳(需要升级版本)。
端到端 QoS:在 SD-WAN 上对 SMB 流打高优先级,缓解拥塞退让中的抖动。
链路质量监测:长期采集 RTT、抖动与丢包,自动切换劣化链路