Мне нужно рекурсивно удалить миллионы каталогов в общей папке NFS, и, чтобы избежать проблем с производительностью, я выполнил команду с помощью:
ionice -c 3 -t find /dir -type f -exec rm {};
который удалит все файлы и оставшиеся пустые каталоги, я могу удалить его с помощью rm -rf.
Но я не могу сказать, влияет ли ionice на указанную выше команду.
От человека ionice 3 класса:
Программа, работающая с приоритетом idle io, получит дисковое время только тогда, когда ни одна другая программа не запросила диск io в течение определенного периода отсрочки. Влияние простаивающих процессов io на нормальную работу системы должно быть нулевым.
Из исходного кода я вижу, что ionice устанавливает ioprio_set
.
Итак, что такое ioprio_set?
Системные вызовы ioprio_get () и ioprio_set () соответственно получают и устанавливают класс планирования ввода-вывода и приоритет одного или нескольких потоков.
Означает ли это, что поток процесса несет дополнительные свойства для планировщика ввода-вывода, чтобы использовать их для планирования ввода-вывода для процесса?
Напрашиваются следующие вопросы:
Пожалуйста, поправьте меня, если я ошибаюсь.
Также может быть способ выполнить операцию со стороны сервера, но я хочу сначала попробовать со стороны клиента.
Обратите внимание, что в моем ответе предполагается, что вы используете Linux, поскольку я уверен, что ionice
команда специфична для Linux.
Планировщик ввода-вывода работает на уровне блоков, а не на уровне файловой системы. В результате он влияет только на локальные устройства хранения и удаленно подключенные блочные хранилища (например, устройства хранения, подключенные к NBD, iSCSI или ATAoE). В результате нет специального планирования ввода-вывода для общего ресурса NFS на клиенте NFS (но сервер по-прежнему делает это, он просто не знает о приоритетах удаленного ввода-вывода), но может быть для iSCSI, Устройства NBD или ATAoE (однако многие дистрибутивы устанавливают их с помощью планировщика no-op, что означает, что единственное планирование ввода-вывода здесь также выполняется на стороне сервера). Единственный возможный случай, когда это повлияет на NFS, - это использование pNFS с блочной компоновкой, но вы, вероятно, не знаете, и я не совсем уверен, как это взаимодействует с блочным слоем, поэтому я просто проигнорирую это ).
Насколько на самом деле приоритет ввода / вывода делает, это зависит от конкретного планировщика ввода-вывода, который вы используете. Как минимум, планировщики noop и deadline (и, возможно, новый mq-deadline) вообще не обращают на это внимания, в то время как CFQ, BFQ и, я думаю, новый планировщик Kyber что-то с этим делают, но не Я не делаю с ним то же самое. Насколько мне известно, для CFQ классы ведут себя аналогично эквивалентным классам планирования ЦП (при этом класс ввода-вывода в реальном времени ведет себя как класс планирования ЦП RT FIFO). Я считаю, что BFQ просто использует их как подсказки для своего алгоритма планирования (в отличие от более значительного влияния, которое они оказывают на CFQ), но я не уверен в этом.
Теперь, что касается вашего конкретного примера, ionice
не должен иметь никакого влияния на них вообще, но он, вероятно, не окажет большого влияния на локальную файловую систему, если только диск уже не был полностью использован другими процессами (указанный вами класс планирования `` неактивный '' не является истинным планировщиком простоя, но даже если бы это было, find
большую часть времени не использует много дискового времени, и rm
команда использует еще меньше).
Кроме того, немного не по теме, но find
указанная вами команда удалит только файлы (из-за -type f
option), поэтому он не совсем эквивалентен rm -rf
, и вы можете улучшить его (локальную) производительность, заменив -exec rm {} ;
с участием -delete
, который делает то же самое, без необходимости создавать новый процесс для каждого удаляемого файла.