Как ускорить rsync?

44

Я использую rsync для синхронизации каталога на моем внешнем жестком диске USB. Это около 150 гигабайт данных. 50000+ файлов, я думаю.

Он запускает свою первую синхронизацию в данный момент, но копирует файлы со скоростью всего 1-5 МБ / с. Это кажется невероятно медленным для корпуса USB 2.0. Других передач на диске тоже нет.

Вот варианты, которые я использовал:

rsync -avz --progress /mysourcefolder /mytargetfolder

Я использую Ubuntu Server 9.10.

Джейк Уилсон
источник
2
Вы уверены, что получаете соединение USB2? копирование (не rsync) или другая операция записи выполняется с нормальной скоростью? если нет, вы пробовали копировать / другие операции записи с другим USB-портом / кабелем?
Квик-кихот
См. Также serverfault.com/questions/43014/… - там люди также предлагают использовать две переданные tarкоманды или cpio.
Blaisorblade

Ответы:

38

Для первой синхронизации просто используйте

cp -a  /mysourcefolder /mytargetfolder

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

также ... опция -z, вероятно, снижает производительность, вам не следует ее использовать, если вы не передаете данные по медленной ссылке.

user23307
источник
3
rsync называется так, потому что он предназначен для удаленной синхронизации и по этой причине не подходит для локально подключенного тома.
msanford
6
Предполагается, что его можно использовать и для местных переводов, и он гораздо более гибкий. Это возможно только излишне для первой синхронизации.
Blaisorblade
1
rsync также является односторонней синхронизацией. Очень хорошо для резервного копирования на сервер или с сервера. Однако, если вы хотите локальную двухстороннюю синхронизацию со съемным диском, вы можете проверить csync csync.org/get-it, чтобы не перепутать с csync2, который является совершенно другим проектом.
Джесси Ветер Странник
3
rsync -avz --progress /mysourcefolder/ /mytargetfolderили вы получите копию mysourcefolderвнутренних , mytargetfolderа не зеркальное отображение содержимого
редактор
3
Этот ответ не отвечает на вопрос. Вопрос был о том, как оптимизировать rsync, а не заменять его командой cp.
oemb1905
38

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

не использует сжатие -z

и используя --inplace

ускоряет его до производительности жестких дисков или сети

сжатие использует много процессора

не используя InPlace делает Жёсткий трэш много (он использует временный файл , прежде чем создавать окончательный)

сжатие и не использование на месте лучше делать через Интернет (медленная сеть)

НОВИНКА: знайте о месте назначения ... если включено NTFS-сжатие ... это сильно замедляет большие файлы (я бы сказал, 200 МБ +), rsync почти застопорился, это вызвано этим.

Скотт Крамер
источник
Сжатие NTFS медленно работает с большими файлами
Скотт Крамер
Я не вижу ничего о '--inline' на странице руководства
Энтони
1
Это '- на месте'
Скотт Крамер
26

Используйте -Wопцию. Это отключает сравнение дельта / разность. Когда время / размеры файла различаются, rsync копирует весь файл.

Также удалите -zопцию. Это полезно только для сжатия сетевого трафика.

Теперь rsyncдолжно быть так же быстро, как cp.

vdboor
источник
6
Незначительное примечание: -zполезно только для низкоскоростного сетевого трафика. Если ваша сеть достаточно быстрая, это замедлит работу, поскольку вы будете ограничены процессором.
WhyNotHugo
3
Эти советы значительно ускорили передачу моих файлов между двумя устройствами NAS, спасибо!
djhworld
2
но обратите внимание, что в соответствии с man-страницей сказано для -W: «Это значение по умолчанию, когда и источник, и пункт назначения указываются как локальные пути, но только в том случае, если опция пакетной записи не действует».
Голян Лонг
14

Первое - количество файлов в этом случае будет основным фактором. Это средний размер 3 МБ каждый. Вероятно, узкое место io влияет на скорость в случае OP. Больше здесь - это довольно сухое чтение, но изображение на обложке того стоит.

