Многопоточное копирование файлов Windows: Robocopy, FastCopy, TeraCopy

мультипоточное копирование windows
Быстрый ответ: многопоточное копирование файлов Windows
Используй Robocopy с флагом /MT — он встроен в Windows, установка не нужна.

Базовая команда для копирования по сети:

  • 16 потоков для мелких файлов на NAS: robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10
  • HDD как источник или приёмник — максимум /MT:2, иначе медленнее
  • Один большой файл — потоки не помогают, узкое место — канал
  • FastCopy быстрее на SSD-SSD, TeraCopy удобнее для ручной работы с верификацией

Многопоточное копирование файлов Windows: Robocopy, FastCopy и TeraCopy с реальными примерами

Многопоточное копирование файлов Windows — это способ за 15 минут превратить 4-часовой бэкап в 25-минутный. Без покупок, без установки стороннего ПО — всё нужное уже есть в системе. Разберём как работает, когда помогает, а когда делает только хуже.

Что будет в статье: причины торможения стандартного Проводника, три инструмента с готовыми командами, сравнение скорости на реальных сценариях, типичные ошибки и профилактика.

Времени займёт: настройка базового Robocopy — 5 минут. Прочитать всё — 15 минут. Из нужного: Windows 7 и новее, права на запись в папку-приёмник.

Почему Проводник Windows копирует так медленно

Открываешь Explorer, перетаскиваешь 300 000 мелких файлов на сетевой диск, идёшь пить кофе. Возвращаешься через час — там 12%. Это не вирус и не глюк. Это архитектурное решение Microsoft, которому уже лет двадцать пять.

Самое обидное — дело не в аппаратуре. У тебя гигабитная сеть, NVMe SSD и 64 ГБ оперативки. Explorer всё равно копирует 300 000 файлов за 4 часа. Почему? Потому что инструмент не соответствует задаче.

Один поток — один страдающий процесс

Стандартный Проводник копирует файлы последовательно, в один поток. Взял файл — положил файл — взял следующий. Для одного большого файла на локальном SSD это нормально. Но когда у тебя 100 000 файлов по 5 КБ — это катастрофа.

Каждое обращение к файлу — это системный вызов + запрос к файловой системе + запись метаданных. Для мелких файлов время самих операций чтения/записи ничтожно мало по сравнению с этими накладными расходами. Explorer дисциплинированно ждёт завершения каждой операции перед следующей.

Представь курьера, который берёт одну посылку, едет на склад, возвращается, берёт следующую. Каждый рейс занимает одинаковое время независимо от размера посылки. Маленькая коробка или большой паллет — цикл тот же. Многопоточность — это нанять 16 курьеров одновременно.

Latency сети убивает всё

При копировании по сети к этому добавляется сетевая задержка. Даже в гигабитной локалке пинг до сетевого диска — 0.5-2 мс. Кажется, мелочь. Но на 100 000 файлов это от 50 до 200 секунд только на ожидание ответов, без учёта передачи данных.

SMB-протокол при однопоточном копировании работает как dial-up: отправил запрос — жди ответа — отправил следующий. Пока ждёшь — канал простаивает. На мелких файлах загрузка гигабитного канала может быть 3-7%, всё остальное время — ожидание.

При многопоточном копировании 16 потоков отправляют 16 запросов одновременно. Пока один ждёт ответа — 15 других уже читают или пишут. Latency скрывается за параллельной работой. Загрузка того же гигабитного канала вырастает до 70-90%.

IOPS: реальное узкое место

На HDD узкое место — количество операций ввода-вывода в секунду. Обычный механический диск выдаёт 80-150 IOPS. Если каждый файл — это 2-3 операции (открыть, прочитать, закрыть), то с одним потоком физически не обработаешь больше 40-70 файлов в секунду. На 100 000 файлов — минимум 25 минут только на обращения к диску.

На SSD картина другая. NVMe выдаёт 500 000-1 000 000 IOPS. Один поток при копировании мелких файлов загружает SSD примерно на 0.3-1%. Накопитель простаивает в ожидании следующей команды от приложения. Добавляешь 16 потоков — загрузка вырастает до 5-15%, скорость — в 8-12 раз. Диск всё ещё не загружен полностью, но разница уже колоссальная.


# Смотрим реальную загрузку диска во время копирования
# (запусти в PowerShell пока идёт копирование)
Get-Counter '\PhysicalDisk(_Total)\% Disk Time' -SampleInterval 2 -MaxSamples 10
NVMe SSD меняет всё
NVMe SSD выдаёт 500 000+ IOPS. Один поток просто не может загрузить накопитель — он постоянно простаивает в ожидании следующей команды от приложения. Вот почему многопоточность на SSD-SSD даёт колоссальный выигрыш, а на HDD часто делает хуже.

Как работает многопоточное копирование

Идея простая: вместо одного грузчика нанимаем бригаду. Каждый поток — отдельный рабочий, который независимо копирует свой файл. Пока один ждёт ответа от сетевого диска, второй уже читает следующий файл, третий пишет предыдущий.

Это позволяет скрыть latency за параллельной работой и загрузить канал передачи данных под завязку. При копировании 10 000 мелких файлов по сети разница между 1 потоком и 16 потоками — от 6 до 20 раз по времени.

Когда многопоточность НЕ помогает — честный разговор

Прежде чем ставить 128 потоков — стоп. Вот когда это бесполезно или вредно:

Ситуация Почему потоки не помогут Что делать
Один большой файл Один файл = один поток записи. 256 потоков будут стоять в очереди Максимальная скорость канала, параллельность не нужна
Приёмник — HDD Головка диска мечется между секторами, скорость падает в 2-3 раза Максимум /MT:2, обычно /MT:1
Слабый CPU на NAS 32 потока SMB — это 32 соединения. Celeron J4125 ляжет Смотри на CPU NAS, начинай с /MT:4
Канал 100 Мбит 12.5 МБ/с — физический потолок. Хоть 100 потоков Апгрейд сети или смириться
Сеть Wi-Fi с потерями Ретрансмиссии убивают всю выгоду от параллельности Провод, или /MT:4 максимум
Золотое правило
Сначала найди узкое место — CPU, диск или сеть. Многопоточность лечит latency и недогруженные IOPS. От медленного канала она не лечит ничего.

