Besser lokal rm -rf als über nfs verwenden?

10

Würde es in der Zeit einen großen Unterschied machen, sich auf dem Computer anzumelden, auf dem sich das Verzeichnis befindet, bevor Sie sich rm -rfim Verzeichnis oder nur rm -rfim Verzeichnis über NFS anmelden ?

steviekm3
quelle

Antworten:

11

Natürlich ist die SSH die bessere.

Nfs verwendet ein komplexes Netzwerkprotokoll mit verschiedenen Remoteprozeduraufrufen und Wartezeiten für die Datensynchronisation. Im Fall von ssh gelten diese nicht.

Darüber hinaus gibt es viele Schlösser. Das Löschen von Dateien in NFS funktioniert folgendermaßen:

  1. Ihr rmBefehl gibt den unlink()Syscall
  2. Der nfs-Treiber konvertiert es in eine sunrpc-Anforderung und sendet es an den nfs-Server
  3. Der nfs-Server konvertiert diese sunrpc-Anforderung zurück in einen unlink()Aufruf
  4. führt diesen unlink()Aufruf auf der Remote-Seite aus
  5. Wenn dies erfolgreich ist, wird dem Client die RPC-Antwortnachricht zurückgegeben, die "Alles klar, es ist erledigt" entspricht
  6. Der Kerneltreiber der clientseitigen Seite konvertiert dies zurück in den Exit-Code 0 des unlink()Aufrufs Ihres Originalsrm
  7. rm iteriert zur nächsten Datei, gehe zu 1

Jetzt ist das Wichtigste: zwischen 2-7 rmmuss warten. Es könnte den nächsten unlink()Anruf asynchron senden , aber es ist ein Single-Threaded-Tool, nicht ereignisorientiert. Selbst wenn es könnte, würde es immer noch knifflige NFS-Mount-Flags erfordern. Bis es nicht zum Ergebnis kommt, wartet es.

Nfs - und jedes Netzwerk-Dateisystem - ist immer viel langsamer.


In vielen Fällen können Sie rekursive Löschungen mit einem Trick quasi unendlich schnell ausführen:

  1. Verschieben Sie zuerst das Verzeichnis unter einen anderen Namen ( mv -vf oldfilms oldfilms-)
  2. Im Hintergrund löschen ( rm -rf oldfilms- &)

Unter vielen (aber nicht allen) Gesichtspunkten sieht diese Verzeichnisentfernung so aus, als ob sie in praktisch null Zeit stattgefunden hätte.


Erweiterung: Wie @ el.pascado in seinem ausgezeichneten Kommentar erwähnt, muss 2-7 für alle Dateien 3x ausgeführt werden:

  • um festzustellen, ob es sich um eine Datei oder ein Verzeichnis handelt (mit einem lstat()Systemaufruf),
  • dann entsprechend machen. In den Fällen der gewöhnlichen Dateien, unlink()im Fall von Verzeichnissen, das opendir()Löschen aller Dateien / Verzeichnisse in rekursiv, dann closedir()schließlich rmdir().
  • Schließlich iterieren Sie mit einem readdir()Aufruf zum nächsten Verzeichniseintrag .

Dies erfordert 3 nfs RPC-Befehle für Dateien und weitere 3 für Verzeichnisse.

Peter - Setzen Sie Monica wieder ein
quelle
2
Der NFS-Fall ist noch schlimmer. Wenn die Frage das -rFlag erwähnt , rmmuss zuerst überprüft werden, ob es sich bei der Datei um ein Verzeichnis handelt ( lstatüber nfs), es geöffnet werden ( opendirüber nfs), der Inhalt gelesen werden ( readdirüber nfs) und erst dann das tatsächliche Löschen durchgeführt werden, wie in der Antwort für jede Datei in und beschrieben Rekursiv in Unterverzeichnisse, schließen Sie das Verzeichnis ( closedirüber nfs) und wiederholen Sie es für jedes gefundene Verzeichnis.
el.pescado
5

Ja. Vielleicht. Es hängt davon ab, ob. Bei einer kleinen Anzahl von Dateien und Verzeichnissen würde dies keinen großen Unterschied machen.

Das Ausführen von Dateien in großen Mengen in einem NFS-gemounteten Verzeichnis ist langsam. Wenn Sie die Möglichkeit haben, sich beim NFS-Server selbst anzumelden und diese im eigentlichen Verzeichnis auszuführen, ist dies schneller.

Testen wir es, indem wir die OpenBSD-Ports-Sammlung entfernen, die ich aus CVS ausgecheckt und über NFS gemountet habe:

Auf dem NFS-Server:

$ 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

Auf dem Client (nach dem Wiederherstellen der Originaldateien aus dem Backup):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
Kusalananda
quelle