Я хотел бы удалить каталог кэша nginx, который я быстро очистил:
mv cache cache.bak
mkdir cache
service nginx restart
Теперь у меня есть cache.bak
папка с 2 миллионами файлов. Я хотел бы удалить его, не мешая серверу.
Простая rm -rf cache.bak
перегрузка сервера, даже самый простой HTTP-ответ занимает 16 секунд во время работы rm, поэтому я не могу этого сделать.
Я пытался ionice -c3 rm -rf cache.bak
, но это не помогло. На сервере есть жесткий диск, а не SSD, вероятно, на SSD это может не быть проблемой.
Я считаю, что лучшим решением было бы какое-то регулирование, например, как это делает встроенный менеджер кэша nginx.
Как бы вы решили это? Есть ли инструмент, который может сделать именно это?
ext4 на Ubuntu 16.04
linux
ubuntu
filesystems
ext4
hyperknot
источник
источник
rm
используя хороший ?Ответы:
Сделайте скрипт bash следующим образом:
Сохраните его с именем,
deleter.sh
например. Запустите,chmod u+x deleter.sh
чтобы сделать его исполняемым.Этот скрипт удаляет все файлы, переданные ему в качестве аргументов, а затем спит 0,5 секунды.
Затем вы можете запустить
Эта команда извлекает список всех файлов в cache.bak и передает пять имен файлов за раз в сценарий удаления.
Таким образом, вы можете настроить количество файлов, удаляемых за раз, и сколько времени задерживается между каждой операцией удаления.
источник
xargs
понимает максимальный размер командной строки и старается не превышать его по умолчанию. Этот имеет дополнительные ограничения не более 5 путей одновременно.Вам следует подумать о сохранении кеша в отдельной файловой системе, которую вы можете смонтировать / размонтировать, как указано в комментариях. Пока вы этого не сделаете, вы можете использовать этот вкладыш,
/usr/bin/find /path/to/files/ -type f -print0 -exec sleep 0.2 \; -exec echo \; -delete
если ваш бинарный файл находится в / usr / bin, и вы хотите видеть прогресс на экране. Отрегулируйте сон соответствующим образом, чтобы не перегружать жесткий диск.источник
-print0
, поскольку вы нигде не обмениваетесь информациейfind
.Возможно, вы захотите попробовать ionice в сценарии, использующем вывод команды find. Что-то вроде следующего:
В зависимости от файловой системы удаление каждого файла может привести к перезаписи всего этого каталога. Для больших каталогов это может стать настоящим хитом. Для таблицы inode требуются дополнительные обновления и, возможно, список свободного пространства.
Если в файловой системе есть журнал, изменения записываются в журнал; применяется; и удален из журнала. Это увеличивает требования к вводу / выводу для интенсивной записи.
Вы можете использовать файловую систему без журнала для кэша.
Вместо ionice вы можете использовать команду sleep для ограничения скорости действий. Это будет работать, даже если ionice нет, но для удаления всех ваших файлов потребуется много времени.
источник
Здесь я получил много полезных ответов / комментариев, которые я хотел бы завершить, а также показать свое решение.
Да, лучший способ предотвратить это - сохранить каталог кеша в отдельной файловой системе. Быстрое форматирование файловой системы всегда занимает не более нескольких секунд (возможно, минут), независимо от того, сколько на ней файлов / каталогов.
В
ionice
/nice
решения не было ничего не делать, потому что процесс удаления на самом деле причиной практически нет I / O. Что вызвало ввод / вывод, я полагаю, что очереди / буферы на уровне ядра / файловой системы заполнялись, когда файлы были удалены слишком быстро процессом удаления.То, как я это решил, похоже на решение Теро Килканена, но не требует вызова сценария оболочки. Я использовал встроенный
--bwlimit
переключатель rsync, чтобы ограничить скорость удаления.Полная команда была:
Теперь bwlimit указывает пропускную способность в килобайтах, которая в этом случае применяется к имени файла или пути к файлам. При установке значения 1 Кбит / с он удалял около 100 000 файлов в час или 27 файлов в секунду. Файлы имели относительные пути, например
cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e
, длиной 47 символов, так что это давало бы 1000/47 ~ = 21 файлов в секунду, что похоже на мое предположение о 100 000 файлов в час.Теперь почему
--bwlimit=1
? Я пробовал различные значения:Мне нравится простота встроенного метода rsync, но это решение зависит от длины относительного пути. Не большая проблема, так как большинство людей нашли бы правильное значение методом проб и ошибок.
источник