EUR
european

EUR

usa

USD

Russian Ru
Ex. VAT Ex. VAT 0%

Копирование файлов с помощью быстрой многопоточной обработки parsyncfp

Введение

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

В этом руководстве рассматривается, когда parsyncfp полезен, как его установить и как выполнить базовую передачу между двумя серверами.

Warning

Параллельное копирование ускоряет передачу только на быстрых дисках и при стабильной сети. На медленных дисках или сетевых файловых системах (NFS, SMB, FUSE) увеличение числа параллельных процессов часто не даёт прироста скорости и вместо этого создаёт дополнительную нагрузку на источник, цель или канал между ними. Начните с небольшого числа процессов, измерьте результат и увеличивайте количество, только если диски и сеть справляются.

Как работает parsyncfp

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

Инструмент нужно установить только на исходном сервере. rsync обрабатывает принимающую сторону как обычно.

Тот же автор поддерживает преемника под названием parsyncfp2 (pfp2), который содержит исправления ошибок и улучшения по сравнению с parsyncfp, а также дополнительно поддерживает отправку с нескольких исходных хостов одновременно. Для новых развёртываний parsyncfp2 является рекомендуемым выбором. Это руководство охватывает классический parsyncfp; синтаксис команд pfp2 во многом совместим.

Когда parsyncfp полезен

parsyncfp даёт наибольший выигрыш, когда:

  • источник содержит миллионы мелких файлов, при которых rsync тратит большую часть времени на операции с метаданными, а не на собственно передачу данных;
  • и источник, и цель используют быстрое хранилище (NVMe, SSD или хорошо настроенный RAID);
  • сеть между источником и целью быстрая и стабильная (1 Гбит/с или больше, низкая потеря пакетов);
  • один процесс rsync ограничен процессором или пропускной способностью на поток, а не диском или каналом.

Для небольших каталогов, медленных вращающихся дисков или насыщенной сети обычно достаточно простого rsync.

Каталог ~/.parsyncfp

parsyncfp создаёт кэш-каталог с именем ~/.parsyncfp на исходном сервере. Внутри вы найдёте подкаталог fpcache, в котором хранятся журнал fpart, файлы PID запущенных процессов rsync и файлы чанков, перечисляющие, какие пути должен копировать каждый rsync. Файлы журналов имеют метку даты и не перезаписываются между запусками, поэтому предыдущие запуски можно просмотреть позже.

Если вы хотите запустить несколько экземпляров parsyncfp одновременно, укажите каждому из них отдельное расположение кэша с помощью опции --altcache. parsyncfp обнаруживает другие запущенные экземпляры при старте и предупреждает о них, поэтому случайные пересекающиеся запуски становятся видны рано.

Установка зависимостей

Сам parsyncfp опирается на rsync (транспорт) и fpart (для разбиения исходного дерева на порции). Установите оба на исходном сервере.

В Debian и Ubuntu:

apt-get install rsync fpart

В RHEL, CentOS Stream, AlmaLinux и Rocky Linux пакета fpart нет в базовых репозиториях. Сначала включите репозиторий EPEL, затем установите оба пакета:

dnf install epel-release dnf install rsync fpart

Некоторые пакеты EPEL зависят от пакетов из репозитория PowerTools или CRB, который по умолчанию отключён. Включите нужный для вашей версии:

# RHEL/AlmaLinux/Rocky Linux 9 и новее dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools

Info

Если ваш дистрибутив вообще не поставляет fpart (например, RHEL 10 или его пересборки на момент написания) или вы предпочитаете не использовать EPEL, соберите fpart из исходников. Официальный репозиторий — репозиторий fpart на GitHub; в README перечислен небольшой набор зависимостей для сборки (компилятор C, make и стандартные заголовки библиотеки C).

Установка parsyncfp

parsyncfp — это один Perl-скрипт, размещённый на GitHub. Скачайте его, сделайте исполняемым и переместите в каталог из вашего PATH, чтобы вызывать его без указания полного пути:

wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/

Проверьте, что скрипт запускается:

parsyncfp --help

Если появился экран справки, parsyncfp готов к использованию.

Настройка SSH-доступа к цели

parsyncfp запускает rsync поверх SSH, поэтому исходный сервер должен иметь возможность войти на целевой без пароля. Сгенерируйте пару ключей на источнике (если её ещё нет) и скопируйте открытый ключ на цель:

ssh-keygen ssh-copy-id user@target_host

Замените user@target_host именем пользователя и IP-адресом или именем хоста вашего целевого сервера. После этого шага следующая команда должна подключаться без запроса пароля:

ssh user@target_host

Выполнение передачи

Типичная команда parsyncfp выглядит так:

parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/

Эта команда запускает 8 процессов rsync, использует /dir/local/tmp в качестве кэш-каталога и копирует содержимое /dir/local/www в /var/dir/ на целевом хосте 192.168.67.1.

