Выполнение 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системного вызова, код файловой системы, тем не менее, должен проделать большую работу, если удаленная ссылка является последней для файла и если она в данный момент не открыта. Это, конечно, зависит от файловой системы, но тогда может быть очень заметная разница, когда удаленный файл огромен.
июля
22

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

После этого вы можете "приятно создать" исходный каталог в фоновом режиме, не беспокоясь о длительных сбоях.

Грег Ворк
источник
Это может сработать, так как М.В. очень очень быстро.
Рори
Да, это работает хорошо. Я много раз использовал эту технику, чтобы «починить» почтовые ящики на основе maildir, где почтовый клиент потерял мозги и оставил беспорядок на диске. Самый большой (единственный) каталог, который я исправил таким образом, содержал около 1,5 или 2 миллионов файлов IIRC. Общее время простоя для конечного пользователя составило ~ 3 минуты, большинство из которых ждали, пока не прекратятся процессы почтового клиента и imap.
Грег Ворк
7

Убедитесь, что у вас установлены правильные параметры монтирования для XFS.

Используя -ologbufs = 8, logbsize = 256k с XFS, вероятно, утроит вашу производительность удаления.

Джеймс
источник
2
+1 за этот совет ... Нужно также включить ленивые счетчики для другого повышения производительности.
hurikhan77
1
Некоторое объяснение этих настроек будет полезно для будущих читателей.
Арон Роттвил
5

Если вы эффективно выполняете команду rm на уровне файлов, это займет много времени. Вот почему снимки на основе блоков так хороши :).

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

Джеймс
источник
Снимки на основе блоков не являются в этом случае уникальными. Ряд файловых систем - WAFL и ZFS сразу приходят на ум - также обеспечивают хорошую производительность для удаления снимка. Они рассматривают снимки как объекты файловой системы первого класса. Таким образом, вместо того, чтобы (медленно) перебирать миллионы файлов, чтобы определить, какие блоки нужно освободить, им нужно только просмотреть список блоков, связанный со снимком.
Кит Смит
Хм. Скорее всего, я выглядел слишком противоречивым. Оригинальный постер должен использовать Linux, и на самом деле не существует хорошо зарекомендовавшей себя файловой системы Linux, которая делает снимки - хотя btrfs и nilfs выглядят интересными в будущем. Так что на практике я согласен - лучше использовать снимки на основе блоков.
Кит Смит
+1 за подсказку для разделения и распараллеливания рабочей нагрузки: xfs играет свою роль в параллельных рабочих нагрузках.
hurikhan77
5

Хорошо использовать ionice для операций с интенсивным вводом-выводом, подобных этим, независимо от используемой файловой системы.
Я предлагаю эту команду:

ionice -n7 nice rm -fr dir_name

Он отлично подойдет для фоновых операций на сервере с большой нагрузкой ввода-вывода.

ash108
источник
2

Я знаю, что это старый, но я подумал, что я могу предложить. Вы удаляете эти файлы последовательно, выполнение параллельных операций rm может ускорить процесс.

http://savannah.nongnu.org/projects/parallel/rallel может обычно использоваться вместо xargs

так что если вы удаляете все файлы в deltedir

find -t f deletedir | parallel -j 10 rm

Это оставило бы вам только пустые структуры каталогов для удаления.

Примечание. Скорее всего, вы все равно столкнетесь с ограничениями файловой системы, как указано выше.

Ник Андерсон
источник
В чем преимущество параллелизма над xargs?
Рори
1

Может ли альтернативный вариант здесь разделить данные таким образом, чтобы вы могли мусор и восстановить действительную файловую систему вместо выполнения команды rm?

мычание
источник
3
Я думаю, что rsnapshot использует жесткие ссылки как часть функции сохранения нескольких снимков. Так что, если спрашивающий использует эту функцию, использование отдельных файловых систем не будет работать (поскольку вы не можете жестко связать через границу файловой системы)
Дэвид Спиллетт
0

Как насчет уменьшения милости команды? Подобно:

nice -20 rm -rf /path/to/dir/
RainyRat
источник
5
Узким местом является не планировщик, а файловая система, я бы сказал.
Мануэль Фо
В маловероятном случае, когда планировщик является узким местом, вы в конечном итоге только наберете нагрузку на подсистему ввода-вывода, что сделает сервер еще менее пригодным для использования во время работы.
Дэвид Макинтош