解决棘手的性能问题并想知道这种行为是否正常/预期。
这似乎与 SMB2 有关,因为切换到 SMB1 可以解决问题。问题是这是否是预期的(即 SMB2 的设计),如果是,是否有解决方案/解决方法?
以下是该问题的简化版本:
1.通过交叉电缆连接两台 Windows 7 机器。
2.开始复制大文件。
3.在复制过程中,开始复制一个小文件。第二次复制过程非常慢。
4.但是,如果您以“另一种”方式连接到另一台机器(即通过 IP 而不是 FQDN,或者通过 Netbios 名称而不是 IP 等),复制性能相对较好。
看起来,大型副本正在“阻碍”原始连接 - 例如,只要您暂停大型副本,小型副本就会很快完成。
但它并没有完全饱和带宽/堆栈(因为通过“不同连接”的第二次复制很快就完成了)。
如何重现问题:
我创建了一些批处理文件来演示这一点(所有代码都列在问题的底部 - 您需要创建 5 个单独的批处理文件,分别名为 go.bat、test.bat、copy1.bat、copy2.bat、copybig.bat):
设置:
- 在远程 ComputerB 上创建测试目录 (c:\test)
- 在本地 ComputerA 上创建测试目录 (c:\test)
- 将 5 个测试批处理文件放入 ComputerA 的 c:\test 目录中
- 编辑 go.bat 并修改最后一行如下:格式为“call test.bat 1 2 3”,其中:1 = 通过主机名的远程路径 2 = 本地文件夹 3 = 通过 IP 的远程路径(例如:call test.bat \\ComputerB\c$\test c:\test \\ComputerB'sIPAddress\c$\test)
执行:
- 以管理员身份打开命令提示符(这样它可以创建空的测试文件)并运行 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
一些您正在尝试的主机。