Info

Обратите внимание на завершающий слеш в аргументе источника: www/ копирует содержимое каталога www в цель (как в примере выше), тогда как www (без слеша) копирует сам каталог www, создавая /var/dir/www/ на цели. Это то же поведение, что и у обычного rsync.

Основные параметры команды

  • --NP задаёт число параллельных процессов rsync. Разумная отправная точка — от 4 до 8; увеличивайте число постепенно и только если диски и сеть ещё не насыщены. Установка --NP равным числу ядер процессора сама по себе редко является правильным выбором.
  • --altcache задаёт альтернативный кэш-каталог. Полезен, когда вы запускаете несколько экземпляров parsyncfp одновременно или когда расположение по умолчанию находится на медленном носителе. Избегайте указания на расположение на основе tmpfs (например, /tmp во многих дистрибутивах), поскольку списки чанков для очень больших исходных деревьев могут вырасти, а вы не хотите, чтобы они съедали оперативную память.
  • --startdir задаёт рабочий каталог, используемый как база для следующих за ним исходных путей.

Аргументы после --startdir — это исходные каталоги для копирования (один или несколько, разделённых пробелом), за которыми следует цель в стиле rsync в форме user@host:/path/.

Полный список опций смотрите, выполнив parsyncfp --help или обратившись к документации upstream.

Полезные дополнительные опции

Когда базовая передача работает, стоит знать несколько опций для производственных запусков:

  • --maxbw=500000 ограничивает суммарную пропускную способность всех процессов rsync, в КБ/с. Полезно, когда канал используется совместно с другими сервисами.
  • --maxload=12 приостанавливает запуск новых процессов rsync, когда средняя нагрузка системы превышает указанное значение. Полезно на загруженных исходных серверах, но перед использованием прочтите предупреждение ниже.
  • --chunksize=5G управляет размером каждого чанка fpart. Более крупные чанки уменьшают накладные расходы на чанк при передаче с большим количеством мелких файлов; более мелкие чанки улучшают параллелизм при передаче нескольких очень больших файлов.
  • --rsyncopts="-a -s -x" позволяет передавать дополнительные флаги непосредственно базовым процессам rsync. Используйте его, чтобы включить сжатие (-z), задать пользовательский размер блока или применить другие настройки rsync. Не передавайте --delete через --rsyncopts; см. раздел «Ограничения» ниже, почему это небезопасно.
  • --verbose=2 повышает детализацию журналирования, что упрощает диагностику при первых запусках.

Warning

Автор upstream задокументировал известную проблему с --maxload: когда parsyncfp проходит через повторяющиеся циклы приостановки и возобновления, некоторые исходные файлы могут не передаться на цель. Если вы используете --maxload, установите порог достаточно высоким, чтобы приостановки никогда не срабатывали, или проверьте результат отдельной проверкой целостности после завершения передачи.

Ограничения

Даже на подходящем оборудовании у parsyncfp есть компромиссы, которые стоит знать перед увеличением числа процессов:

  • parsyncfp не поддерживает безопасно опцию --delete rsync. Каждый параллельный процесс rsync видит только свою порцию источника, поэтому если передать --delete, каждый процесс попытается удалить на цели файлы, которых нет в его порции, то есть файлы, законно принадлежащие другим порциям. Это может стереть большие части цели. Используйте обычный rsync (или отдельный проход очистки), когда нужна семантика --delete.
  • parsyncfp не сохраняет глобальный порядок файлов между параллельными процессами rsync, поэтому порядок, в котором файлы появляются на цели, непредсказуем. Это важно только для рабочих процессов, зависящих от меток времени файлов или порядка перечисления каталогов во время самого копирования.
  • На массивах HDD множество параллельных процессов rsync превращают то, что было бы последовательным шаблоном чтения, в почти случайный, что может быть медленнее одного rsync. Накопители SSD и NVMe затронуты гораздо меньше.
  • На файловых системах с очень большим количеством мелких файлов накладные расходы на метаданные на файл могут доминировать во времени передачи. Параллелизм помогает до определённого предела, затем выходит на плато.
  • Каждый процесс rsync открывает собственное SSH-соединение с целью, поэтому высокие значения --NP умножают накладные расходы на установку соединения. На WAN-каналах с потерей пакетов или высокой задержкой это может усугубить перегрузку, а не улучшить её. В этом случае меньшее число процессов с настроенным rsync (сжатие, больший размер блока) часто работает лучше, чем много параллельных.

Смотрите также

Если parsyncfp окажется тяжелее, чем вам нужно, пакет fpart также включает fpsync — более простую параллельную обёртку rsync от того же автора. Она использует ту же идею чанкирования, но с меньшим числом опций и часто достаточна для разовых передач.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA