Копіювання файлів за допомогою швидкого багатопотокового parsyncfp
Вступ
parsyncfp — це паралельна оболонка для rsync, яка прискорює передавання великих наборів файлів шляхом одночасного запуску кількох процесів rsync. Кожен процес синхронізує власну частину файлів, тому доступна пропускна здатність і ресурси CPU використовуються ефективніше, ніж при використанні одного потоку rsync.
У цьому посібнику описано, коли parsyncfp корисний, як його встановити та як виконати базове передавання даних між двома серверами.
Паралельне копіювання прискорює передавання лише за наявності швидких дисків і стабільної мережі. На повільних дисках або мережевих файлових системах (NFS, SMB, FUSE) збільшення кількості паралельних процесів часто не дає приросту швидкості, а натомість може створити додаткове навантаження на джерело, цільовий сервер або канал між ними. Починайте з невеликої кількості процесів, виміряйте результат і збільшуйте їх кількість лише тоді, коли диски та мережа здатні впоратися з навантаженням.
Як працює parsyncfp
parsyncfp використовує утиліту fpart для розподілу дерева вихідних файлів на частини приблизно однакового розміру, а потім паралельно запускає кілька процесів rsync — по одному для кожної частини. Оскільки fpart розділяє дерево поступово, parsyncfp може почати передавання файлів ще до завершення повного сканування вихідного дерева. Це особливо важливо для дуже великих дерев каталогів.
Утиліту потрібно встановити лише на вихідному сервері. rsync обробляє приймальну сторону у звичайному режимі.
Той самий автор підтримує наступника під назвою parsyncfp2 (pfp2), який містить виправлення помилок і покращення порівняно з parsyncfp, а також додатково підтримує передавання одночасно з кількох вихідних хостів. Для нових розгортань рекомендується використовувати parsyncfp2. У цьому посібнику розглядається класичний parsyncfp; синтаксис команд pfp2 здебільшого сумісний.
Коли parsyncfp корисний
parsyncfp забезпечує найбільший приріст продуктивності, коли:
- джерело містить мільйони невеликих файлів, і rsync більшу частину часу витрачає на операції з метаданими, а не на фактичне передавання даних;
- і джерело, і ціль використовують швидке сховище (NVMe, SSD або добре налаштований RAID);
- мережа між джерелом і ціллю швидка та стабільна (1 Гбіт/с або більше, низька втрата пакетів);
- один процес rsync обмежений продуктивністю CPU або пропускною здатністю одного потоку, а не диском чи мережевим каналом.
Для невеликих каталогів, повільних HDD або вже завантаженої мережі звичайного 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 and newer dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools
Якщо ваш дистрибутив взагалі не містить пакет fpart (наприклад, RHEL 10 або його збірки на момент написання цього посібника) або ви не хочете використовувати EPEL, зберіть fpart із вихідного коду. Офіційний репозиторій — fpart GitHub repository; у README наведено невеликий перелік залежностей для збирання (компілятор C, make та стандартні заголовки бібліотеки C).
Встановлення parsyncfp
parsyncfp — це один Perl-скрипт, розміщений на GitHub. Завантажте його, зробіть виконуваним і перемістіть до каталогу, який входить до вашого PATH, щоб можна було викликати його без зазначення повного шляху:
wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsy ncfp 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.
Зверніть увагу на кінцеву косу риску у вихідному аргументі: www/ копіює вміст каталогу www до цільового каталогу (як у наведеному вище прикладі), тоді як www (без косої риски) копіює сам каталог www, створюючи на цільовому сервері /var/dir/www/. Це така сама поведінка, як у звичайного rsync.
Основні параметри команди
- --NP задає кількість паралельних процесів rsync. Розумна початкова кількість — від 4 до 8; збільшуйте її поступово й лише тоді, коли диски та мережа ще не перевантажені. Встановлення --NP на рівні кількості ядер CPU саме по собі рідко є правильним вибором.
- --altcache задає альтернативний каталог кешу. Він корисний, коли одночасно запускається кілька екземплярів parsyncfp або коли стандартне розташування знаходиться на повільному сховищі. Не рекомендується вказувати розташування на базі tmpfs (наприклад, /tmp у багатьох дистрибутивах), оскільки списки частин для дуже великих дерев вихідних файлів можуть значно збільшитися та спожити багато оперативної пам’яті.
- --startdir задає робочий каталог, який використовується як базовий для вихідних шляхів, указаних далі.
- Аргументи після --startdir — це вихідні каталоги для копіювання (один або кілька, розділених пробілами), після яких указується ціль у стилі rsync у форматі user@host:/path/.
Щоб переглянути повний список параметрів, виконайте parsyncfp --help або перегляньте документацію проєкту.
Корисні додаткові параметри
Після того як базове передавання запрацює, для використання в робочому середовищі варто знати кілька додаткових параметрів:
- --maxbw=500000 обмежує загальну пропускну здатність, яку використовують усі процеси rsync, у КБ/с. Корисно, коли канал спільно використовується іншими сервісами.
- --maxload=12 призупиняє запуск нових процесів rsync, коли середнє завантаження системи перевищує вказане значення. Це може бути корисним на завантажених вихідних серверах, але перед використанням ознайомтеся з наведеним нижче попередженням.
- --chunksize=5G визначає розмір кожної частини fpart. Більші частини зменшують накладні витрати для кожної частини під час передавання великої кількості невеликих файлів; менші частини покращують паралельність під час передавання кількох дуже великих файлів.
- --rsyncopts="-a -s -x" дає змогу передавати додаткові параметри безпосередньо процесам rsync. Використовуйте його для ввімкнення стиснення (-z), встановлення власного розміру блоку або інших налаштувань rsync. Не передавайте --delete через --rsyncopts; причину наведено нижче в розділі «Обмеження».
- --verbose=2 збільшує деталізацію журналювання, що спрощує пошук і усунення проблем під час перших запусків.
Автор проєкту задокументував відому проблему з --maxload: коли parsyncfp проходить через повторювані цикли призупинення та відновлення, деякі вихідні файли можуть не бути передані на цільовий сервер. Якщо ви використовуєте --maxload, встановіть поріг достатньо високим, щоб призупинення ніколи не спрацьовували, або після завершення передавання перевірте результат за допомогою окремої перевірки цілісності.
Обмеження
Навіть на відповідному обладнанні parsyncfp має певні особливості, які варто врахувати перед збільшенням кількості процесів:
- parsyncfp не підтримує безпечне використання параметра rsync --delete. Кожен паралельний процес rsync бачить лише свою частину джерела, тому при передаванні --delete кожен процес намагатиметься видалити на цільовому сервері файли, яких немає в його частині, хоча вони можуть належати до інших частин. Це може призвести до видалення значної частини даних на цільовому сервері. Якщо вам потрібна поведінка --delete, використовуйте звичайний rsync або окрему процедуру очищення.
- parsyncfp не зберігає глобальний порядок файлів між паралельними процесами rsync, тому порядок появи файлів на цільовому сервері непередбачуваний. Це має значення лише для процесів, які під час самого копіювання залежать від часових міток файлів або порядку відображення вмісту каталогів.
- У масивах HDD велика кількість паралельних процесів rsync перетворює послідовний шаблон читання на майже випадковий, що може бути повільніше за один rsync. SSD- та NVMe-накопичувачі значно менше схильні до цього впливу.
- У файлових системах із дуже великою кількістю невеликих файлів накладні витрати на метадані окремих файлів можуть домінувати над часом передавання. Паралельність допомагає лише до певного моменту, після чого приріст продуктивності припиняється.
- Кожен процес rsync відкриває власне SSH-з’єднання з цільовим сервером, тому високі значення --NP збільшують накладні витрати на встановлення з’єднань. У WAN-мережах із втратою пакетів або високою затримкою це може погіршити перевантаження замість підвищення продуктивності. У такому випадку менша кількість процесів із правильно налаштованим rsync (стиснення, більший розмір блоку) часто працює краще, ніж велика кількість паралельних процесів.
Див. також
Якщо parsyncfp виявиться складнішим, ніж вам потрібно, пакет fpart також містить fpsync — простішу оболонку для паралельного rsync від того самого автора. Вона використовує той самий принцип розділення на частини, але має менше параметрів і часто цілком достатня для одноразових передавань.