Ответы:
Конечно, ssh - лучше.
Nfs использует сложный сетевой протокол с различными удаленными вызовами процедур и временем ожидания синхронизации данных. В случае с ssh они не применяются.
Кроме того, есть много замков. Удаление файла в NFS работает следующим образом:
rm
команда дает unlink()
системный вызовunlink()
вызовunlink()
вызов на удаленной сторонеunlink()
вызова вашего оригиналаrm
rm
переходит к следующему файлу, перейти к 1Теперь главное: между 2-7, rm
приходится ждать. Он может отправлять следующий unlink()
вызов асинхронно, но это однопоточный, не ориентированный на события инструмент. Даже если бы он мог, он все равно потребовал бы хитрых флагов монтирования nfs. Пока не получится результат, он ждет.
Nfs - и любая сетевая файловая система - всегда намного медленнее.
Во многих случаях вы можете сделать рекурсивные удаления квази-бесконечной скоростью с помощью хитрости:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)Из многих (но не всех) аспектов это удаление каталога будет выглядеть так, как если бы оно произошло практически за нулевое время.
Расширение: как @ el.pascado упоминает в своем превосходном комментарии, фактически 2-7 должно запускаться 3x для любых файлов:
lstat()
системного вызова),unlink()
в случае каталогов, opendir()
рекурсивное удаление всех файлов / каталогов в нем, а затем closedir()
, наконец rmdir()
.readdir()
вызова.Для этого требуется 3 RPC-команды nfs для файлов и дополнительные 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), а затем повторите для каждого найденного каталога .