Відповіді:
Звичайно, ssh - тим краще.
Nfs використовує складний мережевий протокол з різними віддаленими викликами процедур та синхронізацією даних. Що стосується ssh, вони не застосовуються.
Крім того, є багато замків. Видалення файлу в nfs працює таким чином:
rmкоманда дає unlink()syscallunlink()викликunlink()виклик на віддаленій стороніunlink()виклику вашого оригіналуrmrm переходить до наступного файлу, перейдіть до 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) та повторіть для кожного знайденого режиму.