Meglio usare rm -rf in esecuzione locale anziché su nfs?


10

Farebbe molta differenza nel tempo per accedere al computer che ha la directory prima di fare un rm -rfnella directory, o solo rm -rfla directory su NFS?

Risposte:


11

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:

  1. il tuo rmcomando dà il unlink()syscall
  2. Il driver nfs lo converte in una richiesta sunrpc, lo invia al server nfs
  3. Il server nfs converte questa richiesta sunrpc in una unlink()chiamata
  4. esegue questa unlink()chiamata sul lato remoto
  5. dopo che ha avuto successo, restituisce il messaggio di risposta rpc equivalente di "va bene, è fatto" al client
  6. il driver del kernel sul lato client lo converte nel codice di uscita 0 della unlink()chiamata dell'originalerm
  7. rm scorre il file successivo, vai a 1

Ora, l'importante è: tra 2-7, rmdeve 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:

  1. Innanzitutto sposta la directory con un nome diverso ( mv -vf oldfilms oldfilms-)
  2. Elimina in background ( 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:

  • per determinare se si tratta di un file o una directory (con una lstat()syscall),
  • quindi fare di conseguenza. Nel caso di file ordinari unlink(), nel caso di directory opendir(), eliminando tutti i file / directory in modo ricorsivo, quindi closedir(), infine rmdir().
  • infine, passa alla voce di rubrica successiva con una readdir()chiamata.

Ciò richiede i comandi RPC 3 nfs per i file e altri 3 per le directory.


2
Il caso nfs è anche peggio. Come domanda menziona -rflag, rmdeve prima verificare se il file è una directory ( lstattramite nfs), aprirlo ( opendirtramite nfs), leggere il suo contenuto ( readdirvia 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 ( closedirvia nfs) e poi ripeti, per ogni directory trovata.
el.pescado,

5

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.