排除棘手的性能问题,并想知道此行为是否正常/预期。
这似乎与SMB2有关,因为切换到SMB1可以解决问题。问题是这是否是预期的(即SMB2的设计),如果是,是否有解决方案/解决方法?
这是问题的简化版本:
1.通过交叉电缆连接两台Windows 7机器。
2.启动大型文件副本。
3.当正在进行复制时,启动一个小文件副本。第二个复制过程非常缓慢。
4.但是,如果您改为以“另一种”方式连接到另一台机器(即通过IP而不是FQDN,或通过Netbios名称而不是IP等),复制性能相对较好。
似乎大型副本是“瓶颈”原始连接 - 即只要暂停大型副本,小副本就会快速完成。
它并没有完全饱和带宽/堆栈(因为通过“不同连接”的第二个副本很快完成)。
如何重现问题:
我已经创建了一些演示这个的批处理文件(所有代码都列在问题的底部 - 你需要创建5个单独的批处理文件,名为go.bat,test.bat,copy1.bat,copy2.bat,copybig。蝙蝠):
建立:
- 在远程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地址)
-Logs,带有时间戳,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--
xcopy
(用于比较)吗?另外,你试过玩Interpacket Gap吗?请看这里有一篇有趣的文章,可能会有所启发。