Вопрос или проблема
В 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. Перемещение Временных Файлов
Другим подходом является временное перемещение файлов в специальную папку, а затем удаление содержимого этой папки в фоновом режиме. Это можно сделать, используя следующие команды:
- Создайте временную папку:
mkdir ~/.trash
- Переместите все файлы и папки в
.trash
:
mv * ~/.trash/
- Удалите содержимое папки
.trash
асинхронно:
rm -r ~/.trash &
Таким образом, команда mv
выполняется быстро, и вы можете продолжить работу, пока система обрабатывает запрос на удаление в фоновом режиме. Этот подход эффективен, но требует от вас контроля за содержимым папки .trash
, чтобы не потерять важные файлы.
Заключение
Обе предложенные стратегии могут значительно ускорить удаление файлов в сетевых файловых системах AWS. Выбор между параллелизацией поиска файлов и перемещением в временные папки зависит от вашей конкретной ситуации и предпочтений. Каждая из них позволяет минимизировать время задержки I/O, что приводит к более эффективной работы с вашим файловым хранилищем.
Для достижения наилучших результатов, тестируйте каждую стратегию и адаптируйте ее в соответствии с вашим окружением. Настройка и оптимизация процессов могут существенно улучшить производительность вашей работы в облаке AWS.