Назад | Перейти на главную страницу

Разница в rsync между параметрами --checksum и --ignore-times

Может ли кто-нибудь уточнить различия между --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:

  • В случае, если rsync не работает (или не доверяет дельта-кодировке), тогда проверка (контрольная сумма и кодирование) будет выполнена дважды.
  • Также может быть случай, когда дельта-кодирование намного медленнее, чем 128-битное контрольное суммирование MD4.

Обе --checksum и --ignore-times будет "довольно медленно", но --ignore-times вероятно, даже медленнее (из-за 2 возможных выше).

Хороший вопрос - напишите, если вы обнаружите разницу в производительности на практике.

Из info rsync в отношении --checksum option - «Поскольку это контрольное суммирование всего файла для всех файлов на обеих сторонах соединения происходит в дополнение к автоматическим проверкам контрольной суммы, которые происходят во время передачи файла, эта опция может быть довольно медленной».