Desempenho de cópia em rede lenta do Windows 7 / SMB2

2

Solucionando problemas complicados de desempenho e imaginando se esse comportamento é normal / esperado.

Isso parece estar relacionado ao SMB2, já que a mudança para o SMB1 resolve as coisas. A questão é se isso é esperado (ou seja, design de SMB2) e, em caso afirmativo, existe uma solução / solução alternativa?

Veja uma versão simplificada do problema:

1.Connect two Windows 7 machines via crossover cable.

2.Start a large file copy.

3.While that copy is underway, start a small file copy. The second copy process is very slow.

4.However, if you instead connect to the other machine “another” way (i.e. via IP instead of FQDN, or via Netbios name instead of IP, etc.), copy performance is relatively good.

Parece que a cópia grande está "engarrafando" a conexão original - ou seja, assim que você pausar a cópia grande, a cópia pequena será concluída rapidamente.

Não está saturando a largura de banda / pilha completamente (já que a segunda cópia através de uma "conexão diferente" termina rapidamente).

Como reproduzir o problema:

Eu criei alguns arquivos em lote que demonstram isso (todo o código está listado na parte inferior da pergunta - você precisa criar 5 arquivos em lote separados chamados go.bat, test.bat, copy1.bat, copy2.bat , copybig.bat):

Setup:

  1. Create test directory on remote ComputerB (c:\test)
  2. Create test directory on local ComputerA (c:\test)
  3. Put the 5 test batch files in ComputerA’s c:\test directory
  4. Edit go.bat and modify the last line as follows: The format is “call test.bat 1 2 3”, where: 1 = remote path via hostname 2 = local folder 3 = remote path via IP (e.g.: call test.bat \ComputerB\c$\test c:\test \ComputerB’sIPAddress\c$\test)

Execution:

  1. Open a command prompt as an administrator (so it can create the empty test files) and run go.bat

Veja o que os arquivos em lote fazem:

-Checks ComputerA to see if the three files exist (1GB, 10MB-1, 10MB-2) . If the files aren’t there, creates them.

-Deletes the local log file and ComputerB test files

-Starts copying the 1GB file from ComputerA to ComputerB

-Waits two seconds

-Starts copying the 10MB-1 file from ComputerA to ComputerB

-Starts copying the 10MB-2 file from ComputerA to ComputerB (but using its IP address)

-Logs, with timestamps, what’s happening to log.txt

Resultados:

O que parece acontecer consistentemente é isto:

-The big 1GB file copy establishes a connection with the remote machine

-The small 10MB-1 file copy starts and eventually finishes but is really slow because it’s “sharing” the existing connection with the 1GB copy connection

-The small 10MB-2 file copy that uses the IP address finishes quickly because it establishes a “new/separate” connection

-At any point, if you hit pause during the big copy, the small 10MB-1 copy finishes quickly.

Código do arquivo em lote:

--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 %2GB goto 1
fsutil file createnew 1GB 1048576000

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

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

:3

del /q /f log.txt
del /q /f %1MB-1
del /q /f %1MB-2
del /q /f %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--
    
por Craig H 03.06.2014 / 01:49

2 respostas

0

Nota: Eu não tentei os arquivos em lote, mas em vez disso, olhei os detalhes de como o Robocopy funciona.

Por o blog de Mark Minasi , definir a bandeira IPG terá um efeito dramático de quanto de largura de banda é usado pelo robocopy. Ele afirma:

Waiting Between Blocks Finally, with the /ipg option, Robocopy lets me reduce the amount of network bandwidth the tool can consume. Like all copy routines, Robocopy copies data in 64KB blocks. Typically, Robocopy just sends one block after another, with no pause between the blocks. Adding the /ipg:n option, however, tells Robocopy to wait n milliseconds between blocks. But what value do you use? Well, 64KB is about half a million bits. Therefore, over a 100Mb Ethernet connection, that 64KB file copy would take about 1/200 of a second—5 milliseconds.

Five milliseconds is a theoretical best-case figure. In a busy real-world network with normal software overhead, you might expect no more than 20 percent of that speed, making the actual time perhaps 25 milliseconds. Assuming, then, that Robocopy can effectively transfer only one block every 25 milliseconds, setting /ipg:25 would cut Robocopy's network usage by 50 percent. Setting /ipg:50 would cut Robocopy's network usage by 66 percent, and setting /ipg:75 would reduce network usage by 75 percent of its unencumbered speed. You get the idea.

Você pode alterar o copybig.bat para:

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

Escolhi 750 porque deveria limitá-lo para 1 Mbps . Você pode usar a calculadora de atraso do Robocopy IPG para descobrir qual é o melhor atraso para a sua configuração.

Outra opção para tentar é o sinalizador /mt (para multithreading) - mas tenha cuidado, pois isso não funcionará com /ipg .

    
por 11.06.2014 / 21:56
0

Eu sei que isso pode parecer uma desculpa; no entanto, como você diz que, se o IP for inserido, a cópia ficará muito bem, portanto, no computador que está executando esse arquivo em lote, você pode tentar modificar o arquivo HOSTS (C: \ Windows \ System32 \ HOSTS) e adicionar x.x.x.x hostname alguns dos hosts que você está tentando.

    
por 12.06.2014 / 01:08