Швидше rsync величезного каталогу, який не був змінений


13

Ми використовуємо rsync для резервного копіювання серверів.

На жаль, мережа на деяких серверах повільна.

Щоб rsync виявив, що у величезних каталогах нічого не змінилося, потрібно до п'яти хвилин. Ці величезні дерева каталогів містять безліч невеликих файлів (близько 80k файлів).

Я думаю, що клієнти rsync надсилають дані для кожного з 80k файлів.

Оскільки мережа працює повільно, я б хотів уникати надсилати інформацію в 80 разів про кожен файл.

Чи є спосіб сказати rsync зробити хеш-суму дерева підкаталогу?

Таким чином клієнт rsync надішле лише кілька байтів для величезного дерева каталогів.

Оновлення

На сьогодні моя стратегія полягає у використанні rsync. Але якщо тут підійде інший інструмент, я можу переключитися. Обидва (сервер і клієнт) знаходяться під моїм контролем.

Оновлення2

В одному дереві каталогів є 80k файлів . Кожна окрема директорія не має більше 2-х файлів або підкаталогів

Оновлення3

Деталі про повільність мережі:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

Розмір файлу tmp / list: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

Висновок: scp має однакову швидкість (не дивно)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

Швидкість: 1,2 Мб / с


1
Ви можете прочитати на zsync. Я сам не користувався цим, але з того, що я прочитав, він заздалегідь надає метадані на стороні сервера і може просто прискорити передачу у вашому випадку. Це, можливо, варто перевірити все одно. Крім того, єдине інше, про що я знаю, - це синхронізація рівня реального часу в блоці, яка поставляється з деякими рішеннями Сан / Нас.
Аарон

Відповіді:


36

Деякі непов'язані моменти:

80K - це багато файлів.

80 000 файлів в одному каталозі? За замовчуванням жодна операційна система чи додаток не справляються із цією ситуацією. Ви просто помітили цю проблему з rsync.

Перевірте свою версію rsync

Сучасна rsync обробляє великі каталоги набагато краще, ніж раніше. Обов’язково використовуйте останню версію.

Навіть старий rsync досить добре обробляє великі каталоги через великі латентні посилання ... але файли 80k не великі ... він величезний!

Однак, використання пам'яті rsync прямо пропорційно кількості файлів у дереві. Великі каталоги займають велику кількість оперативної пам’яті. Повільність може бути пов'язана з відсутністю оперативної пам’яті з будь-якої сторони. Зробіть пробний запуск під час перегляду використання пам'яті. Linux використовує будь-яку залишену оперативну пам’ять як кеш диска, тому якщо у вас мало оперативної пам'яті, менше кешування диска. Якщо у вас закінчилася оперативна пам’ять, і система почне використовувати swap, продуктивність буде дуже поганою.

Переконайтесь, що контрольна сума не використовується

--checksum(або -c) вимагає читання кожного блоку кожного файлу. Ви, мабуть, зможете обійтись за поведінкою за замовчуванням просто зчитуванням часових змін (збережених у inode).

Роботу розділіть на невеликі партії.

Є такі проекти, як Gigasync, які " Зробіть навантаження робочим навантаженням, використовуючи perl для повторення дерева каталогів, створивши невеликі списки файлів для передачі з rsync."

Додаткове сканування каталогу буде великою накладними витратами, але, можливо, це буде чистий виграш.

За замовчуванням в ОС для цієї ситуації не робиться.

Якщо ви використовуєте Linux / FreeBSD / тощо з усіма типовими настройками, продуктивність буде жахливою для всіх ваших програм. За замовчуванням передбачаються менші каталоги, щоб не витрачати оперативну пам’ять на негабаритні кеші.

Налаштуйте свою файлову систему, щоб краще обробляти великі каталоги: Чи великі розміри папок сповільнюють продуктивність IO?

Подивіться на "кеш імені"

BSD-подібні операційні системи мають кеш, який прискорює пошук імені до inode ("cache namei"). Для кожного каталогу є кеш namei. Якщо він занадто малий, це перешкода, ніж оптимізація. Оскільки rsync робить lstat () для кожного файлу, доступ до inode є доступним для кожного з файлів 80k, що може дути ваш кеш.

