Как удалить каталог в файловой системе NFS с огромным количеством файлов

Как удалить каталог в файловой системе NFS с огромным количеством файлов

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

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

Каталог расположен на NFS-монтировании размером около 600 ГБ на устройстве типа netapp. На самом деле я понятия не имею, сколько в нем файлов, но аналогичный каталог, созданный всего за 10 минут, содержит 121 000 файлов, так что, вероятно, их число где-то исчисляется миллионами. ОС — ядро ​​Linux 2.6.

Попытка найти способ вывести список или удалить его и его содержимое. find /home/foo приводит к тому, что find умирает примерно через 1 час, не выдавая ничего, кроме "./".

решение1

(отвечаю на свой собственный вопрос, на случай, если кто-то найдет его, когда будет искать что-то похожее.) В каталоге, возможно, находится около 9 миллионов файлов.

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

rm -rf, похоже, не работает. Наблюдал с помощью strace, он завис.

поиск не был завершен, завершился без ошибок.

ls -1, похоже, так и не завершился. (Теперь я понимаю, что он пытается отсортировать результаты, ls -1f в конечном итоге мог бы сработать).

то, что сработало, было простым фрагментом perl. Я предполагаю, что код на c сделает то же самое, что и я.

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }

решение2

Эта довольно старая тема попалась мне на глаза в Google, поэтому я хотел бы поделиться некоторой статистикой.

Ниже приведено сравнение трех различных методов удаления файлов на сервере NFS:

  1. простой rm:rm dir/*
  2. находить:find dir/ -type f -exec rm {} \;
  3. rsync:tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

Чтобы сравнить эти методы, я создавал 10000 файлов каждый раз, когда запускал тест с

for i in {1..10000} ; do touch $i ; done

Результаты на графике показывают, что rsync намного быстрее, а find — самый медленный из трех методов. производительность различных методов удаления нескольких файлов, rsync быстрее

Результаты сохраняются при удвоении количества файлов (я не запускал find20000 файлов), время усреднено по 3 запускам для 10000 файлов и 2 запускам для 20000 файлов.

        10000    20000
find     28.3       -
rm       12.9     23.9
rsync     6.94    12.2

Интересно посмотреть, от чего еще зависит эффективность этих методов.

Связанныйпочтана этом сайте обсуждается удаление большого количества файлов в файловой системе ext3.

решение3

Я бы посоветовал вам НЕ пытаться удалить эти файлы через NFS -- войдите на файловый сервер напрямую и удалите файлы там. Это будет значительно менее оскорбительно для сервера NFS (и клиента).

Помимо этого, используйте find (как описано MattBianco) или use ls -1 | xargs rm -f(из этого каталога), если при выполнении find возникают проблемы (последний вариант должен нормально работать через NFS, хотя я бы рекомендовал делать это локально).

решение4

Это кажется немного очевидным, но пробовали ли вы:

rm -rf /home/foo/

? Если это невозможно, есть ли способ использовать регулярное выражение, чтобы получить достаточно небольшое подмножество для передачи |xargs rm?

Если ls не работает, вы можете попробовать echo /home/foo/* | xargs rm, хотя это может просто выдать ошибку «строка слишком длинная» или что-то в этом роде. О, и я поддерживаю рекомендацию попробовать сделать это напрямую на сервере, а не через NFS.

Связанный контент