Итак, используя rsync для копирования в пустой каталог? Вот несколько способов ускорить его:

  1. Нет -z - определенно не используйте -z как в ОП.
  2. --no-compress может ускорить вас. Это может оказать наибольшее влияние ... мой тест был 13 000 файлов, общий размер 200 МБ и использование rsync 3.1.3. Я синхронизировался с другим разделом на том же внутреннем диске SSD. С --no-compress я получаю 18 МБ / с, а без него - 15 МБ / с. cp, кстати, получает 16 Мбит / с. Это гораздо меньше среднего размера файла. Кроме того - я не могу найти документацию для --no-compress. Я узнал об этом из этого поста на stackexchange.com.
  3. -W копировать файлы целиком - всегда используйте это, если вы не хотите сравнивать различия; не берите в голову, что смысл rsync состоит в том, чтобы сравнить различия и только обновить изменения.
  4. -S хорошо обрабатывать разреженные файлы - не повредит, если у вас нет разреженных файлов.
  5. --exclude-from или что-то подобное для исключения файлов, которые вам могут не понадобиться, сократят время, но не увеличат скорость передачи.
  6. Это возможно, если вы отправите вывод в такой файл rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err- первый> в основном печатает файл со всем, что вы обычно видите, а 2> относится к сообщениям об ошибках.
  7. Наконец, может помочь запуск нескольких экземпляров rsync для разных частей вашего перевода.

Моя команда будет:

rsync -avAXEWSlHh /source /destination --no-compress --info=progress2 --dry-run

Если бы все выглядело хорошо, я бы удалил «--dry-run» и отпустил его. A, X и E охватывают расширенные атрибуты и разрешения, не охватываемые -a, l - для мягких ссылок, H - для жестких ссылок, а h - для чтения человеком.

Обновление уже синхронизированного каталога на USB-накопителе, или на том же диске, или по сети, потребует различных команд rsync для максимизации скорости передачи.

Бонус - вот справочная страница rsync , и если вы хотите проверить скорость вашего жесткого диска, bonnie ++ - хороший вариант, а для скорости вашей сети попробуйте iperf .


Посту уже почти десять лет, но поисковым системам он нравится, и я продолжаю его видеть. Это хороший вопрос, и я не думаю, что лучшим ответом на вопрос «как ускорить rsync» должно быть «используйте вместо этого cp».

Фин Хиршофф
источник
1
Что касается пункта 7), я мог бы значительно улучшить производительность, используя традиционный жесткий диск в качестве источника, расширив буфер опережающего чтения с помощью «blockdev --setra 8192 / dev / sdX». Так что я намерен уменьшить головы ищет.
user2480144
Я обнаружил, что S (обработка разреженных файлов) на самом деле медленная. Удаление этого сделало это намного быстрее
Сэмми Гергачи
2

Вы не говорите, какой размер у ваших файлов. Если имеется много небольших файлов, то это снизит общую скорость передачи за счет увеличения задержки перемещения головы как на исходном, так и на целевом дисках, поскольку инструмент открывает новые файлы, а ОС сохраняет записи каталога и другие метаданные (например, журнал файловой системы, если вы используете ведение журнала метаданных (например, ext3 / ext4 и NTFS) по умолчанию) во время передачи. Процесс копирования файла будет «в ходу» только для больших объектов, когда происходит простая массовая передача.

Дэвид Спиллетт
источник
0

Вы определенно хотите попробовать rclone . Эта вещь сумасшедшая быстро:

$ tree / usr [...] 26105 каталогов, 293208 файлов

$ sudo rclone sync / usr / home / fred / temp -P -L --transfers 64

Передано: 17,929G / 17,929 ГБайт, 100%, 165,692 МБ / с, ETA 0s Ошибки: 75 (повторная попытка может помочь) Проверок: 691078/691078, 100% Передано: 345539/345539, 100% Истекшее время: 1m50.8s

Это локальная копия с и на твердотельный накопитель LITEONIT LCS-256 (256GB).

Вы можете добавить --ignore-checkum при первом запуске, чтобы сделать его еще быстрее.

Фредерик Н.
источник
0

Избегайте

  • -z/ --compress: сжатие будет загружать только процессор, так как передача происходит не по сети, а по ОЗУ.
  • --append-verify: возобновить прерванную передачу. Это звучит как хорошая идея, но имеет опасный случай сбоя: любой файл назначения того же размера (или больше), что и источник, будет игнорироваться. Кроме того, он проверяет суммы всего файла в конце, что означает отсутствие значительного ускорения --no-whole-fileпри добавлении опасного случая сбоя.

использование

  • -S/ --sparse: превратить последовательности нулей в разреженные блоки
  • --partialили -Pчто --partial --progress: сохранить любые частично переданные файлы для последующего возобновления. Примечание: файлы не будут иметь временного имени, поэтому убедитесь, что больше никто не ожидает использовать место назначения, пока не будет завершена полная копия.
  • --no-whole-fileтак что все, что нужно отправить, использует дельта-передачу. Чтение половины частично переданного файла часто происходит намного быстрее, чем повторная запись.
  • --inplace чтобы избежать копирования файла (но только если ничто не читает место назначения, пока не завершится вся передача)
Том Хейл
источник