两台 PC 加入同一个 VPN 后 SMB 复制为何变慢
SMB3 Multichannel 可能给局域网复制加一条隧道通道,并把它拖到较慢的路径上。先确认这条通道,再解绑或禁用它并重新测试。
在千兆局域网中,两台 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 退出场景时要重新启用它。记录你改了哪个适配器,因为下一个人会找到设置,却找不到原因。