Назад | Перейти на главную страницу

Как уберечь удаление поддерева (`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

При удалении файлов в файловой системе выполняются только операции с метаданными, на которые 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 в примере) и продолжительность сна. Однако на самом деле это может не сработать, поскольку файловая система может по-прежнему накапливать обновления метаданных таким образом, что у вас возникают проблемы с загрузкой ввода-вывода. Надо просто попробовать.

Все данные собраны с этой страницы. Ниже приведены некоторые варианты удаления большого каталога файлов. Ознакомьтесь с описанием, чтобы узнать, как это было произведено.

Command                                 Elapsed System Time %CPU cs1* (Vol/Invol)
rsync -a –delete empty/ a                10.60      1.31    95%  106/22
find b/ -type f -delete                  28.51      14.46   52%  14849/11
find c/ -type f | xargs -L 100 rm        41.69      20.60   54%  37048/15074
find d/ -type 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 - это произвольное и непроизвольное переключение контекста

Вы можете связать это с командой "nice". ionice -c 3 nice -19 rm -rf /some/folder

Это изменяет приоритет процесса на машине.