Выполнение rm -rf в массивном дереве каталогов занимает часы

Мы используем rsnapshot для резервного копирования. Он хранит множество снимков резервной копии файла, но удаляет старые. Это хорошо. Однако это займет около 7 часов, чтобы сделать rm -rf на массивном дереве каталогов. Файловая система XFS. Я не уверен, сколько там файлов, но это, наверное, исчисляется миллионами.

Есть ли способ ускорить его? Есть ли команда, которая делает то же самое, что и rm -rf и не занимает много часов?

8 ответов

Решение

Нет.

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

Редактировать: Кажется, что XFS ужасно удаляет деревья, поэтому определенно измените свою файловую систему.

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

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

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

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

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

ionice -n7 nice rm -fr dir_name

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

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

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

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

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

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

find -t f deletedir | parallel -j 10 rm

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

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

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

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

nice -20 rm -rf /path/to/dir/
Другие вопросы по тегам