Производительность chown и chmod или find и выполнение в фоновом режиме параллельно?

Вопрос или проблема

У меня есть до терабайт данных (большое количество небольших файлов), которые могут содержать неправильного владельца, группу или права доступа. Чтобы это исправить, у нас был скрипт, который выполнял

sudo -n chown -R user:group "/path"
sudo -n chmod -R a-rwx,u+rwX,g+rwX "/path"

Но мне интересно, можно ли улучшить производительность? Как насчет запуска обоих процессов в фоновом режиме и добавления wait в скрипт? Это плохая идея для chown и chmod? Они мешают друг другу?

Что насчет использования find вместо этого? Это быстрее и вообще корректно в таком виде (тесты показали, что это даже не работает, т.е. есть что-то неправильное в использовании)?

sudo -n find "/path" -type f -exec chmod 660 {} + -exec chown user:group {} +
sudo -n find "/path" -type d -exec chmod 770 {} + -exec chown user:group {} +

Что насчет запуска этого в фоновом режиме и добавления wait? Из-за фильтра по типу это не должно мешать, верно? Можно ли это даже улучшить, фильтруя только файлы, отклоняющиеся от целевой конфигурации?

Может, важно отметить, что этот скрипт должен работать на нескольких платформах, таких как Ubuntu (разные версии) и Red Hat (разные версии), а также на потенциально разных файловых системах.

Какое именно самое быстрое решение в вашем случае зависит от вашей среды, вероятно, нет единственно лучшего способа, и вам следует протестировать несколько альтернатив, чтобы увидеть, что работает лучше всего.

Правка: Как я узнал (спасибо @StephenKitt), мои предположения о chmod и find были неверными, и оба варианта, вероятно, будут работать достаточно хорошо, так что xargs, показанный здесь, — это просто еще одна альтернатива, которую вы могли бы попробовать.

Я бы попробовал find -print0 для идентификации файлов/каталогов и xargs -0 с chmod и chown по очереди. Это, конечно, запустит find 4 раза по вашему дереву каталогов, но, скорее всего, кэширование здесь поможет значительно. Если ваша команда find не поддерживает опцию -print0, вы можете обойтись без нее (и опустить опцию -0 из xargs), но тогда вам следует убедиться, что имена файлов не содержат символов переноса строки.

Если вы хотите сократить количество запусков find, вы можете записать его вывод во временный файл и использовать его как входные данные для двух вызовов xargs для chown и chmod.

То, лучше ли запускать два в параллели или один за другим, а также сэкономит ли время проверка файлов, не соответствующих желаемым характеристикам, — это то, что вам нужно измерить. Мне кажется, что поскольку это в основном одноразовая операция, это действительно не имеет большого значения, просто начните и закончите с этим. Если задача возникнет во второй раз, вы можете попробовать альтернативный подход, если думаете, что это может быть лучше.

Ответ или решение

Оптимизация производительности команд chown, chmod и find в параллельном режиме

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

Основные команды: chown и chmod

Вы использовали команды chown и chmod как показано ниже:

sudo -n chown -R user:group "/path"
sudo -n chmod -R a-rwx,u+rwX,g+rwX "/path"

Параллельное выполнение

Использование команды & для выполнения обеих команд в фоновом режиме может привести к конфликтам, так как обе команды могут пытаться изменить одни и те же файлы одновременно. Однако, если вы уверены, что изменения, которые вносят chown и chmod, не будут конфликтовать, вы можете выполнить их параллельно и затем использовать команду wait, чтобы дождаться завершения обоих процессов:

sudo -n chown -R user:group "/path" &
sudo -n chmod -R a-rwx,u+rwX,g+rwX "/path" &
wait

Тем не менее, такой подход не всегда лучший, так как это может не значительно ускорить процесс, особенно на больших объемах данных.

Альтернатива с использованием find

Вы предложили использовать find для более точного управления процессами:

sudo -n find "/path" -type f -exec chmod 660 {} + -exec chown user:group {} +
sudo -n find "/path" -type d -exec chmod 770 {} + -exec chown user:group {} +

Эффективность использования find

Использование find действительно может увеличить производительность, так как вы обрабатываете только те файлы, которые требуют изменений. Однако обратите внимание на порядок выполнения команд: сначала изменяйте владельца, а затем разрешения, или наоборот.

Подход с xargs

Также вы можете использовать xargs, что позволяет более эффективно обрабатывать входные данные, полученные от find. Например:

sudo -n find "/path" -print0 | xargs -0 -I {} sudo -n chmod 660 {} 
sudo -n find "/path" -print0 | xargs -0 -I {} sudo -n chown user:group {}

Этот метод будет эффективен и полезен, особенно если у вас много файлов. Использование -print0 и -0 исключает проблемы с файлами, содержащими пробелы и специальные символы.

Оптимизация обработки файлов

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

Заключение

Каждый из предложенных подходов имеет свои достоинства и недостатки. Для достижения наилучших результатов рекомендуется протестировать разные варианты в вашей среде и выбрать наиболее производительный. Помните, что каждый раз, когда вы выполняете такие масштабные операции, важно сделать резервную копию критических данных, чтобы избежать потерь.

Неделей позже вы можете задуматься о создании системы автоматизированных задач для регулярной проверки и исправления прав доступа, что может существенно сэкономить время в перспективе.

Оцените материал
Добавить комментарий

Капча загружается...