Удаление огромного количества файлов в Linux без завешивания сервера

Удаление большого количества файлов

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

Дело в том, что когда удаляешь много файлов, дисковая система очень сильно загружается. При удалении мелких файлов, они удаляются быстро и происходит быстро переход на следующий файл. Как результат, сервисы операционной системы могут не успевать получать свое время – все время дисковой системы будет выделено на удаление бесконечного списка файлов ))).

В интернет много различных решений удаления файлов. Большинство из которых “вешает сервер”.

Для того, чтоб Ваши службы оставались работающими Вы можете воспользоваться perl-скриптом размером в 1 строчку ))).

perl -e '$dir="/mnt/k2bigdata/lib/php/sessions_old/";opendir(D,$dir)||die("Err\n");while($f=readdir(D)){print $dir.$f."\n";unlink($dir.$f);select(undef, undef, undef, 0.1);}'

 

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

/mnt/k2bigdata/_old/sessions2_old/ – это путь откуда удаляются файлы.

0.1 – это время в секундах, которое ожидает скрипт после удаления каждого файла. В данном случае, 0,1 = 100 миллисекунд или 0,1 секунды. Выставляется эта пауза экспериментальным путем. Запускаете скрипт в терминале, если службы продолжают нормально работать – можете понижать время, если нет, тогда прерываете выполнение скрипта и выставляете паузу побольше.

Расчет скорости удаления файлов

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

Так, например, если пауза 0,1, то Вы удалите 10 файлов в секунду.

10*60*60*24=864 000 файлов в сутки.

Таким образом, если у Вас несколько миллионов файлов, то Вы с такой скоростью удалите их за несколько суток.  Не заметно для пользователей. Если же Вам нужно удалить больше файлов, то возможно Вам нужно повысить скорость удаления. А возможно добавить в алгоритм удаление так, чтоб ночью удаляло быстрей, а в рабочее время – медленней.

Пример: Нужно удалить 12 млн. файлов.
Если выставить время 0,05, то получим:

(1000/050)*60*60*24=1 728 000 удаленных файлов в сутки.

Таким образом, 12 млн файлов при такой паузе удалится за 6,9 суток )))

Если же Вы выставите паузу в 0,005 с, тогда скорость увеличится в 10 раз и вы удалите файлы в течении суток, что более приемлемо. Но, выдержит ли Ваш сервер такую скорость – тестируйте ;).

Автор: Рудюк С.А.

Be the first to comment

Leave a Reply

Your email address will not be published.


*