Мы используем 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/