Устранение сложной проблемы с производительностью и вопрос о том, является ли это поведение нормальным / ожидаемым.
Похоже, это связано с SMB2, так как переключение на SMB1 решает проблемы. Вопрос в том, ожидается ли это (т.е. проектирование SMB2) и, если да, есть ли решение / обходной путь?
Вот упрощенная версия проблемы:
1.Соедините две машины Windows 7 через перекрестный кабель.
2.Начните большую копию файла.
3.Пока эта копия находится в процессе, начните маленькую копию файла. Второй процесс копирования очень медленный.
4.Однако если вы вместо этого подключаетесь к другому компьютеру «другим» способом (т. Е. Через IP вместо FQDN или через имя Netbios вместо IP и т.д.), Производительность копирования будет относительно хорошей.
Похоже, что большая копия является «узким местом» исходного соединения, т. Е. Как только вы приостанавливаете большую копию, маленькая копия быстро заканчивается.
Тем не менее, он не полностью насыщает полосу пропускания / стек (поскольку вторая копия через «другое соединение» быстро заканчивается).
Как воспроизвести проблему:
Я создал несколько пакетных файлов, которые демонстрируют это (весь код указан в нижней части вопроса - вам нужно создать 5 отдельных пакетных файлов с именами go.bat, test.bat, copy1.bat, copy2.bat, copybig. летучая мышь):
Настроить:
- Создать тестовый каталог на удаленном компьютере B (c:\test)
- Создать тестовый каталог на локальном компьютере A (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
Вот что делают командные файлы:
-Проверяет компьютер A на наличие трех файлов (1 ГБ, 10 МБ-1, 10 МБ-2). Если файлов там нет, создайте их.
-Удаляет локальный файл журнала и тестовые файлы ComputerB
-Начинается копирование файла размером 1 ГБ с компьютера A на компьютер B
-Ждёт две секунды
-Начинается копирование файла 10MB-1 с компьютера A на компьютер B
-Начинается копирование файла 10MB-2 с компьютера A на компьютер B (но с использованием его IP-адреса)
-Логи, с отметками времени, что происходит с log.txt
Результаты:
То, что происходит последовательно, это:
- Большая копия файла объемом 1 ГБ устанавливает соединение с удаленным компьютером.
- Небольшая копия файла 10 МБ-1 запускается и в конечном итоге заканчивается, но очень медленно, потому что она «разделяет» существующее соединение с подключением копирования 1 ГБ
-Маленькая копия файла 10MB-2, которая использует IP-адрес, быстро заканчивается, потому что она устанавливает «новое / отдельное» соединение
-В любой момент, если вы нажмете паузу во время большой копии, маленькая копия 10 МБ-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--