Чому rm повільно працює на зовнішньому накопичувачі (підключений USB, введіть fuseblk) з файлами 50Gb?


21

Я намагався використовувати rsnapshot для створення резервних копій, але вважаю його непридатним. Незважаючи на те, що він може розрізняти каталог (50 Гб) і дублювати його (жорсткий посилання кожного файлу) за кілька хвилин, і я можу копіювати весь каталог приблизно за півгодини, на його видалення потрібно більше години. Навіть безпосередньо використовуючи rm -rfv, я вважаю, що може зайняти до півсекунди rm один файл, тоді як команди cpта linkкоманди завершуються миттєво.

Чому РМ так повільний? Чи є швидший спосіб рекурсивно видалити жорсткі посилання? Для мене немає сенсу, що на копіювання файлу потрібно менше часу, ніж на його видалення.

Файлова система, над якою я працюю, це зовнішній накопичувач, підключений через usb і тип fuseblk (що, на мою думку, означає, що це ntfs). На моєму комп’ютері працює ubuntu linux.

Вихід зверху:

Cpu(s):  3.0%us,  1.5%sy,  0.0%ni, 54.8%id, 40.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8063700k total,  3602416k used,  4461284k free,   557604k buffers

1
Будучи встановленим як fuseblkне означає, що накопичувач NTFS, це просто означає, що він встановлений як блок блоку FUSE. Це могло бути майже все.
Кріс Даун

1
@ChrisDown Правда, але я знаю, що це або NTFS, або ext3, і я майже впевнений, якби це був ext3, він би монтувався як такий монтом без аргументів.
Benubird

1
Це залежить від того, скільки файлів у каталозі (ви не сказали, скільки), і зокрема NTFS сповільнюється лише> 3K файлами в каталозі. Практично кожна інша файлова система набагато ефективніша. Дивіться всі багато інших публікацій в SO / SE про вплив кількості файлів на продуктивність файлової системи.
smci

Відповіді:


28

Зрештою, незалежно від того, чим займаєтесь, rmдоводиться запускати unlinkкожен файл, який ви хочете видалити (навіть якщо ви зателефонували rm -rу батьківський каталог). Якщо файлів потрібно видалити, це може зайняти багато часу.

При запуску є два особливо трудомісткі процеси rm -r:

  1. readdir, за яким
  2. кількість дзвінків на unlink.

Пошук усіх файлів, а потім проходження кожного файлу для його видалення може зайняти дуже-дуже довго.

Якщо ви вважаєте це "непридатним", оскільки воно робить каталог непридатним протягом деякого часу, подумайте про переміщення батьківського каталогу перед його видаленням. Це звільнить цю назву, щоб програма знову використовувалась, не маючи часу надто незручності.

Якщо припустити, що файлова система насправді є NTFS (це незрозуміло з вашого питання), NTFS, як правило, досить повільний при видаленні великих фрагментів файлів. Ви можете подумати про використання більш підходящої файлової системи для своїх цілей (новіші файлові системи ext мають досить гарну ефективність видалення, якщо у вас немає будь-яких інших потреб). ВЗАГАЛЬНІ самі по собі також не особливо швидкі. Ви можете подумати про те, чи можете ви зробити це якимось чином, не використовуючи FUSE.


2
+1 Дійсно багато що залежить від точної файлової системи - багато хто, як правило, справляють дуже добре деякі операції, будучи млявими з іншими (часто це для створення файлів проти видалення проти доступу до даних).
петерф

15

Чому РМ так повільний? Я поняття не маю. Але я знаю більш швидкий спосіб:

mkdir blank
rsync -a --delete blank/ test/

Оновлення: ця відповідь на сервері за замовчуванням має деякі пояснення. Схоже, rsync видаляє файли в певному порядку, що призводить до того, що дерево файлової системи залишається врівноваженим і ніколи не потребує перебалансування. rm просто видалить файли і спричинить багато перебалансування по мірі їх видалення. Існує деяка інформація про перебалансування тут .


1
Ви оцінювали це і порівняли rm -rf? rsyncвсе ще має unlink()всі файли в test/, і, напевно, це потребує часу.
MattBianco

Я формально не орієнтувався на це, але я спробував це, прочитавши чужі орієнтири, і різниця була суттєвою. Я вже не можу знайти цю публікацію, але ця відповідь на сервері за замовчуванням має пояснення та джерело для ще швидшого видалення програми.
rjmunro

Але найшвидший метод повинен бути unlink(2)в каталозі (і пам’ятаючи зробити fsckпізніше) ...
MattBianco

Факт - факт. Просто приурочили його, і це майже вдвічі швидше. Прочитавши код GNU coreutils rm, це навіть не змушує мене замислюватися…
Домінік Джордж

1

Ну, у мене колись була схожа проблема з вашою. Я виявив, що ваш "ва" високий, ви можете використовувати

iostat -x 1

щоб перевірити, чи утиліта вашого диска висока, якщо так, то це означає, що ваш диск досить зайнятий. Перевірте, чи постійно записуються на диск деякі інші процеси.

Для спрощення використовуйте

vmstat 1

перевірити, чи високий b чи r < b . Це вказує на щось не так. У вашій ситуації я вважаю, що диск Io є оригінальною причиною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.