Нашел пост про быстрое удаление файлов «Так как же удалить миллионы файлов из одной папки?», но многие решения учитывают только одну папку и игнорируют вложенные. Когда на сервере скапливается множество вложенных папок и гигантское количество файлов (например, на 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

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