Виконання rm -rf на масивному дереві каталогів займає години


20

Ми використовуємо rsnapshot для створення резервних копій. Він зберігає безліч знімків резервного копіювання файлу, але він видаляє старі. Це добре. Однак rm -rfна масове дерево каталогів потрібно близько 7 годин . Файлова система - XFS. Я не впевнений, скільки файлів є, але це, напевно, мільйони.

Чи є все-таки пришвидшити це? Чи є якась команда, яка виконує те саме, rm -rfщо не займає годин і годин?


1
Я звик, find . -delete -name directoryі це набагато швидше, ніж rm -rf.
Паоло

Відповіді:


38

Ні.

rm -rfздійснює рекурсивне проходження першої глибини вашої файлової системи, закликаючи unlink()кожен файл. Дві операції, які призводять до того, що процес йде повільно, opendir()/ readdir()і unlink(). opendir()і readdir()залежать від кількості файлів у каталозі. unlink()залежить від розміру видаленого файлу. Єдиний спосіб зробити це швидше - або зменшити розмір і кількість файлів (що, мабуть, я підозрюю, що не є), або змінити файлову систему на одну з кращими характеристиками для цих операцій. Я вважаю, що XFS хороший для unlink () на великому файлі, але це не так добре для великих структур каталогів. Ви можете виявити, що ext3 + dirindex або reiserfs швидше. Я не впевнений, наскільки добре працює тариф на JFS, але я впевнений, що існує багато орієнтирів різної продуктивності файлової системи.

Редагувати: Здається, що XFS жахливо видаляє дерева , тому обов'язково змініть свою файлову систему.


1
Деякі роки тому я помітив жахливу ефективність, використовуючи reiserfs у подібному випадку використання.
knweiss

1
Чудовий пост!
wzzrd

2
Він майже просто сказав "ні" :)
Девід Пашлі

2
Я погоджуюся з усім тут, крім вашого твердження, що швидкість від’єднання залежить від розміру файлу. unlink просто видаляє посилання на файл і нічого не робить до фактичного вмісту. Не повинно бути помітної різниці між файлами різного розміру (ви можете перевірити це самостійно).
Каміль Кісієль

@KamilKisiel Ви маєте рацію сказати, unlinkщо нічого не робить із фактичним вмістом, але виконувати unlinkсистемний виклик, але файл файлової системи має більше роботи, якщо видалене посилання є останньою до файлу, і якщо вона наразі не відкрита. Це, звичайно, залежить від файлової системи, але тоді може бути дуже помітна різниця, коли видалений файл величезний.
jlliagre

22

Як альтернатива, відсуньте каталог убік, відтворіть його з тим самим ім'ям, дозволами та правом власності та перезапустіть усі додатки / послуги, які цікавлять цей каталог.

Потім ви можете "приємно запустити" оригінальний каталог у фоновому режимі, не турбуючись про тривалий відключення.


Це могло б спрацювати, оскільки телевізор дуже швидкий.
Рорі

Так - це добре працює. Я багато разів використовував цю методику, щоб "виправити" поштові скриньки на основі maildir, де клієнт електронної пошти втратив її мозок і залишив безлад на диску. Найбільший (єдиний) каталог, який я виправив таким чином, мав близько 1,5 або 2 мільйони файлів IIRC. Загальний час простою для кінцевого користувача становив ~ 3 хв., Більшість з яких чекали, поки поштовий клієнт та процес обробки зображень загинуть.
Грег Робота

7

Переконайтеся, що у вас встановлені правильні параметри кріплення для XFS.

Використовуючи -ologbufs = 8, logbsize = 256k з XFS, ймовірно, втричі збільшить вашу ефективність видалення.


2
+1 для цієї поради ... Також слід включити ліниві лічильники для іншого підвищення продуктивності.
hurikhan77

1
Деякі пояснення цих налаштувань будуть корисними для майбутніх читачів.
Aron Rotteveel

5

Якщо ви робите rm ефективно на рівні файлу, тоді це займе багато часу. Ось чому знімки на основі блоків такі хороші :).

Ви можете спробувати розділити rm на окремі ділянки і спробувати це зробити паралельно, проте я, можливо, не очікую, що він внесе якісь покращення. Як відомо, у XFS є проблеми з видаленням файлів, і якщо це значна частина того, що ви робите, то, можливо, інша файлова система для цього була б ідеєю.


Знімки на основі блоків не є однозначно хорошими. Ряд файлових систем --- WAFL і ZFS приходять негайно на думку --- також забезпечують хороші показники для видалення знімків. Вони трактують знімки як об'єкти файлової системи першого класу. Тому замість того, щоб повторювати (повільно) мільйони файлів, щоб визначити, які блоки потрібно звільнити, вони повинні лише переглянути список блоків, пов’язаний із знімком.
Кіт Сміт

Хм. Я, мабуть, вийшов надто протилежним вище. Оригінальний плакат повинен використовувати Linux, і насправді не існує добре перевіреної файлової системи Linux, яка б робила знімки --- хоча btrfs та nilfs виглядають цікавими для майбутнього. Тому я погоджуюсь - краще використовувати знімки на основі блоків.
Кіт Сміт

+1 для підказки, щоб розділити та паралелізувати навантаження: xfs відтворює свою силу на паралельних навантаженнях.
hurikhan77

5

Добре використовувати ionice для таких операцій, що потребують вводу-виводу, незалежно від використовуваної файлової системи.
Я пропоную цю команду:

ionice -n7 nice rm -fr dir_name

Він буде чудово грати для фонових операцій на сервері з великим навантаженням вводу-виводу.


2

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

http://savannah.nongnu.org/projects/parallel/ паралель може використовуватися замість xargs

тому якщо ви видаляєте всі файли в deltedir

find -t f deletedir | parallel -j 10 rm

Це дозволить вам видалити лише порожні структури каталогів.

Примітка. Ви, ймовірно, все ще вплинете на обмеження файлової системи, як зазначено вище.


Яка перевага використання паралельних над xargs?
Рорі

1

Чи альтернативним варіантом тут є відокремлення даних таким чином, щоб ви могли барахло і відновити фактичну файлову систему, а не робити rm?


3
Я думаю, що rsnapshot використовує жорсткі посилання як частину функції підтримання кількох знімків. Тож якщо
запитуючий

0

Як щодо зменшення приємності команди? Подобається:

nice -20 rm -rf /path/to/dir/

5
Вузьке місце - це не планувальник, це файлова система, я б сказав.
Мануель Фокс

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