在千兆局域网中,两台 Windows 机器之间的文件复制会在两者连接同一个 VPN 的瞬间慢如蜗牛,而同一对机器之间的吞吐量测试仍报告接近线速。问题既不在链路,也不在磁盘。SMB3 Multichannel 悄悄添加了一条走隧道的第二条 TCP 连接,复制便会等待最慢的那条通道。把这条路径从 SMB 中移除,局域网速度就会恢复。

一个共享可以走多条 TCP 连接

Multichannel 允许客户端向同一台服务器打开多条独立连接,每个合适的地址对一条。在普通局域网中可能只有一对地址,因此不会出现意外。在两台机器上都添加 VPN 适配器后,Windows 会看到第二对地址,即隧道地址对隧道地址,并跨它打开一条通道。

这条通道是加密的,与隧道共享 CPU,并和其他所有流量一样经过同一条 WAN 链路。原本只用局域网的复制,其连接集合中多了一个慢成员,而 SMB 不会悄悄丢弃它。

绑定到局域网地址的吞吐量测试看起来仍然健康,这正是两次测量结果如此悬殊的原因。

在改动任何东西之前,先证明隧道通道确实存在

在复制进行时在客户端运行查询,因为通道列表只有在活动时才有意义。

Get-SmbMultichannelConnection | Where-Object Selected -eq $true | Format-Table ServerName, ClientIPAddress, ServerIPAddress
Get-SmbConnection | Format-Table ServerName, Dialect, NumOpens

同一台服务器出现多条被选中的行,就是所需的确认。把可疑行的客户端地址解析到一个网络接口。若该别名是 VPN 适配器,这条通道就是真实存在的,而不是过期条目。

Get-NetIPAddress -IPAddress 10.8.0.6 | Format-List IPAddress, InterfaceAlias

每台机器上的地址都不同,因此请读取你自己输出中报告的地址,而不要照抄上面的示例。

把隧道从 SMB 中拿掉,并重启两端

关闭 Multichannel 是客户端和服务器两端都要做的改动,只做一侧会让另一侧继续提供该接口。现有通道会保留该设置,因此要计划重启,而不要指望下一次复制会自动改变。

Set-SmbClientConfiguration -EnableMultiChannel $false -Force
Set-SmbServerConfiguration -EnableMultiChannel $false -Force
Get-SmbClientConfiguration | Select-Object EnableMultiChannel

重启后,列出服务器为 SMB 提供的接口。隧道适配器应当已从该列表中消失。若它仍然存在,说明设置落在了错误的端点,或旧会话仍未关闭。

Get-SmbServerNetworkInterface | Format-List Name, InterfaceAlias, LinkSpeed

当目标比在所有地方禁用 Multichannel 更窄时,解除服务器组件与隧道适配器的绑定可以停止通过它的共享,同时不影响 VPN 的其余部分。

Get-NetAdapterBinding -Name "<vpn adapter>" -ComponentID ms_server
Disable-NetAdapterBinding -Name "<vpn adapter>" -ComponentID ms_server

优先使用局域网,并用同样的方式测量两次

接口跃点不会移除通道,但会把新连接引导到物理链路,并让无关流量远离隧道。请从输出中复制别名,而不要手动输入,因为某些安装中它已被本地化。

Get-NetIPInterface | Sort-Object InterfaceMetric | Select-Object InterfaceAlias, InterfaceMetric
Set-NetIPInterface -InterfaceAlias "<vpn adapter>" -AutomaticMetric Disabled -InterfaceMetric 9000

然后重复两项测量:文件复制和单流吞吐量测试。若复制恢复而吞吐量测试不变,说明隧道从来不是瓶颈。若两者都崩溃,说明 VPN 路径就是限制,Multichannel 只是让它显现出来。请与连接 VPN 之前所做的复制对比,因为只有这条基线才能隔离这次变化。

在确实提供多条快速路径的服务器上,禁用 Multichannel 会牺牲吞吐量,因此当 VPN 退出场景时要重新启用它。记录你改了哪个适配器,因为下一个人会找到设置,却找不到原因。

相关文章