rsync --sparse передает все данные

У меня есть некоторые образы VM, которые нужно синхронизировать каждый день. Файлы виртуальной машины разрежены.

чтобы сохранить сетевой трафик, я хочу передать только реальные данные изображений. Я пробую это с -- sparse option в rsync, но на сетевом трафике я вижу, что весь размер передается по сети, а не только реальное использование данных.

Если я использую rsync-zv --sparse, то только реальный размер передается по сети, и все в порядке. Но я не хочу сжимать файл из-за использования процессора.

не должен ли параметр --sparse передавать только реальные данные, а "нулевые данные" создаются локально для сохранения сетевого трафика?

существует ли обходной путь без сжатия?

спасибо!

2 ответов


посмотрите эта дискуссия, в частности ответ.

кажется, что решение сделать rsync --sparse затем rsync --inplace.

первый, --sparse, вызов, также используйте --ignore-existing чтобы предотвратить уже переданные разреженные файлы для перезаписи и -z для сохранения сетевых ресурсов.

второй вызов, --inplace должны обновить только измененные куски. Здесь сжатие необязательный.

см. Также этот пост.

обновление

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

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

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

алгоритм, обобщенный в четыре этапа.

  1. принимающая сторона β отправляет контрольные суммы блоков в размере S назначения файл B.
  2. отправляющая сторона α определить блоки, которые соответствуют в исходном файле A, при любом смещении.
  3. α передает β список инструкций, сделанных из дословных, несоответствующих, данных или соответствующих ссылок на блоки.
  4. β восстанавливает весь файл из этих инструкций.

обратите внимание, что rsync обычно восстанавливает файл B как временный файл T, затем заменяет B С T. В этом случае он должен записать весь файл.

на --inplace не помогает rsync от написания блоков соответствует α, как можно было бы себе представить. Они могут совпадать при разных смещениях. Сканирование B второй раз, чтобы взять новые контрольные суммы данных является запретительным с точки зрения производительности. Блок, соответствующий тому же смещению, на котором он был прочитан Шаг первый можно было пропустить, но rsync не делай этого. В случае разреженного файла нулевой блок B будет соответствовать для каждого нулевого блока A, и его придется переписать.

на --inplace просто причины rsync пишите на B, вместо T. Он перепишет весь файл.


вы можете попытаться изменить уровень сжатия на наименьшее значение (используйте опцию --compress-level=1). Самый низкий уровень сжатия, по-видимому, достаточен для уменьшения трафика для разреженных файлов. Но я не знаю, как влияет использование CPU.