Системные требования

Компонент Минимум Рекомендуется Примечание
ОС Windows Vista / Server 2008 Windows 10/11, Server 2019+ Robocopy встроен с Vista
Robocopy 6.1 (встроен в Windows 7) Любая актуальная Проверь: robocopy /? в CMD
FastCopy Windows 7 x64 FastCopy 5.x fastcopy.jp, открытый исходник
TeraCopy Windows 7 TeraCopy 3.x codesector.com
RAM для потоков 4 ГБ 16 ГБ+ Каждый поток держит буфер ~4-16 МБ
Сеть 100 Мбит (толку мало) 1 Гбит+ 10 Гбит раскрывает потенциал полностью

На момент публикации актуальна Robocopy версия из Windows 11 24H2 и FastCopy 5.7.7. Перед установкой FastCopy и TeraCopy проверь свежие релизы на официальных сайтах.

Robocopy /MT: многопоточность без установки

Robocopy — Robust File Copy — живёт в каждой Windows начиная с Vista. Никаких установок, никаких лицензий. Флаг /MT включает многопоточность. По умолчанию /MT:8, диапазон — от 1 до 128.

Полный справочник полезных флагов Robocopy

Запомнить все флаги нереально. Вот шпаргалка по самым нужным — те что реально используются в продакшне, а не весь man:

Флаг Что делает Когда нужен
/E Копировать все подпапки включая пустые Всегда для полного бэкапа
/S Копировать подпапки, но не пустые Если пустые папки не нужны
/MT:N N параллельных потоков (1-128) Мелкие файлы по сети, SSD
/Z Режим перезапуска — resume при обрыве WAN, VPN, нестабильная сеть
/MIR Зеркало — удаляет лишнее в приёмнике Синхронизация с очисткой, осторожно
/XO Пропускать файлы старше чем в приёмнике Досинхронизация дельты при миграции
/L List Only — симуляция без реального копирования Тест перед /MIR и другими опасными операциями
/R:N Повторить N раз при ошибке (по умолчанию 1000000) Всегда указывать /R:3
/W:N Ждать N секунд между попытками Всегда указывать /W:10
/LOG:file Писать лог в файл Всегда для автоматических задач
/NP Не показывать прогресс в % (меньше вывода) В скриптах и логах
/COPYALL Копировать всё включая ACL, владельца, аудит Миграция с сохранением прав NTFS
/B Backup mode — обход блокировок файловой системы Открытые файлы, БД, реестр
/IPG:N Пауза N мс между пакетами — снижает нагрузку Бэкап в рабочее время
/XD dir Исключить папки node_modules, .git, Temp
/XF file Исключить файлы по маске *.tmp, *.log, Thumbs.db
/XA:SH Исключить системные и скрытые файлы Пользовательские бэкапы

Базовая команда


REM Многопоточное копирование с 16 потоками на сетевой диск
robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10

REM Расшифровка:
REM /E     - все подпапки включая пустые
REM /MT:16 - 16 параллельных потоков
REM /Z     - режим перезапуска (resume при обрыве соединения)
REM /R:3   - повторить 3 раза при ошибке (по умолчанию 1 000 000 - не шутка)
REM /W:10  - ждать 10 секунд между попытками
Про /R:1000000 - это не фича, это ловушка
По умолчанию Robocopy при ошибке делает миллион попыток. Встретит один заблокированный файл — будет пытаться скопировать его 8333 часа. Всегда указывай /R:3 /W:10. Всегда. Без исключений.

Продвинутый бэкап-скрипт для Task Scheduler


@echo off
REM backup.bat - запускать через Планировщик задач
REM Автор: твой будущий спокойный сон в 3 ночи

set SRC=D:\Production
set DST=\\nas01\backup\production
set LOG=C:\Logs\backup_%date:~-4,4%%date:~-7,2%%date:~0,2%.log

robocopy %SRC% %DST% /E /MT:16 /Z /R:3 /W:10 /NP /LOG:%LOG% ^
  /XD "Temp" "Cache" ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ^
  /XF "*.tmp" "*.log" "Thumbs.db" "desktop.ini" "*.pyc"

REM Robocopy коды возврата - это битовая маска, не стандартный 0/1:
REM 0 - нет изменений. 1 - файлы скопированы. 2 - лишние файлы в приёмнике.
REM 4 - несоответствие. 8 - ошибки копирования. 16 - фатальная ошибка.
REM Коды 0-7 - норма. 8+ - проблема. Учти это в мониторинге.

if %ERRORLEVEL% GEQ 8 (
    echo ОШИБКА БЭКАПА: код %ERRORLEVEL% >> C:\Logs\backup_errors.log
    exit /b 1
)
echo Backup OK, code %ERRORLEVEL%
exit /b 0

Миграция сервера: три фазы без потери данных

