Risposte:
Naturalmente lo ssh è il migliore.
Nfs utilizza un protocollo di rete complesso con varie chiamate di procedure remote e tempi di attesa per la sincronizzazione dei dati. Nel caso di ssh, questi non si applicano.
Inoltre, ci sono molte serrature. La cancellazione dei file in nfs funziona in questo modo:
rm
comando dà il unlink()
syscallunlink()
chiamataunlink()
chiamata sul lato remotounlink()
chiamata dell'originalerm
rm
scorre il file successivo, vai a 1Ora, l'importante è: tra 2-7, rm
deve aspettare. Potrebbe inviare la unlink()
chiamata successiva in modo asincrono, ma è uno strumento a thread singolo, non orientato agli eventi. Anche se potesse, richiederebbe comunque flag di mount di nfs difficili. Fino a quando non ottiene il risultato, aspetta.
Nfs - e qualsiasi file system di rete - è sempre molto più lento.
In molti casi, è possibile effettuare eliminazioni ricorsive con velocità quasi infinita con un trucco:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)Da molti (ma non tutti) aspetti, questa rimozione di directory sembrerà avvenuta in un tempo praticamente zero.
Estensione: come menziona @ el.pascado nel suo eccellente commento, in realtà 2-7 deve eseguire 3x per qualsiasi file:
lstat()
syscall),unlink()
, nel caso di directory opendir()
, eliminando tutti i file / directory in modo ricorsivo, quindi closedir()
, infine rmdir()
.readdir()
chiamata.Ciò richiede i comandi RPC 3 nfs per i file e altri 3 per le directory.
Sì. Beh forse. Dipende. Per un piccolo numero di file e directory, non farebbe molta differenza.
L'esecuzione di operazioni su file in blocco su una directory montata su NFS è lenta. Se hai la possibilità di accedere al server NFS stesso e di eseguirli nella directory effettiva, questo sarebbe più veloce.
Proviamo rimuovendo la raccolta di porte OpenBSD che ho verificato da CVS e montato su NFS:
Sul server 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
Sul client (dopo aver ripristinato i file originali dal backup):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
flag,rm
deve prima verificare se il file è una directory (lstat
tramite nfs), aprirlo (opendir
tramite nfs), leggere il suo contenuto (readdir
via nfs) e solo allora eseguire la cancellazione effettiva come descritto nella risposta su ogni file trovato all'interno e ricorrendo in sottodirectory, chiudi la directory (closedir
via nfs) e poi ripeti, per ogni directory trovata.