Как сохранить удаление поддерева (`rm -rf`) от голодания других процессов для дискового ввода-вывода?
У нас есть очень большой (несколько ГБ) каталог кэша Nginx для занятого сайта, который нам иногда необходимо очистить сразу. Я решил эту проблему в прошлом, переместив папку кеша на новый путь, сделав новую папку кеша по старому пути, а затем rm -rf
в старой папке кеша.
Однако в последнее время, когда мне нужно очистить кеш в загруженное утро, ввод / вывод из rm -rf
истощает мои серверные процессы доступа к диску, поскольку и Nginx, и сервер, для которого он предназначен, интенсивно читают. Я могу наблюдать подъем средней нагрузки, пока процессоры простаивают и rm -rf
занимает 98-99% дискового ввода-вывода в iotop
,
я пробовал ionice -c 3
при вызове rm
, но, похоже, не оказывает заметного влияния на наблюдаемое поведение.
Есть ли способ приручить rm -rf
поделиться диском больше? Нужно ли использовать другую технику, которая будет опираться на ionice
?
Обновить:
Рассматриваемая файловая система - это хранилище экземпляров AWS EC2 (основной диск - EBS). /etc/fstab
запись выглядит так:
/dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
3 ответа
Все данные собраны с этой страницы. Ниже приведены некоторые варианты удаления большого каталога файлов. Проверьте рецензию на детали того, как это было произведено.
Прошедшая команда Системное время%CPU cs1* (Vol/Invol) rsync -a - удалить пустое / a 10.60 1.31 95% 106/22 найти b/ -типа f -delete 28,51 14,46 52% 14849/11 найти с / -тип f | xargs -L 100 rm 41,69 20,60 54% 37048/15074 найти д / -типа f | xargs -L 100 -P 100 rm 34,32 27,82 89% 929897/21720 rm -rf f 31.29 14.80 47% 15134/11
* cs1 - переключение контекста добровольно и невольно
Удаление файлов выполняет только операции с метаданными в файловой системе, на которые не влияет ionice.
Самый простой способ, если вам сейчас не нужно дисковое пространство, выполнить rm
в непиковые часы.
Более сложный способ, которым МОЖЕТ работать, состоит в том, чтобы распространять удаления во времени. Вы можете попробовать что-то вроде следующего (обратите внимание, что предполагается, что ваши пути и имена файлов НЕ содержат пробелов!):
while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done
Также обратите внимание, что вы не можете использовать rm -f
в первой команде, потому что тогда цикл не остановится (это зависит от кода завершения ошибки rm
когда нет аргументов).
Вы можете настроить его, изменив количество удалений за цикл (в нашем примере 100) и продолжительность ожидания. Однако это может не сработать, поскольку файловая система все еще может собирать обновления метаданных таким образом, чтобы у вас возникали проблемы с нагрузкой ввода-вывода. Вы просто должны попробовать.
Вы можете связать его с командой "nice".ionice -c 3 nice -19 rm -rf /some/folder
Это меняет приоритет процесса на машине.