Odpowiedzi:
Oczywiście ssh jest lepszy.
Nfs używa złożonego protokołu sieciowego z różnymi zdalnymi wywołaniami procedur i czasami oczekiwania synchronizacji danych. W przypadku ssh nie mają one zastosowania.
Ponadto istnieje wiele zamków. Usuwanie plików w NFS działa w ten sposób:
rm
polecenie daje unlink()
syscallunlink()
wywołanieunlink()
wywołanie po stronie zdalnejunlink()
wywołania twojego oryginałurm
rm
przechodzi do następnego pliku, goto 1Teraz ważne jest: między 2-7, rm
musi czekać. Może wysyłać następne unlink()
wywołanie asynchronicznie, ale jest to narzędzie jednowątkowe, nie zorientowane na zdarzenie. Nawet gdyby mógł, nadal wymagałoby trudnych flag montowania NFS. Dopóki nie uzyska wyniku, czeka.
Nfs - i każdy sieciowy system plików - jest zawsze znacznie wolniejszy.
W wielu przypadkach możesz wykonać rekursywne usuwanie quasi-nieskończoną prędkością za pomocą sztuczki:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)Z wielu (ale nie wszystkich) aspektów to usunięcie katalogu będzie wyglądało, jakby miało miejsce praktycznie w czasie zero.
Rozszerzenie: Jak wspomina @ el.pascado w swoim doskonałym komentarzu, właściwie 2-7 musi uruchomić 3x dla każdego pliku:
lstat()
syscall),unlink()
w przypadku katalogów opendir()
, usuwając wszystkie pliki / katalogi w nim rekurencyjnie, to closedir()
w końcu rmdir()
.readdir()
połączeniem.Wymaga to 3 poleceń RPC nfs dla plików i dodatkowych 3 dla katalogów.
Tak. Być może. To zależy. W przypadku niewielkiej liczby plików i katalogów nie zrobiłoby to dużej różnicy.
Zbiorcze wykonywanie plików w katalogu podłączonym do systemu plików NFS jest powolne. Jeśli masz możliwość zalogowania się do samego serwera NFS i zrobienia ich w rzeczywistym katalogu, byłoby to szybsze.
Przetestujmy to, usuwając kolekcję portów OpenBSD, którą wypisałem z CVS i zamontowałem na NFS:
Na serwerze 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
Na kliencie (po przywróceniu oryginalnych plików z kopii zapasowej):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
flagę,rm
musi najpierw sprawdzić, czy plik jest katalogiem (lstat
przez nfs), otworzyć go (opendir
przez nfs), przeczytać jego zawartość (readdir
przez nfs), a dopiero potem wykonać faktyczne usunięcie zgodnie z opisem w odpowiedzi na każdy plik znaleziony w środku i rekursywnie do podkatalogów, zamknij katalog (closedir
przez nfs), a następnie powtórz dla każdego znalezionego katalogu .