Pull to refresh

Как бысто удалить миллионы файлов из под-папок?

Нашел пост про быстрое удаление файлов «Так как же удалить миллионы файлов из одной папки?», но многие решения учитывают только одну папку и игнорируют вложенные. Когда на сервере скапливается множество вложенных папок и гигантское количество файлов (например, на proxy) приходится их удалять и пробовать разные варианты.

Хочу поделиться результатом нескольких экспериментов.

Выбор варианта проводился на 3х файловых системах: ext3,RiserFS и XFS (оказалась быстрее, хотя файлы и небольшие, по 300 кб).

Раздел монтировался удаленно по NFS.

Создавалось 11 миллионов файлов (чунки от 900 потоков в 4 битрейтах) и на директории (900) выполнял разные варианты удаления.

Чтобы примерно повторить эксперимент (создадим 110 тыс. файлов и удалим их), можно выполнить в баше:

mkdir -p del{2,110.000} && time touch del110.000/{1..110000}
real    0m2.346s
user    0m0.344s
sys     0m1.984s

Теперь сравним число системных вызовов и время выполнения при рекомендованном варианте:

time strace -c rm -rf del110.000 2>&1| awk '/total/{print $3}'
110308
real    0m9.555s
user    0m0.760s
sys     0m6.128s

В найденном ниже варианте 227 системных вызова вместо 110 тысяч и время выполнения в 6 раз меньше:

mkdir -p del110.000 && touch del110.000/{1..110000}
time strace -c rsync -a --delete del2/ del110.000/ 2>&1| awk '/total/{print $3}'
227
real    0m1.507s
user    0m0.156s
sys     0m1.292s

Этот вариант показал самые лучшие варианты по быстродействию и раньше я его нигде не встречал.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.