Возможный дубликат:
rm в каталоге с миллионами файлов
Привет,
Итак, я застрял в этом каталоге:
drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2
Содержимое каталогов невелико - всего миллионы крошечных файлов.
Я хочу стереть его из файловой системы, но не смог. Моя первая попытка была:
find sessions2 -type f -delete
и
find sessions2 -type f -print0 | xargs -0 rm -f
но пришлось остановиться, потому что оба привели к увеличению использования памяти. В какой-то момент он использовал 65% системной памяти.
Поэтому я подумал (без сомнения, ошибочно), что это связано с тем, что в системе был включен dir_index. Возможно, find пытался прочитать весь индекс в памяти?
Итак, я сделал это (по глупости): tune2fs -O^dir_index /dev/xxx
Хорошо, так должно хватить. Прогнал find
команду выше снова и ... то же самое. Безумное использование памяти.
Я поспешно побежал tune2fs -Odir_index /dev/xxx
для повторного включения dir_index и запустил Server Fault!
2 вопроса:
1) Как мне избавиться от этого каталога в моей действующей системе? Меня не волнует, сколько времени это займет, поскольку он использует мало памяти и мало процессора. Кстати, используя nice find ...
Мне удалось снизить нагрузку на ЦП, поэтому сейчас моя проблема заключается только в использовании памяти.
2) Я отключил dir_index минут на 20. Несомненно, тем временем в файловую систему были записаны новые файлы. Я снова включил dir_index. Означает ли это, что система не найдет файлы, которые были записаны до повторного включения dir_index, поскольку их имена будут отсутствовать в старых индексах? Если это так и я знаю, что эти новые файлы не важны, могу ли я сохранить старые индексы? Если нет, как мне восстановить индексы? Можно ли это сделать на живой системе?
Спасибо!
Я был бы склонен переместить текущий каталог в сторону, создать новый каталог, а затем удалить старый:
mv dirname dirname.old; mkdir dirname ls -ld dirname dirname.old # проверьте правильность разрешений rm -rf dirname.old
Это имеет дополнительное преимущество, заключающееся в том, что в вашей истории не появляется "rm -rf dirname", которое вы могли бы случайно запустить повторно. :-)
Команда "rm -rf" должна удалить каталог с минимальными затратами памяти. Но команды "find", которые вы запускали ранее, также не должны использовать много служебной памяти. Как вы измеряете использование памяти?
Вы не измеряете это использование памяти, глядя на столбец «free» в выводе команды «free», не так ли? Потому что Linux будет использовать неиспользуемую память для кэширования диска, и верхний столбец под «свободным» не учитывает это. Вы видите использование памяти в одной из программ? Который из? "ps awwlx --sort = vsz" покажет вам большой объем памяти с использованием программ, отсортированных по большим в конце ...
См. Этот вопрос: rm в каталоге с миллионами файлов
Это был мой ответ, но были и другие отличные ответы:
Можно ли сделать резервную копию всех других файлов из этой файловой системы во временное хранилище, переформатировать раздел, а затем восстановить файлы?
Ваша проблема в том, что вы подключаете его к xargs .. вероятно, съедаете всю свою память там .. у find есть опция удаления
find sessions2 -type f -delete
Хм, безумная идея, не знаю, сработает ли она. Что, если вы попытаетесь делать это партиями? Сначала переименуйте каталог и создайте новый пустой, чтобы новые файлы не мешали. Затем выведите содержимое каталога. в текстовый файл. Затем просмотреть этот файл и удалить по 100 файлов за раз, засыпая и синхронизируя их?