У меня есть файловая система ext3 с параметрами по умолчанию. На нем у меня есть около 100 ГБ файлов.
Удаление любого из таких файлов занимает много времени (8 минут) и вызывает много трафика, что увеличивает нагрузку на сервер.
Есть ли способ сделать rm не таким разрушительным?
Ответы:
Самый интересный ответ изначально был похоронен в комментарии к вопросу. Вот как ответ первого класса, чтобы сделать его более заметным:
Эта ссылка представляет собой невероятно тщательный анализ исследования и обнаружения работоспособного решения.
Обратите внимание также:
В статье говорится:
это правда, но пользователь TafT говорит, что если вы не хотите прерывать работу, тогда
-c3
«холостой ход» будет лучшим выбором, чем-c2
«наилучшие усилия». Он привык-c3
строить в фоновом режиме и нашел, что он работает хорошо, не заставляя сборку ждать вечно. Если вы действительно используете 100% io,-c3
удаление не будет завершено, но он не ожидает, что это то, что вы использовали на основе сработавшего теста.источник
Обновите до ext4 или какой-либо другой современной файловой системы, которая использует экстенты. Поскольку ext3 использует схему косвенных блоков, а не экстентов, удаление больших файлов неизбежно влечет за собой много работы.
источник
Вы можете попробовать Ионис . Это не сделает его быстрее, но это может сделать его менее разрушительным.
источник
С точки зрения эффективности, использование одного rm на файл не является оптимальным, поскольку для каждого rm требуются форк и exec.
Предполагая, что у вас есть list.txt, содержащий файлы, которые вы хотите удалить, это будет более эффективно, но все равно будет медленно:
Другой подход заключается в следующем:
nice -20 xargs -i rm {} < list.txt
(это займет меньше времени, но сильно повлияет на вашу систему :)
или
Я не знаю, как быстро это будет, но:
или
Создайте специальную точку монтирования с быстрой файловой системой (используя устройство петли?), Используйте ее для хранения и удаления ваших огромных файлов.
(возможно, переместите файлы туда, прежде чем удалить их, возможно, это быстрее или, может быть, просто размонтируйте их, когда вы хотите, чтобы файлы исчезли)
или
cat /dev/null > /file/to/be/deleted
(так что теперь он нулевого размера), и если вы хотите, чтобы он исчез прямоrm -rf <file>
сейчасили даже лучше
брось кота и просто сделай
# > /file/to/be/emptied
источник
У меня были проблемы с получением каталога для удаления в разумном темпе, оказалось, что процесс блокировал диск и создавал кучу процессов, пытающихся получить доступ к диску. ionice не работал, он просто продолжал использовать 99% дискового ввода-вывода и блокировал все остальные процессы.
Вот код Python, который работал для меня. Он удаляет 500 файлов за раз, затем делает 2-секундный перерыв, чтобы позволить другим процессам выполнять свою работу, а затем продолжает. Работает отлично.
источник
Мои два цента.
У меня уже есть эта проблема. «В последовательном сценарии, который должен выполняться быстро, процесс удаляет много файлов» .. Таким образом, «rm» сделает скорость выполнения этого сценария близкой к времени ожидания ввода-вывода.
Чтобы ускорить процесс, я добавил еще один процесс (bash-скрипт), запущенный для каждого cron ... как сборщик мусора, он удаляет все файлы в определенном каталоге.
Затем я обновил оригинальный скрипт, заменив «rm» на mv на «мусорную папку» (переименуйте файл, добавив в конце его имя счетчик, чтобы избежать столкновения).
У меня это работает, скрипт запускается как минимум в 3 раза быстрее. но это работает хорошо, только если папка для мусора и исходный файл находятся в одной точке монтирования (на одном устройстве), чтобы избежать копирования файла. (mv на том же устройстве потребляет меньше IO, чем rm)
Надеюсь, что поможет ..
источник
Также обратите внимание, что ответ Денниса Уильямсона, который предлагает ionice в качестве обходного пути для нагрузки, будет работать, только если ваше блочное устройство использует планировщик CFQ io.
источник
Вы можете попробовать создать петлевую файловую систему для хранения ваших резервных копий.
Затем, когда вы хотите очистить резервные копии:
Presto! Вся виртуальная файловая система очищается за считанные минуты.
источник
Вы можете использовать многоголовку с Xargs
где 30 - количество потоков, которые вы хотите создать. Если вы используете ноль, система создает максимальное количество потоков, доступных пользователю, выполняющему задачу.
источник
find
есть-delete
вариант, который является гораздо лучшей альтернативой./ dev / null - это файл, а не каталог. Не удается переместить файл в файл, или вы рискуете перезаписать его.
Я не думаю, что это практично. Он будет использовать излишне больше I / O, чем хотелось бы OP.
источник
На самом деле это устройство, и все данные, записанные на него, удаляются, поэтому
mv <file> /dev/null
имеет смыслисточник