Windows 7/SMB2 网络复制性能缓慢

Windows 7/SMB2 网络复制性能缓慢

解决棘手的性能问题并想知道这种行为是否正常/预期。

这似乎与 SMB2 有关,因为切换到 SMB1 可以解决问题。问题是这是否是预期的(即 SMB2 的设计),如果是,是否有解决方案/解决方法?

以下是该问题的简化版本:

1.通过交叉电缆连接两台 Windows 7 机器。

2.开始复制大文件。

3.在复制过程中,开始复制一个小文件。第二次复制过程非常慢。

4.但是,如果您以“另一种”方式连接到另一台机器(即通过 IP 而不是 FQDN,或者通过 Netbios 名称而不是 IP 等),复制性能相对较好。

看起来,大型副本正在“阻碍”原始连接 - 例如,只要您暂停大型副本,小型副本就会很快完成。

但它并没有完全饱和带宽/堆栈(因为通过“不同连接”的第二次复制很快就完成了)。

如何重现问题:

我创建了一些批处理文件来演示这一点(所有代码都列在问题的底部 - 您需要创建 5 个单独的批处理文件,分别名为 go.bat、test.bat、copy1.bat、copy2.bat、copybig.bat):

设置:

  1. 在远程 ComputerB 上创建测试目录 (c:\test)
  2. 在本地 ComputerA 上创建测试目录 (c:\test)
  3. 将 5 个测试批处理文件放入 ComputerA 的 c:\test 目录中
  4. 编辑 go.bat 并修改最后一行如下:格式为“call test.bat 1 2 3”,其中:1 = 通过主机名的远程路径 2 = 本地文件夹 3 = 通过 IP 的远程路径(例如:call test.bat \\ComputerB\c$\test c:\test \\ComputerB'sIPAddress\c$\test)

执行:

  1. 以管理员身份打开命令提示符(这样它可以创建空的测试文件)并运行 go.bat

以下是批处理文件的作用:

- 检查 ComputerA 是否存在这三个文件 (1GB、10MB-1、10MB-2)。如果不存在,则创建它们。

-删除本地日志文件和 ComputerB 测试文件

-开始将 1GB 文件从 ComputerA 复制到 ComputerB

-等待两秒钟

-开始将 10MB-1 文件从 ComputerA 复制到 ComputerB

-开始将 10MB-2 文件从 ComputerA 复制到 ComputerB(但使用其 IP 地址)

-记录 log.txt 中发生的情况,并带有时间戳

结果:

似乎经常发生的情况是这样的:

-1GB 大文件副本与远程机器建立连接

-10MB-1 的小文件复制开始并最终完成,但速度非常慢,因为它与 1GB 复制连接“共享”现有连接

-使用 IP 地址的 10MB-2 小文件复制很快完成,因为它建立了“新的/单独的”连接

-在任何时候,如果您在大复制过程中暂停,小的 10MB-1 复制就会很快完成。

批处理文件代码:

--go.bat--
cls
rem The format is test.bat 1 2 3, where:
rem 1 = destination path with hostname
rem 2 = local path
rem 3 = destination path with IP

call test.bat \\ComputerB\c$\test c:\test \\ComputerB'sIP\c$\test
--go.bat--


--test.bat--
if exist %2\1GB goto 1
fsutil file createnew 1GB 1048576000

:1
if exist %2\10MB-1 goto 2
fsutil file createnew 10MB-1 10485760

:2
if exist %2\10MB-2 goto 3
fsutil file createnew 10MB-2 10485760

:3

del /q /f log.txt
del /q /f %1\10MB-1
del /q /f %1\10MB-2
del /q /f %1\1GB

set var1=%1
set var2=%2
set var3=%3

echo Calling CopyBig.bat %time% >> log.txt
start CopyBig.bat %var1% %var2% %var3%

echo Pausing for two seconds %time% >> log.txt
ping 127.0.0.1 -n 3

echo Calling Copy1.bat %time% >> log.txt
start copy1.bat %var1% %var2% %var3%

echo Calling Copy2.bat %time% >> log.txt
start copy2.bat %var1% %var2% %var3%
--test.bat--


--copybig.bat--
echo Starting Big Robocopy %time% >> log.txt
robocopy %2 %1 1GB
echo Done Big Robocopy %time% >> log.txt
--copybig.bat--


--copy1.bat--
echo Starting 1st Robocopy %time% >> log.txt
robocopy %2 %1 10MB-1
echo Done 1st Robocopy %time% >> log.txt
--copy1.bat--


--copy2.bat--
echo Starting 2nd Robocopy %time% >> log.txt
robocopy %2 %3 10MB-2
echo Done 2nd Robocopy %time% >> log.txt
--copy2.bat--

答案1

注意:我没有尝试过批处理文件,而是研究了 Robocopy 的工作原理的细节。

Mark Minasi 的博客,设置 IPG 标志将对 robocopy 使用的带宽产生巨大影响。他指出:

块间​​等待 最后,使用 /ipg 选项,Robocopy 可以减少该工具占用的网络带宽量。与所有复制例程一样,Robocopy 以 64KB 块为单位复制数据。通常,Robocopy 只是逐个发送块,块间没有暂停。但是,添加 /ipg:n 选项会告诉 Robocopy 在块间等待 n 毫秒。但是您使用什么值呢?64KB 大约是 50 万位。因此,在 100Mb 以太网连接上,复制 64KB 文件大约需要 1/200 秒,即 5 毫秒。

五毫秒是理论上的最佳数字。在软件开销正常的繁忙现实世界网络中,您可能预计速度不会超过该速度的 20%,因此实际时间可能为 25 毫秒。假设 Robocopy 每 25 毫秒只能有效地传输一个块,则设置 /ipg:25 会将 Robocopy 的网络使用量减少 50%。设置 /ipg:50 会将 Robocopy 的网络使用量减少 66%,而设置 /ipg:75 会将网络使用量减少其未受限制速度的 75%。您明白了。

您可以将 copybig.bat 更改为:

--copybig.bat--
echo Starting Big Robocopy %time% >> log.txt
robocopy /IPG:750 %2 %1 1GB 
echo Done Big Robocopy %time% >> log.txt
--copybig.bat--

我选择 750 是因为它应该大致限制为 1Mbps.您可以使用Robocopy IPG 延迟计算器找出最适合您的设置的延迟。

另一个可以尝试的选项是/mt标志(用于多线程)——但要小心,因为它不适用于/ipg

答案2

我知道这可能看起来像是一种逃避;但是,既然您说如果输入了 IP,那么复制就会顺利进行,因此在运行此批处理文件的计算机上,您可以尝试修改 HOSTS 文件(C:\Windows\System32\HOSTS)并添加x.x.x.x hostname一些您正在尝试的主机。

相关内容