Правильная миграция не делается за один запуск. Вот схема для переноса терабайтов без простоя:

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Фаза 1: пятница вечер"] --> B["robocopy /E /MT:32 - начальная синхронизация"]
    B --> C["Фаза 2: воскресенье ночь"]
    C --> D["robocopy /XO - досинхронизация дельты"]
    D --> E["Фаза 3: окно обслуживания"]
    E --> F["robocopy /MIR /MT:8 - финальное зеркало"]
    F --> G["Старый сервер offline - новый в работе"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style C fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style G fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b

REM Фаза 1: начальная синхронизация (запускай в пятницу вечером, иди домой)
robocopy \\old-server\data \\new-server\data /E /MT:32 /Z /R:3 /W:5 /LOG:migration_phase1.log

REM Фаза 2: досинхронизация дельты (воскресенье ночью, сервер ещё работает)
REM /XO - пропускать файлы, которые старше чем в приёмнике
robocopy \\old-server\data \\new-server\data /E /MT:16 /Z /R:3 /W:5 /XO /LOG:migration_phase2.log

REM Фаза 3: финальная синхронизация (в окно обслуживания, сервер остановлен)
REM /MIR - зеркало: удалить лишнее в приёмнике, добавить недостающее
REM ВНИМАНИЕ: /MIR удаляет файлы. Сначала запусти с /L (симуляция).
robocopy \\old-server\data \\new-server\data /E /MIR /MT:8 /R:1 /W:1 /LOG:migration_final.log
Про /MIR - обязательно читай перед запуском
Флаг /MIR удаляет файлы в приёмнике, которых нет в источнике. Перепутай источник и приёмник местами — за 10 секунд лишишься данных. Всегда делай тестовый запуск с /L (List Only) — показывает что будет сделано, но ничего не делает.

REM Сначала симуляция - смотрим что будет удалено и скопировано
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log

REM Проверил лог, убедился - запускаем реально
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10

Как подобрать оптимальное число потоков

Нет универсального числа. Вот эмпирическая точка отсчёта:

Сценарий Рекомендуемые потоки Почему
SSD — SSD (локально) /MT:8-16 Высокие IOPS, можно параллелить
SSD — NAS (1 Гбит), мелкие файлы /MT:16-32 Скрываем latency SMB
SSD — NAS (10 Гбит), мелкие файлы /MT:32-64 Канал широкий, latency высокая
Любой источник — HDD /MT:1-2 HDD не любит параллельный доступ
NAS — NAS (Celeron/Atom CPU) /MT:4-8 Слабый CPU NAS ляжет под нагрузкой
Один большой файл (10+ ГБ) /MT:1 Один файл — один поток. Потоки не помогают

Если хочешь найти оптимум точно — вот бенчмарк-скрипт:


# PowerShell - тестируем 4, 8, 16, 32 потока на реальных данных
$testSrc = "C:\test-data"
$testDst = "\\server\test-dst"

foreach ($threads in @(4, 8, 16, 32)) {
    # Очищаем приёмник перед каждым тестом
    Remove-Item "$testDst\*" -Recurse -Force -ErrorAction SilentlyContinue
    
    $start = Get-Date
    robocopy $testSrc $testDst /E /MT:$threads /NP /NFL /NDL /NJH /NJS 2>&1 | Out-Null
    $elapsed = (Get-Date) - $start
    
    Write-Host "MT:$threads - $([math]::Round($elapsed.TotalSeconds, 1)) сек"
}

FastCopy: когда нужна чистая скорость

FastCopy — японский инструмент от H.Shirouzu, открытый исходник, бесплатно. Работает иначе: вместо классических потоков использует асинхронный I/O с буферизацией. Пока одна порция данных пишется, следующая уже читается. На NVMe SSD это даёт скорость до 2-3 ГБ/с против 800 МБ/с у Explorer.

Скачать: fastcopy.jp

Как работает асинхронный I/O в FastCopy

Разница между потоковым копированием Robocopy и асинхронным I/O FastCopy принципиальная. Robocopy запускает N потоков, каждый из которых независимо копирует свой файл. Это хорошо для мелких файлов и сетевых задач — много параллельных SMB-соединений скрывают latency.

FastCopy работает иначе: он использует Windows OVERLAPPED I/O API. Один поток читает данные из источника в буфер. Другой параллельно записывает из буфера в приёмник. Операции чтения и записи перекрываются во времени — read и write идут одновременно, а не последовательно. Для одного большого файла это даёт скорость близкую к физическому пределу накопителя или канала.

Результат: на локальных NVMe дисках FastCopy часто обгоняет Robocopy на крупных файлах. На мелких файлах по сети — наоборот, Robocopy с /MT:16 обычно быстрее за счёт большего количества параллельных соединений.

Когда FastCopy лучше Robocopy

  • SSD — SSD (локально или по быстрой сети) — FastCopy выигрывает за счёт буферизации
  • Один большой файл или несколько крупных файлов — асинхронный I/O в полную силу
  • Разовые задачи — GUI удобнее командной строки
  • Максимальный throughput без сложной логики синхронизации
  • Клонирование рабочих станций — быстро и без лишних настроек

Когда Robocopy лучше FastCopy

  • Автоматизация через скрипты и Task Scheduler
  • Зеркальная синхронизация с удалением лишнего
  • Сложные фильтры по атрибутам, датам, расширениям
  • Подробные логи и коды возврата для мониторинга
  • Корпоративная среда где нужна аудитоспособность операций

FastCopy в CLI-режиме


REM Клонирование папки пользователя SSD -> SSD
FastCopy.exe /cmd=diff /estimate /speed=full /log "C:\Users\worker" /to="D:\Backup\worker\"

REM /cmd=diff - копировать только изменённые файлы
REM /estimate - показывать оценку времени
REM /speed=full - без ограничения скорости

REM Синхронизация с удалением лишнего (аналог robocopy /MIR)
FastCopy.exe /cmd=sync /estimate /speed=full /log "C:\Source\" /to="D:\Dest\"

REM /cmd=sync - зеркало: удалить в приёмнике то, чего нет в источнике
FastCopy: режимы копирования
copy — обычное копирование, не трогает существующие файлы. diff — копировать только новые и изменённые. sync — полное зеркало с удалением лишнего. move — переместить (удалить из источника). Для бэкапа — diff. Для миграции с очисткой — sync.

TeraCopy: надёжность вместо рекордов скорости

TeraCopy встраивается в правую кнопку мыши и перехватывает стандартное копирование Explorer. Его главная фича — не скорость, а надёжность.

Скачать: codesector.com

Чем TeraCopy отличается от конкурентов

  • Верификация через хеш (CRC32, MD5, SHA-1) — убеждается что файл скопирован без ошибок
  • Заблокированный системой файл не останавливает всю очередь — пропускается, остальные копируются
  • Несколько операций копирования выполняются последовательно, не параллельно — это правильно, иначе медленнее
  • Детальный отчёт: какие файлы скопированы, какие пропущены, какие с ошибками

Про очередь отдельно — это важно. Стандартный Explorer если запустить три копирования одновременно — все три грызутся за один диск. TeraCopy ставит их в очередь и выполняет по одному. Это не ограничение, это правильное поведение. Параллельная запись на один диск медленнее последовательной.

Верификация: зачем она нужна

Копирование файлов — не 100% надёжная операция. Сбой питания в момент записи, битый сектор, переполнение буфера — файл может скопироваться с ошибкой. Без верификации ты об этом не узнаешь. TeraCopy считает хеш исходного файла, копирует, считает хеш копии — сравнивает. Расхождение — ошибка, файл помечается красным.

Robocopy тоже умеет верифицировать, но с флагом /V и только по размеру и дате. Хеш-верификацию нативно не поддерживает. Если нужен гарантированный контроль целостности при копировании важных данных — TeraCopy или отдельный скрипт с Get-FileHash.


# PowerShell: верификация скопированных файлов через хеш
# Запусти после Robocopy для критичных данных

$source = "C:\important-data"
$dest = "\\nas\backup\important-data"
$errors = 0

Get-ChildItem -Path $source -Recurse -File | ForEach-Object {
    $relPath = $_.FullName.Substring($source.Length)
    $destFile = $dest + $relPath
    
    if (Test-Path $destFile) {
        $srcHash = (Get-FileHash $_.FullName -Algorithm MD5).Hash
        $dstHash = (Get-FileHash $destFile -Algorithm MD5).Hash
        
        if ($srcHash -ne $dstHash) {
            Write-Host "MISMATCH: $relPath" -ForegroundColor Red
            $errors++
        }
    } else {
        Write-Host "MISSING: $relPath" -ForegroundColor Yellow
        $errors++
    }
}

Write-Host "Проверка завершена. Ошибок: $errors"
TeraCopy Pro vs Free
Бесплатная версия ограничивает некоторые функции верификации и приоритеты. Для домашнего использования хватит Free. Для корпоратива рассмотри Pro — около $30 разово, не подписка. Не путай.

TeraCopy — не для серверной автоматизации. Для повседневной работы с файлами, когда нужна уверенность что всё скопировалось корректно — отлично.

Альтернативные инструменты: что ещё есть

Robocopy, FastCopy и TeraCopy закрывают 95% задач. Но иногда нужно что-то специфическое.

Copy Handler: контроль скорости и расписания

Copy Handler — Windows-only, бесплатный, открытый исходник. Встраивается в Explorer как TeraCopy, но его главная фича — детальный контроль скорости и очередей копирования.

Зачем нужен: бэкап идёт в рабочее время и съедает весь сетевой канал. Copy Handler позволяет задать расписание — с 9 до 18 скорость максимум 50 МБ/с, с 18 до 9 без ограничений. Robocopy умеет только /IPG для грубого снижения нагрузки, у Copy Handler это точная регулировка.

Скачать: copyhandler.com

Ultracopier: кросс-платформенный вариант

Ultracopier работает на Windows, Linux и macOS. Если у тебя смешанная среда и нужно унифицированное решение — вариант. По скорости уступает FastCopy, по гибкости уступает Robocopy. Но единый инструмент для всех платформ иногда важнее максимальной производительности.

rsync через Cygwin или WSL: когда нужна Unix-мощь

rsync — стандарт синхронизации в Linux/Unix. Под Windows доступен через WSL (Windows Subsystem for Linux) или Cygwin. Преимущество: delta-синхронизация на уровне блоков внутри файлов. Если изменился один мегабайт в 10-гигабайтном файле — rsync передаст только этот мегабайт. Robocopy передаёт файл целиком.


# rsync через WSL - синхронизация с Linux-сервером по SSH
wsl rsync -avz --progress --stats -e ssh /mnt/c/data/ user@linux-server:/backup/data/

# Многопоточный rsync через GNU parallel (для мелких файлов)
wsl find /mnt/c/data -type f | wsl parallel -j 16 rsync -az {} user@server:/backup/{}

Для синхронизации с Linux-серверами или NAS под TrueNAS/Linux — rsync через WSL часто лучший выбор. Для Windows-to-Windows — Robocopy проще и не требует WSL.

Краткое сравнение всех инструментов

Инструмент Цена Лучше всего для Слабее всего в Нужна установка
Robocopy Бесплатно Автоматизация, бэкап по сети GUI, скорость SSD-SSD Нет (встроен)
FastCopy Бесплатно Скорость, локальный SSD Автоматизация, логи Да
TeraCopy Free / Pro $30 Верификация, повседневная работа Скорость, серверная автоматизация Да
Copy Handler Бесплатно Контроль скорости, расписание Скорость, CLI Да
rsync (WSL) Бесплатно Delta-синхронизация, Linux NAS Настройка под Windows Да (WSL)

Хватит теории. Вот результаты на реальном железе: i5-12400, 32 ГБ RAM, источник — NVMe SSD, приёмник — гигабитная сеть, NAS с RAID5 на 5400 RPM HDD.

Сценарий Инструмент 1 поток 8 потоков 16 потоков Итог
10 000 файлов по 5 КБ — NAS (1 Гбит) Robocopy 4 мин 22 сек 0 мин 41 сек 0 мин 28 сек x9 быстрее
1 файл x 50 ГБ — NAS (1 Гбит) Robocopy 6 мин 58 сек 7 мин 02 сек 7 мин 05 сек Без разницы
100 000 файлов по 1 КБ — NAS (1 Гбит) Robocopy 38 мин 10 сек 5 мин 12 сек 3 мин 44 сек x10 быстрее
10 ГБ смешанных файлов — SSD (локально) FastCopy 52 сек 18 сек 17 сек x2.9 быстрее
10 000 файлов по 5 КБ — HDD (локально) Robocopy 1 мин 12 сек 1 мин 48 сек 2 мин 31 сек 1 поток быстрее!
500k файлов — сервер по 10 Гбит Robocopy >3 часов 24 мин 14 мин (32 потока: 9 мин) x20 быстрее

Главный вывод: мелкие файлы по сети — многопоточность даёт x6-x10. Один большой файл — потоки бесполезны. Запись на HDD — потоки вредят. На SSD оптимум обычно 8-16, дальше рост незначительный.

Практические лайфхаки для ускорения

Лайфхак 1: архивируй мелкие файлы перед копированием

Миллион файлов по 1 КБ — кошмар для любого копировщика. Упакуй их в архив — вместо миллиона операций I/O получаешь одну большую. Выигрыш по времени — от 5 до 20 раз.


REM Упаковываем без сжатия (только упаковка, максимальная скорость)
7z a -mx0 -mmt8 backup.7z folder\

REM -mx0 - без сжатия
REM -mmt8 - 8 потоков архиватора

REM Если нужно сжать (медленнее, но меньше размер)
7z a -mx5 -mmt8 backup.7z folder\

REM Копируем один архив вместо миллиона файлов
robocopy C:\ \\server\backup backup.7z /R:3 /W:10

Лайфхак 2: исключай мусор — не копируй лишнее


REM Типичный бэкап проекта без мусора разработчика
robocopy C:\Projects \\nas\backup\projects /E /MT:16 /R:3 /W:5 ^
  /XD ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ".next" ".nuxt" ^
  /XF "*.log" "*.tmp" "*.pyc" "Thumbs.db" "desktop.ini" ^
  /LOG:backup.log /NP

Лайфхак 3: параллельный запуск нескольких задач


# PowerShell: три задачи Robocopy параллельно
$jobs = @(
    @{Src="C:\Projects"; Dst="\\nas\backup\projects"; Threads=16},
    @{Src="C:\Databases"; Dst="\\nas\backup\dbs"; Threads=8},
    @{Src="C:\Documents"; Dst="\\nas\backup\docs"; Threads=16}
)

$runningJobs = foreach ($job in $jobs) {
    Start-Job -ScriptBlock {
        param($s, $d, $t)
        robocopy $s $d /E /MT:$t /Z /R:3 /W:10 /NP /NFL /NDL
    } -ArgumentList $job.Src, $job.Dst, $job.Threads
}

$runningJobs | Wait-Job | Receive-Job
Write-Host "Все задачи завершены"

Лайфхак 4: /Z для нестабильных соединений

Флаг /Z (Restartable mode) позволяет продолжить копирование файла с места обрыва. Актуально для VPN, WAN, 4G. Минус — небольшой overhead около 5-10% на стабильных соединениях.


REM Для ненадёжного соединения - VPN, WAN, 4G
robocopy C:\data \\remote-office\backup /E /MT:8 /Z /R:10 /W:30 /LOG:remote_backup.log

Лайфхак 5: Staging через быстрый локальный SSD

Если источник и приёмник оба медленные — например, два разных NAS через 1 Гбит — можно использовать быстрый локальный SSD как промежуточную площадку.

Логика: NAS-источник → локальный SSD (максимальная скорость первого плеча). Потом локальный SSD → NAS-приёмник (максимальная скорость второго плеча). Суммарное время то же, но каждое плечо работает на своём максимуме. Плюс: если что-то пошло не так на втором этапе, данные уже есть локально.


REM Плечо 1: NAS-источник -> локальный SSD (быстро)
robocopy \\nas-source\data C:\Staging /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase1.log

REM Плечо 2: локальный SSD -> NAS-приёмник (тоже быстро)
robocopy C:\Staging \\nas-dest\backup /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase2.log

REM Очищаем staging если нужно место
REM Только после проверки что всё скопировалось!
REM Remove-Item C:\Staging\* -Recurse -Force

Лайфхак 6: ограничение скорости чтобы не убивать канал в рабочее время

Бэкап в рабочее время — классика конфликта. Люди жалуются что интернет тормозит, ты объясняешь что это важный бэкап, они объясняют что им нужен Zoom. Решение: ограничение полосы через инструмент или через настройку QoS на коммутаторе.

Robocopy не умеет ограничивать скорость сам. Варианты: Copy Handler с настройкой лимита, или Robocopy с /IPG (InterPacketGap) для снижения нагрузки:


REM /IPG - пауза между пакетами в миллисекундах (снижает нагрузку на сеть)
REM Значения: 0 = максимум, 10 = ~50% нагрузки, 25 = ~30% нагрузки
REM Подбирай экспериментально под свой канал

robocopy C:\data \\server\backup /E /MT:8 /Z /R:3 /W:10 /IPG:10 /LOG:backup.log

REM Для дневного бэкапа не мешающего работе - /IPG:20 или /IPG:30

Типичные ошибки: как убить NAS за 5 минут

Честно скажу: все эти ошибки я видел в продакшне. Некоторые — больше одного раза у разных людей.

Ошибка 1: /MT:128 на механические диски

128 потоков на HDD — это не оптимизация, это издевательство над железом. Головка диска мечется по пластинам. Результат: скорость падает в 3-5 раз ниже однопоточной, температура диска растёт, latency зашкаливает. Иногда слышно характерный хруст механики — вот тебе звуковое подтверждение ошибки.

Лечение: для HDD — максимум /MT:2. Выигрыш от двух потоков на HDD минимален, но хотя бы не вредит.

Ошибка 2: 32 потока на домашний NAS

Synology DS220+ с Celeron J4025 под нагрузкой 32 параллельных SMB-соединений — это около 80% загрузки CPU. Добавь RAID-пересчёт и антивирус — и у тебя висящий NAS, из которого не работает даже веб-интерфейс. Остальные пользователи офиса присылают в чат весёлые сообщения.

Лечение: для NAS на слабом CPU — /MT:4 или /MT:8 максимум. Смотри на загрузку CPU NAS через веб-интерфейс во время копирования.


REM Проверяем пропускную способность сети - iperf3
REM Сервер (на NAS или удалённой машине):
iperf3 -s

REM Клиент (у себя):
iperf3 -c SERVER_IP -t 30 -P 8
REM -P 8 - 8 параллельных потоков TCP
REM Если результат близок к физическому пределу канала - потоки не помогут

Ошибка 3: /MIR без тестового запуска

Уже писал выше — повторю для надёжности. Флаг /MIR удаляет файлы. Всегда запускай сначала с /L.


REM СНАЧАЛА - симуляция, смотрим лог
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log

REM ПОТОМ - реальный запуск
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10

Ошибка 4: игнорирование сетевого bottleneck

Поставил 64 потока, а скорость та же — 118 МБ/с. Причина: гигабитный свитч дал потолок 125 МБ/с, и больше неоткуда взять. Потоки тут не помогут. Нужен 10GbE или смирись.

Как проверить: запусти iperf3 (команда выше). Если получаешь 940+ Мбит/с — канал полный, узкое место не в нём. Если 400 Мбит/с — смотри на коммутатор и кабели.

Ошибка 5: копирование VSS-снапшота без флага /B

Базы данных, файлы Outlook PST, реестр — всё это открыто системой и заблокировано для копирования обычными средствами. Robocopy без флага /B пропустит такие файлы с ошибкой Error 32 или вообще зависнет.

Флаг /B (Backup mode) использует SeBackupPrivilege для обхода блокировок файловой системы. Требует прав администратора.


REM Копирование заблокированных файлов через Backup mode
REM Запускать от имени администратора!
robocopy C:\Windows\System32\config \\nas\backup\registry /B /R:3 /W:5 /LOG:registry_backup.log

REM Для баз данных - лучше использовать VSS (Volume Shadow Copy)
REM Это создаёт снапшот тома на момент времени - файлы не заблокированы

# PowerShell: бэкап через VSS-снапшот (файлы не заблокированы)
# Требует прав администратора

$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
$shadowId = $shadow.ShadowID
$shadowPath = (Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).DeviceObject

# Монтируем снапшот как диск
cmd /c "mklink /d C:\VSSShadow $shadowPath\"

# Копируем из снапшота - файлы не заблокированы
robocopy "C:\VSSShadow\Data" "\\nas\backup\data" /E /MT:16 /R:3 /W:10 /LOG:vss_backup.log

# Убираем за собой
Remove-Item C:\VSSShadow -Force
(Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).Delete()

Ошибка 6: не проверяешь коды возврата Robocopy в скриптах

Robocopy возвращает не стандартный 0 (успех) / 1 (ошибка). Он использует битовую маску. Код 1 у Robocopy — это успех, файлы скопированы. Если твой скрипт проверяет %ERRORLEVEL% == 0 как условие успеха — он будет считать каждый успешный бэкап ошибкой.

Код Значение Это норма?
0 Нет изменений, нечего копировать Да
1 Файлы скопированы успешно Да
2 В приёмнике есть лишние файлы (не скопированы обратно) Да
4 Несоответствие файлов (Mismatched) Проверить
8 Ошибки копирования Нет — смотри лог
16 Фатальная ошибка, нет доступа Нет

@echo off
robocopy %SRC% %DST% /E /MT:16 /R:3 /W:10

REM Правильная проверка кода возврата Robocopy
if %ERRORLEVEL% GEQ 8 (
    echo ОШИБКА БЭКАПА: код %ERRORLEVEL%
    exit /b 1
)
REM Коды 0-7 - всё нормально
echo Бэкап завершён успешно, код %ERRORLEVEL%
exit /b 0

Архитектура взаимодействия компонентов

Вот как устроен поток данных при многопоточном копировании на сетевой диск:

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Robocopy /MT:16"] --> B["Поток 1"]
    A --> C["Поток 2"]
    A --> D["Поток N"]
    B --> E["NTFS - источник SSD"]
    C --> E
    D --> E
    E --> F["Сетевой адаптер 1 Gbps"]
    F --> G["SMB / CIFS протокол"]
    G --> H["NAS - RAID приёмник"]
    H --> I["Файловая система NAS"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style F fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style G fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style I fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b

Оранжевый — сетевой адаптер — типичное узкое место на 1 Гбит. Если здесь потолок — количество потоков не имеет значения.

Безопасность и профилактика

Права доступа

Robocopy по умолчанию копирует с правами текущего пользователя. Для бэкапа с сохранением ACL и атрибутов:


REM Копирование с сохранением прав NTFS (требует права администратора)
robocopy C:\data \\server\backup /E /MT:16 /COPYALL /R:3 /W:10 /LOG:backup.log

REM /COPYALL = /COPY:DATSOU
REM D - данные, A - атрибуты, T - временные метки
REM S - права безопасности (NTFS ACL), O - владелец, U - аудит
REM Без /COPYALL используется /COPY:DAT по умолчанию

Важный момент про права: если запускаешь Robocopy от обычного пользователя и копируешь в сетевую папку — убедись что у пользователя есть права на запись в приёмник. Частая ошибка: бэкап-задача в Task Scheduler работает под учёткой сервисного пользователя, у которого нет прав на целевую шару. Задача завершается с кодом 16 (Access Denied) а ты узнаёшь об этом через месяц когда нужно восстановить файл.

Выделенная сервисная учётная запись для бэкапов

Никогда не запускай автоматические бэкапы от имени доменного администратора. Создай отдельную учётку специально для бэкапов с минимальными правами: чтение на источнике, запись на приёмнике. Если скрипт скомпрометируют — ущерб минимальный. Принцип наименьших привилегий — не паранойя, это гигиена.


REM Запуск Robocopy от имени сервисной учётки через runas
REM (лучше настроить в Task Scheduler - там можно указать учётку напрямую)
runas /user:DOMAIN\backup-svc "robocopy C:\data \\server\backup /E /MT:16 /R:3 /W:10"

Мониторинг бэкапов


# PowerShell: парсим лог Robocopy и отправляем уведомление при ошибке
$logPath = "C:\Logs\backup_$(Get-Date -Format 'yyyyMMdd').log"
$errorCount = (Get-Content $logPath | Select-String "ERROR" | Measure-Object).Count

if ($errorCount -gt 0) {
    $body = "Бэкап завершён с $errorCount ошибками. Лог: $logPath"
    Send-MailMessage -To "admin@company.ru" -From "backup@company.ru" `
        -Subject "BACKUP ERROR" -Body $body -SmtpServer "smtp.company.ru"
}

Если нет корпоративного почтового сервера — можно отправить уведомление через Telegram Bot API:


# PowerShell: уведомление в Telegram при ошибке бэкапа
$botToken = "ВАШ_BOT_TOKEN"
$chatId = "ВАШ_CHAT_ID"
$message = "BACKUP ERROR на $(hostname): $errorCount ошибок. $(Get-Date)"

$uri = "https://api.telegram.org/bot$botToken/sendMessage"
Invoke-RestMethod -Uri $uri -Method Post -Body @{
    chat_id = $chatId
    text = $message
}

Таблица портов (если копирование по сети через SMB)

Порт Протокол Назначение Доступен снаружи?
445 TCP SMB (основной для файловых шар) Только внутри LAN, никогда не снаружи
139 TCP NetBIOS Session (устаревший SMB) Нет
137-138 UDP NetBIOS Name Service Нет
5985 TCP WinRM (PowerShell Remoting) Только через VPN
SMB 445 наружу - это не оптимизация, это инцидент
Порт 445 открытый в интернет — классика жанра для WannaCry и аналогов. Если нужен удалённый доступ к файловым шарам — только через VPN, не через проброс портов.

Резервное копирование самих бэкапов

Что бэкапить: папку с логами Robocopy, конфиги скриптов и задач Планировщика. Где хранить: минимум два места, одно физически отдельно от первого. Как проверять: раз в месяц делай тестовое восстановление одного файла.


REM Проверка что файл восстановим - копируем обратно во временную папку
robocopy \\nas\backup\production C:\Restore_Test "important_file.db" /R:1 /W:1
REM Сравниваем с оригиналом
fc /b C:\Restore_Test\important_file.db D:\Production\important_file.db

Безопасное обновление инструментов

Robocopy обновляется вместе с Windows через Windows Update — делать ничего не нужно. FastCopy и TeraCopy обновляются вручную. Перед обновлением: проверь changelog на предмет изменений поведения флагов, протестируй скрипты на тестовой папке, не обновляй в день плановых бэкапов.

Шпаргалка: что использовать в каком случае

Задача Инструмент Команда / действие
Бэкап по расписанию, сетевой диск Robocopy /E /MT:16 /Z /R:3 /W:10 через Task Scheduler
Миграция сервера Robocopy Три фазы: /MT:32 — /XO — /MIR
Клонирование рабочей станции SSD-SSD FastCopy /cmd=diff /speed=full
Повседневное копирование с верификацией TeraCopy Интеграция в правую кнопку Explorer
Бэкап без нагрузки на канал в рабочее время Copy Handler Лимит скорости по расписанию
Миллион мелких файлов — любой инструмент тормозит 7-Zip + Robocopy Сначала архив -mx0 -mmt8, потом копируем один файл

Устранение типичных проблем

Проверка что копирование работает правильно


REM Проверяем количество файлов в источнике и приёмнике
robocopy C:\source \\server\dest /E /L /NP /NFL /NDL /NJH /NJS

REM Сравнение содержимого - что есть в источнике но не в приёмнике
robocopy C:\source \\server\dest /E /L /LOG:diff.log

Формат таблицы: ошибка — причина — решение

Ошибка Причина Решение
Robocopy зависает на одном файле навсегда /R:1000000 по умолчанию Всегда указывай /R:3 /W:10
Скорость не растёт при увеличении потоков Узкое место — канал сети или HDD-приёмник Проверь iperf3, посмотри на тип диска приёмника
NAS перестаёт отвечать во время копирования Слабый CPU NAS перегружен соединениями Уменьши /MT до 4-8, проверь CPU NAS в веб-интерфейсе
Error 5: Access Denied на отдельных файлах Файлы заблокированы приложениями или нет прав NTFS Добавь /XA:SH для пропуска системных, или запусти от имени администратора с /COPYALL
Error 32: файл занят другим процессом Файл открыт другим приложением во время копирования Добавь /B (Backup mode) для обхода блокировок — требует привилегий
Скорость на HDD упала после увеличения /MT HDD не любит параллельный доступ, головка мечется Верни /MT:1 или /MT:2 для HDD
FastCopy не запускается из командной строки Путь к FastCopy.exe не в PATH Указывай полный путь: «C:\Program Files\FastCopy\FastCopy.exe»

Как проверить реальную скорость копирования


# PowerShell: замеряем скорость текущей операции Robocopy
# Запусти в отдельном окне пока идёт копирование

$logFile = "C:\Logs\current_backup.log"
$prevSize = 0
while ($true) {
    Start-Sleep -Seconds 5
    if (Test-Path $logFile) {
        $lastLine = Get-Content $logFile -Tail 5
        Write-Host (Get-Date -Format "HH:mm:ss") $lastLine[-1]
    }
}

FAQ: вопросы из Яндекса

Почему многопоточное копирование файлов не ускоряет работу после настройки?

Три варианта. Первый: узкое место — сетевой канал или HDD-приёмник, потоки тут не помогают. Второй: файлы крупные (1+ ГБ каждый) — один поток на файл, параллельность не работает. Третий: слабый CPU на NAS перегружен соединениями и сам становится узким местом. Запусти iperf3 для проверки канала, посмотри CPU NAS в веб-интерфейсе во время копирования. Если CPU выше 80% — дело в NAS, уменьши количество потоков.

Как проверить что Robocopy /MT работает правильно?

Запусти диспетчер задач — вкладка «Производительность» — «Сеть». При правильно работающей многопоточности загрузка сетевого адаптера должна быть значительно выше чем без /MT. Для мелких файлов по гигабитной сети — ожидай 60-90% загрузки канала против 5-15% без /MT. Также проверяй лог Robocopy — в строке итогов («Files») должно быть ненулевое количество скопированных файлов, а не только «Skipped».

Что делать если Robocopy зависает на одном файле и не двигается дальше?

Это /R:1000000 по умолчанию — Robocopy пытается скопировать проблемный файл миллион раз. Останови текущий процесс (Ctrl+C), добавь в команду /R:3 /W:10 и перезапусти. Если файл нужен — добавь /XF «имя_файла» для пропуска конкретного файла или /XA:SH для пропуска системных и скрытых. Если файл заблокирован приложением — используй флаг /B (Backup mode) от имени администратора.

FastCopy или Robocopy — что быстрее для копирования на NAS?

Зависит от типа данных. FastCopy выигрывает на крупных файлах и SSD-SSD локально за счёт асинхронного I/O. Robocopy с /MT:16-32 лучше на мелких файлах по сети за счёт параллельных SMB-соединений. Для автоматизированного бэкапа на NAS — Robocopy удобнее из-за гибких фильтров, подробных логов и кодов возврата для мониторинга. Для разовой задачи «скопировать максимально быстро» — протестируй оба на твоём железе через iperf3 и бенчмарк-скрипт из статьи.

Сколько потоков ставить в Robocopy /MT для домашнего NAS Synology?

Начни с /MT:8 и смотри на загрузку CPU NAS в веб-интерфейсе Resource Monitor. Если CPU выше 70% — уменьши до /MT:4. Если меньше 40% и скорость тебя не устраивает — попробуй /MT:16. На Synology с процессорами J4125, R1600 — обычно оптимум /MT:8-12 для гигабитного подключения. На более мощных моделях с Intel Core или AMD Ryzen — /MT:16-32 нормально.

Можно ли использовать Robocopy для синхронизации папок в обе стороны?

Нет. Robocopy копирует только в одном направлении: источник — приёмник. Для двусторонней синхронизации нужны другие инструменты: FreeFileSync (бесплатный, открытый исходник, есть под Windows), DirSync Pro, или rsync через WSL. Robocopy можно запустить в обе стороны вручную с флагом /XO (пропускать старые), но это не настоящая двусторонняя синхронизация — конфликты при одновременном изменении файла с обеих сторон не обрабатываются.

Как ускорить копирование на внешний HDD по USB?

Внешний HDD по USB — особый случай. USB 3.0 даёт до 400-500 МБ/с теоретически, реально 150-250 МБ/с. Механический HDD внутри — 80-150 IOPS. Многопоточность здесь не помогает и обычно вредит: головка диска не любит параллельный доступ. Используй Robocopy с /MT:1 или /MT:2. Если нужно скопировать много мелких файлов — упакуй их в архив 7-Zip без сжатия (/mx0) и копируй один архив. Это всегда быстрее миллиона мелких файлов на HDD.

Итог

Вот что ты теперь умеешь: определять где реальное узкое место перед тем как крутить потоки, запускать Robocopy с нормальными параметрами вместо дефолтных, не убивать NAS 128 потоками, выбирать между Robocopy, FastCopy и TeraCopy под конкретную задачу.

Самое важное — не количество потоков, а понимание где реально зажато. Диагностика занимает 5 минут и спасает от часов безрезультатного перебора настроек. Запусти iperf3, посмотри на тип диска приёмника, загляни в CPU NAS. Потом уже крути потоки.

Команда которая закрывает 80% задач сисадмина:


robocopy ИСТОЧНИК ПРИЁМНИК /E /MT:16 /Z /R:3 /W:10 /LOG:backup.log /NP

Если работаешь с мелкими файлами и хочешь выжать максимум — добавь в скрипт бенчмарк на 4/8/16/32 потока. Один раз замерял — потом работает с оптимальными настройками. Это лучше чем каждый раз гадать.

И помни: /R:1000000 по умолчанию — это не фича, это ловушка. Всегда переопределяй /R:3 /W:10. Всегда. Особенно в продакшне.

Если не заработало - пиши в комментарии
Опиши: тип дисков источника и приёмника, тип сети (1/10 Гбит, Wi-Fi), количество файлов и примерный размер, что конкретно не так — скорость, ошибка, зависание. Разберёмся.
Андрей Анатольевич
Author: Андрей Анатольевич

Руководитель ИТ / Кризис-менеджер 25 лет в IT: от инженера в МегаФоне до руководителя отдела. Знаю, как выглядит бардак: нестабильные сети, устаревшая инфраструктура, конфликты в команде, раздутые сроки. Помогаю бизнесу выходить из кризиса: навожу порядок в легаси, стабилизирую то, что разваливается, выстраиваю прогнозируемые процессы. Не раз возвращал к жизни ИТ-структуры — знаю цену хаосу. 📍 Ищу проект для полной реорганизации / стабилизации. 📬 Telegram: @over_dude ✉️ mail@it-apteka.com

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх