LINUX.ORG.RU
ФорумAdmin

Как удалить 100 000 файлов

 ,


0

4

Проблема в том, что когда я начинаю удалять 100 000 файлов, то система виснет почти наглухо. atop показывает загрузку диска 120% и сайт ложится. Диск 2x2TB sata рейд soft. Удалять по 1 файлу очень долго. Как можно быстро удалить их? Система Debian GNU/Linux 9.4 (stretch).
Спс )

★★★

Удаляй с ionice.

Можно удалять через find -delete это меньше грузит проц, но сильнее грузит диск.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

Я удаляю через php скрипт. Не понимаю почему так тормозит. Диск гнилой или что?

gobot ★★★ ()
Ответ на: комментарий от gobot

Ну для начала было бы неплохо увидеть сам скрипт

Pinkbyte ★★★★★ ()
Ответ на: комментарий от gobot

Есть необходимость именно в скрипте? Не пробовал просто rm -r ?

Promusik ★★★★★ ()
Ответ на: комментарий от Promusik

Там сайт, по крону запускается очистка. Файлы берутся из базы. rm -r не пробовал, ибо нужно сначала вычислить какие файлы удалить. Схема такая: есть таблица files, там есть поле file ну его и удаляешь, ну ещё и и thumbnails... Но долго!

gobot ★★★ ()
Ответ на: комментарий от gobot

у тебя скрипт небось пытается прочитать список всех файлов в каталоге оттуда и тупит. попробуй читать например первые 10 в цикле и соотв после чтения 10 файлов их удалять и читать след 10 файлов ...

Jopich1 ()

удаляй через rsync, это наиболее быстрый способ удаления 100500 файлов.

PunkoIvan ★★★ ()
Ответ на: комментарий от Jopich1

Нет, все пути к файлам записаны в базе, ничего не считает. Пути в формате /var/www/site/upload/ff/04/file.jpg Ну как обычно md5()

gobot ★★★ ()

Удалять по 1 файлу очень долго. Как можно быстро удалить их?

А никак, тебе же перед этим все равно все записи нужно получить.
Используй unbuffered query и удаляй в цикле. Либо читай все записи и удаляй все пути одной командой.

ritsufag ★★★★★ ()
Ответ на: комментарий от ritsufag

удаляй все пути одной командой

Думаешь быстрей будет? Тоже такая мысль была. Проверять времени нет

gobot ★★★ ()
Ответ на: комментарий от gobot

Проверь что у тебя шелл это осилит (getconf ARG_MAX) (или ты удаляешь через какие-то внутренние функции php?).

micronekodesu ★★ ()
Ответ на: комментарий от micronekodesu

Да не в шеле дело, удаляет через php unlink() подозреваю обычно. Laravel

gobot ★★★ ()

О, это известная проблема. По этому поводу целую статейку написали: https://habr.com/post/157613/

UPD: хотя у тебя немного иная ситуация, и эта статья может оказаться бесполезной.

Vsevolod-linuxoid ★★★★★ ()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)

Диск 2x2TB sata

Если это обычный HDD (не SSD), то всё может очень сильно тормозить из-за необходимости случайного доступа на удаление каждого файла, плюс необходимости писать в журнал на удаление каждого файла. Случайный доступ на HDD очень тормозит. На дешёвых «домашних» дисках большого объёма в худшем случае при случайной записи можно получить меньше _десяти_ операций в секунду.

Deleted ()

Удалять по 1 файлу очень долго

Удаляй по 100.

100 000 файлов

Вот прям каждый день нужно столько удалять, или это разовая задача?

no-such-file ★★★★★ ()
Ответ на: удаленный комментарий

# rm -rf /*

Это удалит почти всю систему на компьютере, он станет неработоспособным...

anonymous ()
Ответ на: комментарий от no-such-file

Да уж, наверное нужно малыми порциями удалять, по расчетам 12 часов займет, ну да ладно

gobot ★★★ ()
Ответ на: комментарий от gobot

То что вы пишете очень странно, bash скрипт даже по одному файлу удалит все довольно быстро, скорей всего оперативы не хватает

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

Так что попробуйте удалить например командой find, она составляет лист и удаляет по одному

ism ★★★ ()
Ответ на: комментарий от ism

Не баш скрипт удаляет, а php скрипт. Сначала делает выборку из БД, а потом удаляет ненужные файлы. Если даже будет удалятся 1000 файлов, то сервер виснет почти наглухо, ATOP показывает busy 100%, плюс ещё jbd2 каждые 5 сек. в журнал пишет. Кстати как увеличить интервал до 15 сек., без перезагрузки сервера? В опциях монтирования есть строчка commit, которая задает этот интервал.Через tune2fs не понял как это делать и возможно ли вообще

gobot ★★★ ()
Ответ на: комментарий от gobot

