Быстрее удаление для сетевой файловой системы

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

В AWS мы почти 100% времени работаем в сетевой общей папке, и любое действие, связанное с чтением или записью, очень медленно, будь то du, find или rm, потому что это требует много сетевых операций ввода-вывода. Если я использую time для любой из этих операций, около 97% времени выполнения связано с I/O ((sys+user)/total = ~0.3 в большинстве моих тестов).

Представьте, что я хочу очистить содержимое pwd, где мой pwd содержит десятки подпапок. Очень простой способ ускорить процесс удаления — использовать xargs:

ls | xargs -P 0 -n 1 rm -r

Проблема в том, что задержка xargs соответствует задержке самого медленного rm -r subdirX. Решение — использовать find . ! -name '.' | xargs -P p -n n rm -r с хорошими значениями для p и n. Проблема в том, что find тоже занимает время из-за сетевых операций ввода-вывода.

Идеальным решением будет процесс, который итеративно сканирует содержимое папок, выполняя параллельно все внутренние операции unlink, которые rm должен рекурсивно выполнять. Есть ли способ достичь этого?

  • Решение 1: параллелизировать find каким-либо образом или найти способ очень эффективно создать весь список файлов, провести некоторую алгоритмическую процедуру, используя список в качестве входных данных, чтобы организовать весь рабочий набор в подходящие части, а затем использовать его для передачи в xargs или просто запустить несколько фоновых процессов, по одному для каждой части. Приятно в этой стратегии то, что, как только я ее освою, я смогу использовать ее для решения других операций по работе с файлами, которые мы часто выполняем. Так как же я могу ускорить процесс рекурсивного перечисления набора файлов и папок?
  • Решение 2: найти для каждой проблемы конкретное решение. В случае rm самый быстрый способ — переместить вещи в какую-то папку .trash и выполнить фактический rm в фоне (хотя это означает, что нужно будет помнить о том, чтобы позже проверить, прошла ли удаление успешно). В любом случае, я все же предпочитаю дождаться завершения команды, чтобы проверить, что все прошло хорошо. Итак, какой самый быстрый способ, предпочтительно с использованием инструментов, уже установленный в распространенных дистрибутивах, чтобы удалить набор файлов и/или папок?

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

Более Быстрый Удаление Файлов в Сетевых Файловых Системах AWS

Работа с удаленными сетевыми файлами на AWS может быть значительно замедлена из-за высоких задержек ввода-вывода (I/O). Измерения показывают, что большая часть времени выполнения операций, таких как du, find или rm, тратится именно на I/O, что делает их неэффективными для больших объемов данных. В данном ответе будут рассмотрены две основные стратегии для ускорения процесса удаления файлов в такой среде.

1. Параллелизация Поиска Файлов

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

find . ! -name '.' | parallel -j <количество_процессов> rm -r

Здесь команда parallel из набора утилит GNU позволяет запускать несколько операций rm одновременно, значительно ускоряя процесс удаления. Параметр -j указывает количество параллельных процессов, которые вы хотите запустить. Оптимальное количество процессов зависит от вашей сетевой инфраструктуры и производительности сервера.

Примечание

Убедитесь, что вы установили утилиту parallel, так как она не входит в стандартную поставку большинства дистрибутивов Linux. Установить её можно с помощью пакетного менеджера вашей системы, например:

sudo apt-get install parallel   # Для Debian/Ubuntu
sudo yum install parallel       # Для CentOS/Fedora

2. Перемещение Временных Файлов

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

  1. Создайте временную папку:
mkdir ~/.trash
  1. Переместите все файлы и папки в .trash:
mv * ~/.trash/
  1. Удалите содержимое папки .trash асинхронно:
rm -r ~/.trash &

Таким образом, команда mv выполняется быстро, и вы можете продолжить работу, пока система обрабатывает запрос на удаление в фоновом режиме. Этот подход эффективен, но требует от вас контроля за содержимым папки .trash, чтобы не потерять важные файлы.

Заключение

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

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

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

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