Назад | Перейти на главную страницу

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

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

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

Нет.

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

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

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

Затем вы можете "nice rm" исходный каталог в фоновом режиме, не беспокоясь о продолжительном отключении.

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

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

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

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

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

ionice -n7 nice rm -fr dir_name

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

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

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

поэтому, если вы удаляете все файлы в deltedir

find -t f deletedir | parallel -j 10 rm

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

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

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

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

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