Відповіді:
Звичайно, ssh - тим краще.
Nfs використовує складний мережевий протокол з різними віддаленими викликами процедур та синхронізацією даних. Що стосується ssh, вони не застосовуються.
Крім того, є багато замків. Видалення файлу в nfs працює таким чином:
rm
команда дає unlink()
syscallunlink()
викликunlink()
виклик на віддаленій стороніunlink()
виклику вашого оригіналуrm
rm
переходить до наступного файлу, перейдіть до 1Тепер важливо: між 2-7, rm
доводиться чекати. Він може надсилати наступний unlink()
виклик асинхронно, але це однопоточний, не орієнтований на події інструмент. Навіть якби це могло, це все-таки вимагатиме складних прапорців nfs. Поки це не отримає результат, воно чекає.
Nfs - і будь-яка мережева файлова система - завжди набагато повільніше.
У багатьох випадках ви можете зробити рекурсивні видалення квазінескінченною швидкістю за допомогою трюку:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)З багатьох (але не всіх) аспектів видалення цього каталогу буде виглядати так, ніби це сталося практично в нульовий час.
Розширення: Як згадує @ el.pascado у своєму відмінному коментарі, насправді 2-7 має працювати 3 рази для будь-яких файлів:
lstat()
виклику),unlink()
у випадку каталогів opendir()
, видалення всіх файлів / каталогів у ньому рекурсивно, потім closedir()
, нарешті rmdir()
.readdir()
викликом.Для цього потрібні 3 nfs команди RPC для файлів та додаткові 3 для каталогів.
Так. Ну, можливо. Це залежить. Для невеликої кількості файлів і каталогів це не мало би великої різниці.
Робота файлів масово в каталозі, встановленому NFS, відбувається повільно. Якщо у вас є можливість увійти до самого сервера NFS та зробити їх у фактичному каталозі, то це було б швидше.
Давайте перевіримо це, видаливши колекцію портів OpenBSD, яку я перевірив із CVS та встановив на NFS:
На сервері NFS:
$ cd /export/shared/ports
$ du -hs .
2.6G .
$ find . | wc -l
179688
$ time rm -rf /export/shared/ports/*
0m20.87s real 0m00.12s user 0m04.62s system
На клієнті (після відновлення вихідних файлів із резервної копії):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
прапор,rm
слід спочатку перевірити, чи файл - це каталог (lstat
через nfs), відкрити його (opendir
через nfs), прочитати його вміст (readdir
через nfs), і лише потім виконати фактичне видалення, як описано у відповіді на кожен файл, знайдений всередині та повторюючись у підкаталогах, закрийте каталог (closedir
через nfs) та повторіть для кожного знайденого режиму.