Ваша загрузка останавливается на четырёх гигабайтах архива в двенадцать гигабайт, и привычка, выученная у менеджеров загрузок, говорит нажать «продолжить». rsync не возобновит поток TCP, потому что этот поток исчез вместе с последней повторной передачей туннеля. Что он может — сохранить уже полученные байты и использовать их как основу для следующей попытки, а это другой механизм с другим набором правил. Выбранные флаги решают, произойдёт ли это повторное использование вообще.

Новая попытка восстанавливает состояние, а не продолжает поток

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

Именно этот последний вопрос объясняет, зачем хранить частичный файл. Копия у получателя даёт rsync материал для сравнения, и алгоритм передаёт только те различия, которые может определить. Это всё равно новая передача метаданных и новый проход по источнику, поэтому сэкономленное время пропорционально тому, какая часть файла совпадает, а не тому, насколько продвинулось прошлое соединение. Если получатель ничего не сохранил, следующая попытка — полная копия, сколько бы гигабайт ни переместила первая.

Решите, где живёт многоразовый фрагмент

Поведение по умолчанию записывает частичный файл по целевому пути, из-за чего наполовину записанный архив виден под окончательным именем. --partial-dir переносит его в выбранный вами каталог, и руководство описывает этот каталог как сохраняемый для использования в качестве данных более поздней передачей. Относительное имя разрешается внутри каталога назначения, и это именно то, что нужно, когда две стороны могут иметь разную структуру.

rsync -e ssh --partial-dir=.rsync-partial --info=progress2 -- \
  large-archive.bin [email protected]:/srv/incoming/

Порядок важен и на стороне назначения: частичному каталогу нужно достаточно места для фрагмента, а тому — достаточно и для завершённого файла. Заполнение целевого тома посреди передачи даёт сбой, который выглядит как сетевая проблема, но ею не является, и может оставить сохранённый фрагмент обрезанным. Проверьте свободное место на принимающем хосте до запуска, а не после его провала. Несколько секунд с df -h по тому же пути SSH — самая дешёвая из возможных проверок плана.

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

Запустите ту же копию, а не более умную

Повторное использование действует, только когда источник и назначение по-прежнему описывают один и тот же объект. Тот же путь, то же имя, тот же файл. Переименование источника или указание на другой каталог назначения начинает новое сравнение ни с чем полезным.

Не добавляйте --whole-file в расчёте на дельта-поведение. Этот параметр велит rsync копировать весь файл без сравнения скользящих контрольных сумм, что разумно на быстром локальном канале и в точности неверно после неудачной дальней загрузки. --inplace тоже меняет картину: он пишет прямо в файл назначения, поэтому прерывание оставляет файл, смешивающий старое и новое содержимое, без отдельного фрагмента, на который можно опереться.

Строка прогресса сообщает суммарный прогресс передачи. Это не сигнал завершения. Число, достигающее ста процентов при ещё открытом соединении, означает, что данные отправлены, а не что получатель что-то переименовал, синхронизировал или принял.

Принимайте объект только после того, как он совпал

Сначала подтвердите код выхода, затем сравните результат, а не полагайтесь на отсутствие ошибок. Проверка размера ловит большинство обрезанных передач; сравнение контрольных сумм ловит остальные, и оба варианта дешевы по сравнению с повторным запуском загрузки.

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

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

Когда предел — это канал, а не флаг

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

Сравните разрешённые альтернативные пути с тем же файлом и тем же назначением и отметьте, откуда каждый возобновляется после прерывания. Этот единственный столбец скажет о загрузке в двенадцать гигабайт через VPN больше, чем любая пиковая скорость, измеренная в коротком тесте.

Похожие статьи