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


У нас очень большой (многодисковый) каталог кеша Nginx для загруженного сайта, который нам иногда необходимо очистить сразу. Я решил это в прошлом, переместив папку кэша на новый путь, создав новую папку кэша по старому пути, а затем rm -rfв старой папке кеша.

Однако в последнее время, когда мне нужно очистить кеш на занятое утро, ввод-вывод от rm -rf голодает мои серверные процессы доступа к диску, поскольку как Nginx, так и сервер, на котором он работает, интенсивно читаются. Я могу наблюдать за загрузкой среднего уровня, когда CPU сидят без дела и 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

8
2017-10-15 16:32


Источник


Вероятно, вы также должны указать файловую систему, которую вы используете и как (параметры монтирования). - Cristian Ciupitu
Обновлено. Кроме того, в случае, если это имеет значение, это на Ubuntu 12.04. - David Eyk
Обратите внимание, что производительность ввода-вывода на Amazon EBS может быть довольно плохим. Видеть perfcap.blogspot.com/2011/03/... который рекомендует долгосрочный максимум 100 iops, с кратковременными (1 минута) всплесками до 1000. Похоже, ваш случай намного выше, чем через минуту, поэтому проблема. - Moshe Katz
Правильно, поэтому для кеша мы используем хранилище экземпляров, а не EBS. См. Комментарий к обновлению. Извините, если это не ясно. - David Eyk
Извините, что я опаздываю, но вы можете исследовать группы и контроллер blkio: kernel.org/doc/Documentation/cgroups/blkio-controller.txt - AndreasM


Ответы:


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

Команда Истекшее системное время% CPU cs1 * (Vol / Invol)
rsync -a -delete empty / a 10.60 1.31 95% 106/22
найти b / -тип f -delete 28.51 14.46 52% 14849/11
найти c / -тип f | xargs -L 100 rm 41,69 20,60 54% 37048/15074
найти d / -тип 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 - это контекстные переключатели добровольные и непроизвольные


3
2017-10-22 20:00



Хотя это теоретически может ответить на вопрос, было бы предпочтительнее чтобы включить здесь основные части ответа и предоставить ссылку для справки. - Tom O'Connor
Захватывающий! Я попробую. - David Eyk
rsync работает прямо сейчас. Возможно, пока еще слишком рано говорить, и мне может помочь, что я не запускаю его в середине напряженного утра, но сервер все еще реагирует, а средняя нагрузка управляема. - David Eyk
Точный вызов, который я использую: ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old - David Eyk
Ну, это заняло всего 4 часа. ;) Я собираюсь принять этот ответ (извините @aferber), поскольку мне нравится прямой вызов, и он кажется восприимчивым к nice а также ionice, или, по крайней мере, он не уничтожал сервер, как rm -rf сделал. - David Eyk


Удаление файлов выполняет только операции с метаданными в файловой системе, на которые не влияет ионная.

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


9
2017-10-15 17:17



Удаление многих файлов занимает много времени, поэтому на самом деле нет «внепикового» периода, который будет охватывать его. :( - David Eyk
while петля, кажется, делает трюк, когда head -n 50, 100 все еще медленно повышал нагрузку выше критической, что говорит о том, что слишком много конфликтов ресурсов продолжалось. - David Eyk
Человек, который занимает много времени, чтобы бежать! - David Eyk
Найти все еще будет список всех файлов в каталоге и всех подкаталогах для каждой итерации цикла while. Вероятно, вы могли бы сделать что-то вроде - Randy Orrison
Найти все еще будет список всех файлов в каталоге и всех подкаталогах для каждой итерации цикла while. Вероятно, вы могли бы сделать что-то вроде find dir-type f -print0 | xargs -l50 -0 rmwait, где rmwait - это скрипт, который делает rm "$ @"; sleep 2. Обратите внимание на использование -print0 и -0 для обработки имен файлов с пробелами. -l50 говорит xargs делать только 50 за раз. - Randy Orrison


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

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


-1
2017-10-15 17:44



К сожалению, nice похоже, имеет такой же эффект, как и ionice, то есть ничего заметного. - David Eyk
@DavidEyk. Если у nice и ionice нет «заметного» эффекта, это означает, что ничто другое не будет бороться за ресурсы каким-либо заметным образом, или вы просто не замечаете эффект невооруженным глазом. Вы действительно должны сравнить его с помощью iostat и vmstat, чтобы увидеть реальный эффект. - Michael Martinez
Я считаю, что @aferber обратился к этому в своем ответе: «Удаление файлов выполняет только операции с метаданными в файловой системе, на которые не влияет ионная». Я видел конкуренцию - мои серверные процессы голодали за время чтения, в то время как процессор загружался и rm -rf на 99% iotop, - David Eyk