2

Устранение сложной проблемы с производительностью и вопрос о том, является ли это поведение нормальным / ожидаемым.

Похоже, это связано с SMB2, так как переключение на SMB1 решает проблемы. Вопрос в том, ожидается ли это (т.е. проектирование SMB2) и, если да, есть ли решение / обходной путь?

Вот упрощенная версия проблемы:

1.Соедините две машины Windows 7 через перекрестный кабель.

2.Начните большую копию файла.

3.Пока эта копия находится в процессе, начните маленькую копию файла. Второй процесс копирования очень медленный.

4.Однако если вы вместо этого подключаетесь к другому компьютеру «другим» способом (т. Е. Через IP вместо FQDN или через имя Netbios вместо IP и т.д.), Производительность копирования будет относительно хорошей.

Похоже, что большая копия является «узким местом» исходного соединения, т. Е. Как только вы приостанавливаете большую копию, маленькая копия быстро заканчивается.

Тем не менее, он не полностью насыщает полосу пропускания / стек (поскольку вторая копия через «другое соединение» быстро заканчивается).

Как воспроизвести проблему:

Я создал несколько пакетных файлов, которые демонстрируют это (весь код указан в нижней части вопроса - вам нужно создать 5 отдельных пакетных файлов с именами go.bat, test.bat, copy1.bat, copy2.bat, copybig. летучая мышь):

Настроить:

  1. Создать тестовый каталог на удаленном компьютере B (c:\test)
  2. Создать тестовый каталог на локальном компьютере A (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

Вот что делают командные файлы:

-Проверяет компьютер 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--

2 ответа2

0

Примечание: я не пробовал командные файлы, но вместо этого посмотрел на детали того, как работает Robocopy.

Согласно блогу Марка Минаси, установка флага IPG будет иметь драматический эффект от того, какая полоса пропускания используется в Robocopy. Он утверждает:

Ожидание между блоками Наконец, с параметром /ipg Robocopy позволяет мне уменьшить пропускную способность сети, которую может использовать инструмент. Как и все процедуры копирования, Robocopy копирует данные в блоках по 64 КБ. Как правило, Robocopy просто отправляет один блок за другим без паузы между блоками. Однако, добавив параметр /ipg:n, Robocopy должен ждать n миллисекунд между блоками. Но какую ценность вы используете? Ну, 64KB это около полумиллиона битов. Таким образом, при подключении Ethernet со скоростью 100 МБ копирование этого файла размером 64 КБ займет около 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, потому что он должен примерно ограничить его до 1 Мбит / с. Вы можете использовать калькулятор задержки Robocopy IPG, чтобы определить, какая задержка лучше всего подходит для вашей установки.

Другой вариант - флаг /mt (для многопоточности), но будьте осторожны, так как он не будет работать с /ipg .

0

Я знаю, что это может показаться отговоркой; однако, так как вы говорите, что если IP-адрес введен, то копия идет нормально, поэтому на компьютере, на котором запущен этот пакетный файл, вы можете попытаться изменить файл HOSTS (C:\Windows\System32\HOSTS) и добавить x.x.x.x hostname для некоторых из хостов, которые вы пытаетесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .