Может ли кто-нибудь уточнить различия между --checksum
и --ignore-times
варианты rsync?
Я понимаю следующее:
--checksum
Если размер файла и время совпадают, он будет вычислять контрольную сумму на обоих концах, чтобы увидеть, действительно ли файлы идентичны.
--ignore-times
«Перенести» каждый файл, независимо от того, одинаково ли время файла на обоих концах. Поскольку он по-прежнему будет использовать алгоритм дельта-передачи, если файл действительно идентичен, ничего не передается.
Это техническая разница, но, насколько я могу судить, семантически это одно и то же.
Итак, вот что мне интересно:
Как обычно, rsync
пропускает файлы, если файлы имеют одинаковый размер и время на исходной и конечной сторонах. Это эвристика, которая обычно является хорошей идеей, поскольку предотвращает rsync
от необходимости проверять содержимое файлов, которые, скорее всего, идентичны на исходной и конечной сторонах.
--ignore-times
говорит rsync
, чтобы отключить эвристику времени и размера файлов и, таким образом, безоговорочно передавать ВСЕ файлы из источника в место назначения. rsync
затем перейдет к чтению каждого файла на исходной стороне, так как ему нужно будет либо использовать свой алгоритм дельта-передачи, либо просто отправить каждый файл целиком, в зависимости от того, --whole-file
вариант был указан.
--checksum
также изменяет эвристику времени и размера файла, но здесь он игнорирует время и проверяет только размеры. Передаются файлы на исходной и конечной сторонах, различающиеся по размеру, поскольку они, очевидно, разные. Для файлов с одинаковым размером используется контрольная сумма (с MD5 в rsync
версии 3.0.0+ или с MD4 в более ранних версиях), и те, у которых обнаружены разные суммы, также переносятся.
В случаях, когда исходная и конечная стороны в основном совпадают, --checksum
приведет к тому, что контрольные суммы большинства файлов будут суммироваться с обеих сторон. Это может занять много времени, но в результате по сети будет передаваться минимум данных, особенно если используется алгоритм дельта-передачи. Конечно, это только выигрыш, если у вас очень медленные сети и / или очень быстрый процессор.
--ignore-times
, с другой стороны, будет отправлять больше данных по сети, и это приведет к чтению всех исходных файлов, но, по крайней мере, это не будет налагать дополнительную нагрузку на вычисление множества криптостойких хеш-сумм на исходном и целевом ЦП. Я ожидал, что этот вариант будет работать лучше, чем --checksum
когда ваши сети быстрые и / или ваш процессор относительно медленный.
Я думаю, что буду использовать только --checksum
или --ignore-times
если бы я передавал файлы в место назначения, где подозревалось, что содержимое некоторых файлов было повреждено, но время модификации которых не было изменено. Я не могу придумать какой-либо другой веской причины использовать любой вариант, хотя, вероятно, есть и другие варианты использования.
Контрольная сумма также полезна, если вы использовали другую систему для синхронизации файлов, которая не сохранила метки времени. Контрольная сумма будет передавать только файлы, которые разные, И обновлять все временные метки на принимающей стороне, чтобы они соответствовали
Одна деталь: опция контрольной суммы проверяет весь файл с одной стороны, затем весь файл с другой стороны. Если ваши файлы несколько большие, это убивает параллелизм.
Кроме того, если у вас есть огромные файлы, вы, скорее всего, столкнетесь с тайм-аутом с --checksum
, как и с -I
.
В --ignore-times
вариант, вероятно, приведет к дельта-кодированию всех файлов, а алгоритм дельта-передачи (дельта-кодирование) будет, по крайней мере, таким же медленным, как и контрольная сумма.
Я не знаю, если rsync --ignore-times
достаточно умен, чтобы избежать "автоматической проверки после передачи" в частых случаях, когда дельта-передача не приводит к передаче ничего.
Для --ignore-times
:
Обе --checksum
и --ignore-times
будет "довольно медленно", но --ignore-times
вероятно, даже медленнее (из-за 2 возможных выше).
Хороший вопрос - напишите, если вы обнаружите разницу в производительности на практике.
Из info rsync
в отношении --checksum
option - «Поскольку это контрольное суммирование всего файла для всех файлов на обеих сторонах соединения происходит в дополнение к автоматическим проверкам контрольной суммы, которые происходят во время передачи файла, эта опция может быть довольно медленной».