Почему rsync не использует дельта-передачу для локальных файлов?

25

У меня большой iso-образ, который в данный момент загружается торрент-клиентом с включенным резервированием пространства: это означает, что размер файла не меняется, а некоторые фрагменты в (4 Mib) постоянно меняются из-за загрузки.

При загрузке 90% я делаю начальную rsync, чтобы сэкономить время:

$ rsync -Ph DVD.iso / media / another-hdd /
отправка списка добавочных файлов

DVD.iso
       2,60G 100% 40,23 МБ / с 0:01:01 (xfer # 1, to-check = 0/1)

отправлено 2.60G байт получено 73 байта 34.59M байт / сек
общий размер 2.60G ускорение составляет 1.00

Затем, когда файл полностью загружен, я снова выполняю rsync:

total size is 2.60G   speedup is 1.00

Speedup = 1 говорит, что дельта-передача не использовалась, хотя 90% файла не изменилось, целевой каталог находится на другой ФС, и копирование занимает несколько минут. Почему бы не попытаться ускорить передачу ?! Как я могу заставить rsyncиспользовать дельта-перевод?

kolypto
источник
6
То, что вы делаете, не имеет никакого смысла. Цель rsync - ускорить передачу файлов по сети, а не локально. Чтобы найти различия, он должен прочитать и источник, и пункт назначения. За то время, которое требуется, чтобы прочитать место назначения локально, чтобы найти различия, вы также можете просто сделать обычную копию. Просто скачайте файл в пункт назначения, а не копируйте его.
Псуси
1
Так что он просто не использует delta-xfer, потому что, работая локально, быстрее копировать, чем вычислять хэши? Если да -
выложите
9
При определенных обстоятельствах чтение может быть быстрее записи на локальный диск. Это также может уменьшить износ SSD. Это, безусловно, правильный вопрос, и ответ очень ценен для меня.
HRJ
2
@psusi, кроме комментария HRJ выше, также рассмотрим случай, когда целевой файл был перекомпонован (например, на btrfs или ocfs2). Минимизация записей во время синхронизации может иметь огромное значение для общего использования пространства.

Ответы:

20

Согласно странице руководства , psusi прав:

-W, --whole-file : передача может быть быстрее, если этот параметр используется, когда полоса пропускания между исходным и целевым компьютерами превышает полосу пропускания на диск (особенно, когда «диск» фактически является сетевой файловой системой). Это значение по умолчанию, когда и источник, и пункт назначения указываются в качестве локальных путей, но только если не действует опция пакетной записи.

liganic
источник
10
О, спасибо! Я ошибся этой строкой :) Чтобы включить дельта-перенос, используйте-no-W
kolypto
1
На моей системе -no-Wне работает только длинный вариант -no-whole-file. Причина, по которой мне нужен этот переключатель, заключается в том, что я создаю резервную копию и имею большие файлы (например, изображения), которые не имеют одинакового времени модификации. Это НАМНОГО быстрее, ускорение составляет 163,26, чтобы синхронизировать эти файлы, используя дельта-передачу в моей локальной файловой системе.
Джесси Ветер Странник
6
@JessetheWindWanderer, длинная опция --no-whole-file(пожалуйста, обратите внимание на двойную --в начале).
Эдди С.
Спасибо Эдди С. Я бы отредактировал свой комментарий, если бы мог понять, как мы :-(
Странник Джесси Ветра
17

Прямой ответ на этот вопрос:

Используйте --no-Wфлаг, чтобы вызвать дельта-сжатие, независимо от того, локально оно или удаленно.

Обновление: похоже, что есть еще история. delta compression, Кажется, включается только между получать и обрабатывать передачи в Rsync. При выводе файла в файловую систему, rsyncвозможно, все равно выписать весь файл (ы), даже если включено дельта-сжатие.

Смотрите расследование "Вакан Танка" здесь .

HRJ
источник
2
--no-Wвсегда передавать весь файл в моем случае. Пожалуйста, проверьте unix.stackexchange.com/questions/291156/…
Tanka
@WakanTanka Это интересно! Я обновил свой ответ.
HRJ
3

По умолчанию rsync сначала создает новую копию целевого файла, а затем заменяет ее по различным причинам безопасности. Вы можете переопределить это, указав --inplaceвместе с --no-whole-file. Это говорит rsync, что нужно выполнить редактирование целевого файла на месте, принимая на себя различные риски (обычно незначительные для этой ситуации), как описано на странице руководства.

kartik_subbarao
источник
0

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

В случае использования OP я также рекомендую отключить предварительное выделение, чтобы можно было синхронизировать разреженную копию, что будет намного быстрее. Для загрузки не беспокойтесь о фрагментации, если вы не используете очень древнюю файловую систему, такую ​​как VFAT. В частности, файлы мультимедиа не читаются при максимальной производительности носителя, поэтому их дефрагментация является пустой тратой усилий.

Чтобы редко копировать каталог загрузок в целевой том, я рекомендую эти флаги и операции в следующем порядке:

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

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

Поскольку он делает разреженные и размещенные на месте дельта-копии, вы можете запускать его многократно, не неся при этом большого дополнительного ввода-вывода. Даже если у вас одновременно работает 20 торрентов, это не усилит записи в месте назначения и не увеличит объемы источника / места назначения.

Wil
источник
Что вы имеете в виду под "редко" здесь, Уил? Насколько я могу судить, это не совсем отражает реальное значение слова.
Юлий
@Julius: это означает именно то, что подразумевается - скопируйте файлы с полной поддержкой разреженного выделения, поэтому, например, ваши фильмы HDR объемом 40 ГБ не будут занимать больше места в месте назначения, чем в источнике. То же самое с образами дисков VirtualBox. Как уже говорилось, OP должен будет отключить предварительное распределение, чтобы это работало.
Wil