Как сохранить удаление поддерева (`rm -rf`) от истощения других процессов для дискового ввода-вывода?


8

У нас есть очень большой (несколько ГБ) каталог кэша 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

Вы, вероятно, должны также упомянуть файловую систему, которую вы используете и как (параметры монтирования).
Кристиан Чиупиту

Обновлено. Кроме того, в случае, если это имеет значение, это на Ubuntu 12.04.
Дэвид Эйк

Обратите внимание, что производительность ввода-вывода на Amazon EBS может быть довольно плохой. См. Perfcap.blogspot.com/2011/03/…, который рекомендует долгосрочный максимум 100 iops, с кратковременными (1 минута) всплесками до 1000. Похоже, ваш случай намного выше, чем за минуту, отсюда и проблема.
Моше Кац

Правильно, поэтому мы используем хранилище экземпляров, а не EBS, для кеша. Смотрите мой комментарий обновления. Извините, если это не ясно.
Дэвид Эйк

Извините, что опоздал, но вы можете исследовать cgroups и контроллер blkio
AndreasM

Ответы:


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 - переключение контекста добровольно и невольно


Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Том О'Коннор,

Захватывающий! Я попытаюсь.
Дэвид Эйк

rsyncработает прямо сейчас. Возможно, еще слишком рано говорить об этом, и может помочь то, что я не запускаю его в разгар напряженного утра, но сервер все еще реагирует и средняя нагрузка управляема.
Дэвид Эйк

Точный вызов, который я использую:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
Дэвид Эйк

Ну, это заняло всего 4 часа. ;) Я собираюсь принять этот ответ (извините @aferber) , как я , как простой вызов , и это , кажется, подвержены niceи ionice, или по крайней мере не уничтожить сервер , как rm -rfсделал.
Дэвид Эйк,

9

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


Удаление такого количества файлов занимает много времени, поэтому на самом деле не существует «непикового» периода, который охватил бы его. :(
Дэвид Эйк

whileЦикл , кажется, делает трюк , когда head -n 50. 100 все еще медленно поднимал среднюю нагрузку выше критической, что говорит мне о слишком большой конкуренции за ресурсы.
Дэвид Эйк

Человек, это занимает много времени, чтобы бежать!
Дэвид Эйк

Поиск все еще перечисляет все файлы в каталоге и всех подкаталогах для каждой итерации цикла while. Вы могли бы, вероятно, добиться большего успеха с чем-то вроде
Рэнди Оррисон

1
Поиск все еще перечисляет все файлы в каталоге и всех подкаталогах для каждой итерации цикла while. Вероятно, вы могли бы добиться большего успеха с помощью чего-то вроде find dir -type f -print0 | xargs -l50 -0 rmwait, где rmwait - это скрипт, который выполняет rm "$ @"; sleep 2. Обратите внимание на использование -print0 и -0 для обработки имен файлов с пробелами. -l50 говорит XARGS делать только 50 одновременно.
Рэнди Оррисон

-1

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

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


К сожалению, niceкажется, что он имеет почти такой же эффект, как ioniceи ничто заметное.
Дэвид Эйк

@DavidEyk. Если nice и ionice не имеют «заметного» эффекта, это либо означает, что ничто другое не борется за ресурсы каким-либо заметным образом, либо вы просто не замечаете этот эффект невооруженным глазом. Вы действительно должны сравнить его, используя iostat и vmstat, чтобы увидеть реальный эффект.
Майкл Мартинес

Я полагаю, что @aferber ответил на это в своем ответе: «Удаление файлов выполняет только операции с метаданными в файловой системе, на которые не влияет ionice». Я видел конфликт - у моих серверных процессов не хватало времени на чтение, в то время как процессор зависал и rm -rfимел 99% iotop.
Дэвид Эйк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.