Розглянемо іншу файлову систему

XFS був розроблений для роботи з більшими каталогами. Дивіться велику кількість файлів у одній директорії Filesystem

Можливо, 5 хвилин - це найкраще, що ти можеш зробити.

Подумайте про обчислення кількості блоків дисків, які читаються, і обчисліть, наскільки швидко ви повинні розраховувати, що апаратне забезпечення зможе прочитати стільки блоків.

Можливо, ваші очікування занадто високі. Поміркуйте, скільки дискових блоків потрібно прочитати, щоб зробити rsync без змінених файлів: кожному серверу потрібно буде прочитати каталог і прочитати одну вкладку на файл. Припустимо, що нічого не кешовано, тому що, мабуть, 80k файли, ймовірно, підірвали ваш кеш. Скажімо, що це 80k блоків, щоб зберегти математику просто. Це приблизно 40 мільйонів даних, які слід прочитати за кілька секунд. Однак якщо між кожним блоком потрібно шукати диск, це може зайняти набагато більше часу.

Тож вам потрібно буде прочитати близько 80 000 блоків дисків. Як швидко ваш жорсткий диск може це зробити? Враховуючи, що це випадковий ввід / вивід, не довгий лінійний зчитування, 5 хвилин може бути досить відмінним. Це 1 / (80000/600), або диск читається кожні 7,5 мс. Це швидко чи повільно для вашого жорсткого диска? Це залежить від моделі.

Орієнтир проти чогось подібного

Ще один спосіб задуматися над цим - це такий. Якщо жоден файл не змінився, ls -Llrвиконує однакову кількість активності на диску, але ніколи не читає жодних файлових даних (лише метадані). Час, який ls -Llrпотрібно запустити, - ваша верхня межа.

  • Чи rsync (без файлів змінено) значно повільніше, ніж ls -Llr? Тоді параметри, які ви використовуєте для rsync, можна вдосконалити. Можливо -c, увімкнено чи інший прапор, який читає більше, ніж просто каталоги та метадані (дані inode).

  • Чи rsync (без файлів змінено) майже так само швидко ls -Llr? Тоді ви налаштували rsync якнайкраще. Вам доведеться налаштувати ОС, додати оперативну пам’ять, отримати швидші диски, змінити файлові системи тощо.

Поговоріть зі своїми дияволами

Файли 80k - це просто поганий дизайн. Дуже мало файлових систем та системних інструментів дуже добре обробляють такі великі каталоги. Якщо імена файлів abcdefg.txt, розгляньте їх збереження у abdc / abcdefg.txt (зверніть увагу на повторення). Це розбиває каталоги на більш дрібні, але не потребує великих змін у коді.

Також .... розглянути можливість використання бази даних. Якщо у вас в каталозі є 80k файлів, можливо, ваші розробники працюють над тим, що вони дійсно хочуть - це база даних. MariaDB або MySQL або PostgreSQL були б набагато кращим варіантом для зберігання великої кількості даних.

Гей, що не так з 5 хвилин?

Нарешті, чи справді 5 хвилин так погано? Якщо ви запускаєте цю резервну копію раз на день, 5 хвилин - це не багато часу. Так, я люблю швидкість. Однак якщо 5 хвилин "достатньо хороші" для ваших клієнтів, то це досить добре для вас. Якщо у вас немає письмового договору про домовленість, як щодо неофіційної дискусії з вашими користувачами, щоб дізнатися, наскільки швидко вони очікують на резервне копіювання.

Я припускаю, що ви не задавали це питання, якщо не було потреби в покращенні продуктивності. Однак якщо ваші клієнти задоволені 5 хвилин, оголосіть перемогу та перейдіть до інших проектів, які потребують ваших зусиль.

