Копіювання файлів за допомогою швидкого багатопотокового parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

Ukraine Ua
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