Php для массовых операций с файлами лучше не использовать, неизвестно как там он работает, учитывая кроссплатформенность

Так что лучше в php сделать txt файл с путями к файлам и bash скрипт удаляющий все по листу. Наверняка будет быстрее

Fs тюнить смысла нет, это мало поможет, разве что отключение журнала

ism ★★★ ()
Последнее исправление: ism (всего исправлений: 4)

Гугли getdents() rm.

anonymous ()

Ксли бы мне давали доллар за каждый подобный вопрос, я был бы миллионером.

Ищи в поиске на этом сайте. Много раз уже обсуждали.

Deleted ()
Ответ на: комментарий от Deleted

Вопрос не в том как удалить много файлов, это я знаю через find . | xargs rm, а в том что диск загибается даже при удалении 100-500-1000 файлов. Вот идет удаление файлов, например удалил 100, потом пауза секунд 10, потом снова удалил 300 и снова пауза какая то. Блокировки идут

gobot ★★★ ()
Ответ на: комментарий от anonymous

Ну ССД понятно, но там и места мало. Может как нибудь SATA можно настроить, а то тупит жестко на удалении

gobot ★★★ ()

100 000 ... по 1 файлу очень долго

Действительно? если По 1 в секунду это всего чуть больше суток, и сайт точно не ляжет.

DonkeyHot ★★★★★ ()

Если ext4, то это не лечится. Она очень, очень хреново работает на HDD с сотнями тысяч файлов. Хорошо работала resierfs, но она сейчас в ядре практически убита. Вроде, справляется современная xfs (хотя лет 10 назад удаление было её ахилесовой пятой), но тут пока на 100% не уверен, я тупо понемногу сворачиваю работу с сотнями тысяч мелких файлов, а legacy в основном до сих пор мучается с ext4.

KRoN73 ★★★★★ ()
Ответ на: комментарий от DonkeyHot

Действительно? если По 1 в секунду это всего чуть больше суток, и сайт точно не ляжет.

Вот я так когда-то дошёл до того, что у меня система за сутки не успевала стереть все кеши, что создавались. При чём нагрузка на IO под фрагментированной ext4 при таких операциях (при параллельных процессах, типа активной отдачи web-контента во много потоков) становится очень большой. Даже при удалении по одному файлу.

KRoN73 ★★★★★ ()
Ответ на: комментарий от ism

и bash скрипт удаляющий все по листу

Банальный find -mtime ... на таких задачах даже при ionice -c3 может поставить колом систему, если это ext4 + hdd :)

KRoN73 ★★★★★ ()
Ответ на: комментарий от DonkeyHot

Мне нужно каждый день удалять порядка 100 000 файлов, если оптимизировать, то примерно 30 000 и то это много. Даже если удалять каждый час это будет где то 1000 файлов, в этом случае сервер будет затыкаться примерно на 1 минуту каждый час, что неприятно. Можно сократить ещё время конечно, вплоть до минуты, но я не понимаю причин таких тормозов, неужели диск такое барахло?

gobot ★★★ ()
Ответ на: комментарий от gobot

Абу, у тебя макаба перестала справляться с подчисткой накопленного дерьма?

А если серьезно, ты пробовал без unlink(), запуская rm с именами файлов? (из скрипта)

И что за проект такой, если не секрет?

timdorohin ★★★ ()
Последнее исправление: timdorohin (всего исправлений: 1)
Ответ на: комментарий от gobot

Можно удалять файлы постоянно но через паузу

нагрузка будет равномерной и не будет ничему мешать

ism ★★★ ()
Последнее исправление: ism (всего исправлений: 1)

ещё раз попробую:

используй rsync.

для удаления большого количества файлов он подходит хорошо.

PunkoIvan ★★★ ()
Ответ на: комментарий от KRoN73

я тупо понемногу сворачиваю работу с сотнями тысяч мелких файлов,

В одном каталоге? В каталогах с именами по хешу от имени фалов с сортировкой перед удалением таких проблем не будет пока не будут опять сотни тысяч в каждом уже в таком дереве.

vodz ★★★★★ ()
Ответ на: комментарий от gobot

затыкаться примерно на 1 минуту каждый час

Суть предложения в том, чтобы не каждый час, а каждую секунду:

find whatewer |
while read f
do
  rm "$f"
  sleep 0.5
done
3600*2*24=172800 в сутки - без всякой оптимизации. А если твой сервер не способен отработать rm за 500 милисекунд - с ним точно что-то не так.

DonkeyHot ★★★★★ ()
Ответ на: комментарий от gobot

Я удаляю через php скрипт. Не понимаю почему так тормозит. Диск гнилой или что?

1. дефрагментированный
2. кто-то создал ФС с не теми параметрами

darkenshvein ★★★★★ ()
Ответ на: комментарий от PunkoIvan

расскажи как удалять rsync-ом большое количество файлов, лень rtfm

anto215 ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.