rsync --sparse передает все данные
У меня есть некоторые образы VM, которые нужно синхронизировать каждый день. Файлы виртуальной машины разрежены.
чтобы сохранить сетевой трафик, я хочу передать только реальные данные изображений. Я пробую это с -- sparse option в rsync, но на сетевом трафике я вижу, что весь размер передается по сети, а не только реальное использование данных.
Если я использую rsync-zv --sparse, то только реальный размер передается по сети, и все в порядке. Но я не хочу сжимать файл из-за использования процессора.
не должен ли параметр --sparse передавать только реальные данные, а "нулевые данные" создаются локально для сохранения сетевого трафика?
существует ли обходной путь без сжатия?
спасибо!
2 ответов
посмотрите эта дискуссия, в частности ответ.
кажется, что решение сделать rsync --sparse
затем rsync --inplace
.
первый, --sparse
, вызов, также используйте --ignore-existing
чтобы предотвратить уже переданные разреженные файлы для перезаписи и -z
для сохранения сетевых ресурсов.
второй вызов, --inplace
должны обновить только измененные куски. Здесь сжатие необязательный.
см. Также этот пост.
обновление
я считаю, что приведенные выше предложения не решат вашу проблему. Я также верю, что rsync
не является правильным инструментом для этой задачи. Вы должны искать другие инструменты, которые дадут вам хороший баланс между эффективностью ввода-вывода сети и диска.
Rsync
был разработан для эффективного использования одного ресурса, сети. Он предполагает чтение и запись в сеть намного дороже, чем чтение и запись исходных и целевых файлов.
мы предполагаем, что две машины связаны с низкой пропускной способностью с высокой задержкой двунаправленный канал связи. алгоритм rsync, аннотация.
алгоритм, обобщенный в четыре этапа.
- принимающая сторона β отправляет контрольные суммы блоков в размере S назначения файл B.
- отправляющая сторона α определить блоки, которые соответствуют в исходном файле A, при любом смещении.
- α передает β список инструкций, сделанных из дословных, несоответствующих, данных или соответствующих ссылок на блоки.
- β восстанавливает весь файл из этих инструкций.
обратите внимание, что rsync
обычно восстанавливает файл B как временный файл T, затем заменяет B С T. В этом случае он должен записать весь файл.
на --inplace
не помогает rsync
от написания блоков соответствует α, как можно было бы себе представить. Они могут совпадать при разных смещениях. Сканирование B второй раз, чтобы взять новые контрольные суммы данных является запретительным с точки зрения производительности. Блок, соответствующий тому же смещению, на котором он был прочитан Шаг первый можно было пропустить, но rsync
не делай этого. В случае разреженного файла нулевой блок B будет соответствовать для каждого нулевого блока A, и его придется переписать.
на --inplace
просто причины rsync
пишите на B, вместо T. Он перепишет весь файл.
вы можете попытаться изменить уровень сжатия на наименьшее значение (используйте опцию --compress-level=1
). Самый низкий уровень сжатия, по-видимому, достаточен для уменьшения трафика для разреженных файлов. Но я не знаю, как влияет использование CPU.