Оновлення: Після деякої дискусії ми визначили, що вузьким місцем є мережа. Я порекомендую дві речі, перш ніж відмовитись :-).

  • Спробуйте стиснути більше пропускної здатності з труби при стисненні. Однак для стиснення потрібно більше процесора, тому якщо ваш процесор перевантажений, це може погіршити продуктивність. Спробуйте rsync з і без -z, і налаштуйте свій ssh ​​за допомогою та без стиснення. Надайте всі 4 комбінації, щоб побачити, чи якась із них працює значно краще, ніж інші.
  • Перегляньте мережевий трафік, щоб побачити, чи немає пауз. Якщо є паузи, ви можете знайти те, що викликає їх, і оптимізувати там. Якщо rsync завжди надсилає, то ви дійсно на вашій межі. Ваш вибір:
    • швидша мережа
    • щось інше, ніж rsync
    • перемістити джерело та місце призначення ближче один до одного. Якщо ви не можете цього зробити, чи можете ви rsync до локальної машини, а потім rsync до реального місця призначення? Це може бути корисно для цього, якщо система має бути вимкненою під час початкової rsync.

80K - це багато файлів. В одному дереві каталогів є 80k файлів . Кожна окрема директорія не має більше 2-х файлів / підкаталогів.
гуетлі

Перевірте свою версію rsync: виконано, переконайтесь, що контрольна сума не використовується: виконано. Розділіть роботу на невеликі партії: Дякую, я погляну на gigasync. За замовчуванням в ОС для цієї ситуації не робиться: зроблено (вузьке місце - це мережа, а не ОС). Подивіться на "кеш namei": зроблено (це чистий, а не ОС). Розглянемо іншу файлову систему: знову нетто, а не ОС. Можливо, 5 хвилин - це найкраще, що можна зробити. Я думаю, що це могло б бути набагато швидшим. Поговоріть зі своїми дияволами (використовуйте БД): Це було б величезною зміною. Можливо, це вирішить файлова система з кращою підтримкою резервного копіювання.
guettli

2k файли в каталозі набагато краще. дякую за оновлення Ви не згадали, що мережа була повільною. Це низька пропускна здатність, висока затримка або те й інше? rsync, як правило, працює на високому рівні затримки (його розробив хтось, який працював над його доктором з Австралії, працюючи з комп'ютерами в США). Спробуйте зробити це "ls -lLR" протягом ssh і час, який потрібно для передачі результату. "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list". Переконайтесь, що / tmp / list створено на локальному хості.
TomOnTime

так, мережа повільна. Це безшовний.
guettli

Як повільно? Якщо ви використовуєте "scp" для копіювання файлу 100M, скільки часу це займе? Крім того, що є результатом "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list"?
TomOnTime

2

Ні, це неможливо з rsync, і це було б зовсім неефективно з іншого боку:

Зазвичай rsyncлише порівнюються дати модифікації файлів та розміри файлів. Ваш підхід змусить його двічі прочитати та перевірити вміст усіх файлів (у локальній та віддаленій системі), щоб знайти змінені каталоги.


1
AFAIK rsync перевіряє час і розмір. Якщо обидва збігаються, файл знову не буде передано (принаймні у налаштуваннях за замовчуванням). Досить було б надіслати хеш кортежів (ім'я файлу, розмір, mtime). Не потрібно перевіряти суму вмісту.
guettli

Так, ви праві, але все одно rsyncцього не робите.
Свен

2

Для синхронізації великої кількості файлів (де мало що змінилося) також варто встановити noatimeна вихідні та пункти призначення. Це економить час доступу для запису на диск для кожного незмінного файлу.


Так, параметр, що займає час, має сенс. Ми використовуємо його з декількох років. Я думаю, що потрібна альтернатива rsync.
guettli

2

Ви також можете спробувати lsyncd, який буде rsync лише тоді, коли виявлені зміни у файловій системі та лише змінених підкаталогах. Я використовував його для каталогів з до двох мільйонів файлів на гідному сервері.


1

Використовуйте rsync в демонському режимі на кінці сервера, щоб пришвидшити процес лістингу / контрольної суми:

Зауважте, що він не зашифрований, але його можна буде тунелювати, не втрачаючи поліпшення продуктивності списку.

Крім того, що компресія rsync робити замість ssh повинна підвищити продуктивність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.