Gibt es eine schnellere Alternative zu cp zum Kopieren großer Dateien (~ 20 GB)?

40

Ich bin ein Doktorand, und die Gruppe, in der ich arbeite, unterhält einen Linux-Cluster. Jeder Knoten des Clusters verfügt über eine eigene lokale Festplatte, diese lokalen Festplatten sind jedoch relativ klein und nicht mit einer automatischen Sicherung ausgestattet. Die Gruppe besitzt also einen Dateiserver mit vielen TB Speicherplatz. Ich bin ein relativer Linux-Neuling, daher bin ich mir nicht sicher, was die Spezifikationen des Dateiservers in Bezug auf Geschwindigkeit, Netzwerkfähigkeit usw. sind. Ich weiß aus Erfahrung, dass die lokalen Festplatten in Bezug auf E / A erheblich schneller sind als der Dateiserver . Ungefähr ein Dutzend Leute benutzen den Fileserver.

Das cpKopieren einer ~ 20-GB-Datei vom Dateiserver auf eine der lokalen Festplatten dauert durchschnittlich (laut time) ca. 11,5 Minuten in Echtzeit . Ich weiß, dass dieser cpVorgang nicht sehr effizient ist, da (1) timemir mitteilt, dass die Systemzeit für eine solche Kopie nur ~ 45 Sekunden beträgt; und weil (2), wenn ich topwährend des Kopierens untersuche, % CPU ziemlich niedrig ist (nach Prüfung durchschnittlich etwa 0-10% ).

Das cpKopieren derselben ~ 20-GB-Datei von einem Ordner auf der lokalen Festplatte in einen anderen Ordner auf derselben lokalen Festplatte dauert weniger Zeit - ungefähr 9 Minuten in Echtzeit (je nach Systemzeit ~ 51 Sekunden time). Anscheinend ist der Dateiserver also erwartungsgemäß etwas langsamer als die lokale Festplatte, aber möglicherweise nicht wesentlich langsamer. Ich bin überrascht, dass das Kopieren von lokal auf dasselbe lokal nicht schneller als 9 Minuten ist.

Ich muss ~ 200 große Dateien - jeweils ~ 20 GB - vom Dateiserver auf eine der lokalen Festplatten kopieren. Meine Frage lautet also: Gibt es eine schnellere Alternative zum cpKopieren großer Dateien unter Linux? (Oder gibt es irgendwelche Flags cp, die ich verwenden könnte, um das Kopieren zu beschleunigen?) Selbst wenn ich diese Kopierzeit auf irgendeine Weise um eine Minute verkürzen könnte, würde das immens helfen.

Ich bin sicher, dass ich neue, schnellere Hardware-Festplatten kaufe, aber ich habe keinen Zugriff auf solche Ressourcen. Ich bin auch kein Systemadministrator - ich bin nur ein (Anfänger-) Benutzer - also habe ich keinen Zugriff auf detailliertere Informationen über die Last, die sich auf den Datenträgern befindet. Ich weiß, dass während ungefähr ein Dutzend Leute den Dateiserver täglich benutzen, ich die einzige Person bin, die diesen bestimmten Knoten / lokalen Datenträger benutzt.

Andrew
quelle
29
Das sind ungefähr 29 MB / s, was ziemlich schnell ist, wenn Sie mich fragen. Ich glaube nicht, dass es irgendeinen Befehl gibt, der dies beschleunigt, der "Engpass" ist höchstwahrscheinlich a) das Netzwerk oder b) der Dateiserver.
Tink
5
Tink ist 100% richtig. Ich habe noch nie etwas gesehen, das dies verbessern kann. Das Einzige, was ich in der Vergangenheit getan habe, ist, die Daten vor dem Senden zu komprimieren. Das bedeutet jedoch, dass Sie Zeit für die Komprimierungs- und Dekomprimierungsschritte aufwenden. Manchmal lohnt es sich jedoch, wenn die Daten ein guter Kandidat sind komprimiert!
slm
3
Sie können auch versuchen ddund rsynczu vergleichen , die man schneller in Ihrer Umgebung funktioniert
Raza
@Salton Danke. Ich habe es noch nicht versucht dd, aber ich habe es nur versucht rsync. Die Echtzeit betrug ungefähr 11,5 Minuten und die Systemzeit ungefähr 1,5 Minuten time.
Andrew
2
Ich bin überrascht, dass niemand darauf hingewiesen hat, dass das Kopieren von lokaler Festplatte zu lokaler Festplatte durch das Bereitstellen mehrerer Festplatten effizienter gestaltet werden könnte. Das Kopieren von /dev/sda1nach /dev/sdb1ist schneller als das Kopieren von einem Speicherort an /dev/sda1einen anderen Speicherort auf /dev/sda1oder auf eine andere Partition, /dev/sdada die Festplatte keine zusätzlichen Suchvorgänge zwischen Lese- und Schreibvorgängen ausführen muss (unter der Annahme herkömmlicher Festplatten mit sich drehenden Datenträgern und sich bewegenden Köpfen; SSD ist offensichtlich anders).
Tripleee

Antworten:

53

% CPU sollte während eines Kopiervorgangs niedrig sein. Die CPU teilt dem Plattencontroller mit, dass Daten von den Sektoren X – Y in den Speicherpuffer bei Z aufgenommen werden sollen. Dann geht es los und macht etwas anderes (oder schläft, wenn es nichts anderes gibt). Die Hardware löst einen Interrupt aus, wenn sich die Daten im Speicher befinden. Die CPU muss es dann einige Male kopieren und teilt der Netzwerkkarte mit, dass Pakete an den Speicherorten A, B und C übertragen werden sollen. Dann geht es wieder darum, etwas anderes zu tun.

Du drückst ~ 240mbps. In einem Gigabit-LAN ​​sollten mindestens 800 MBit / s möglich sein, aber:

  1. Dies gilt für alle Benutzer des Dateiservers (und möglicherweise für eine Verbindung zwischen Switches usw.).
  2. Dies ist begrenzt durch die Geschwindigkeit, mit der der Dateiserver mit dem Schreiben umgehen kann, wobei zu berücksichtigen ist, dass die Festplatten-E / A-Bandbreite von allen Benutzern gemeinsam genutzt wird.
  3. Sie haben nicht angegeben, wie Sie auf den Dateiserver zugreifen (NFS, CIFS (Samba), AFS usw.). Möglicherweise müssen Sie Ihre Netzwerkbereitstellung optimieren, aber bei allen neueren Versionen sind die Standardeinstellungen in der Regel ziemlich normal.

Es iostat -kx 10wird ein nützlicher Befehl sein , um den Engpass aufzuspüren . Es zeigt Ihnen die Auslastung Ihrer lokalen Festplatten. Wenn Sie dies auf dem Dateiserver ausführen können, werden Sie darüber informiert, wie beschäftigt der Dateiserver ist.

Die allgemeine Lösung wird darin bestehen, diesen Engpass zu beschleunigen, für den Sie natürlich nicht das Budget haben. Es gibt jedoch einige Sonderfälle, in denen Sie schneller vorgehen können:

  • Wenn die Dateien komprimierbar sind und Sie eine schnelle CPU haben, ist es möglicherweise schneller , eine minimale Komprimierung im laufenden Betrieb durchzuführen. So ähnlich lzopoder vielleicht gzip --fastest.
  • Wenn Sie hier und da nur ein paar Bits ändern und dann die Datei zurücksenden, werden nur Deltas viel schneller gesendet. Leider rsynchilft das hier nicht wirklich, da die Datei auf beiden Seiten gelesen werden muss, um das Delta zu finden. Stattdessen benötigen Sie etwas, das das Delta nachverfolgt, wenn Sie die Datei ändern ... Die meisten Ansätze sind hier app-spezifisch. Es ist jedoch möglich, dass Sie sich etwas einfallen lassen, z. B. Device-Mapper (siehe das brandneue Ziel aus der dm-Ära ) oder btrfs.
  • Wenn Sie dieselben Daten auf mehrere Computer kopieren , können Sie sie mit udpcast an alle Computer gleichzeitig senden.

Und da Sie feststellen, dass Sie nicht der Systemadministrator sind, bedeutet dies, dass Sie einen Systemadministrator haben. Oder zumindest jemand, der für den Dateiserver und das Netzwerk verantwortlich ist. Sie sollten ihn / sie / sie wahrscheinlich fragen, sie sollten mit den Besonderheiten Ihres Setups viel besser vertraut sein. Ihr Systemadministrator sollte Ihnen zumindest mitteilen können, mit welcher Übertragungsrate Sie angemessen rechnen können.

derobert
quelle
+1 für iostat -kx 10 :-)
n611x007
16

Dies könnte möglicherweise eine schnellere Alternative sein, und Sie werden das Netzwerk zwei Tage lang nicht verstopfen: Nehmen Sie ein oder zwei große USB- (USB 3, falls vorhanden) oder FireWire-Festplatten, verbinden Sie sie mit dem Server und kopieren Sie die Dateien auf die Scheibe. Tragen Sie den Datenträger zu Ihrem lokalen Computer. Kopieren Sie die Dateien auf den Computer.

Thomas Padron-McCarthy
quelle
23
Sneakernet ( en.wikipedia.org/wiki/Sneakernet ) kann sehr schnell sein: Unterschätzen Sie nie die Bandbreite eines Kombis voller Bänder rast auf der Autobahn.
SplinterReality
10

Ihre Definition von effizient ist rückwärts. Eine effizientere Implementierung verschwendet weniger CPU-Zeit. Auf der lokalen Kopie liegt der durchschnittliche Datendurchsatz bei 74 MB / s (Lesen + Schreiben), was ungefähr der Leistung einer einzelnen Festplatte entspricht.

Psusi
quelle
1
Hoppla. Als ich "effizient" sagte, meinte ich "schnell".
Andrew
10

Wenn Sie direkten SSH- (oder SFTP-) Zugriff haben (fragen Sie Ihren Sysadmin), können Sie scpmit compression ( -C) Folgendes verwenden :

scp -C you@server:/path/to/yourfile .

Das ist natürlich nur sinnvoll, wenn die Datei komprimierbar ist und dies mehr CPU-Zeit beansprucht, da Verschlüsselung (da über SSH) und Komprimierung verwendet werden.

Setzen Sie Monica wieder ein
quelle
In diesem Fall ist es sinnvoll, die Verschlüsselung zu deaktivieren. Denken Sie daran, dass wir versuchen, die Kopie schneller zu machen .
Lgeorget
3
@lgeorget Ich vermute, dass der Aufwand für die Verschlüsselung nicht signifikant ist, wenn man bedenkt, wie langsam die Festplatten sind. Ich habe darüber nachgedacht, etwas hinzuzufügen -c none, aber das scheint kein Standard zu sein .
Setzen Sie Monica am
1
Wir haben es mit ~ 20G-Dateien zu tun, daher ist es ziemlich ineffizient, die Verschlüsselung zu verwenden, wenn sie nicht benötigt wird.
Lgeorget
1
Die @ lgeorget-Verschlüsselung kann viel schneller als der von ihm erzielte Durchsatz durchgeführt werden, sodass nichts verlangsamt wird. Aber es scheint unnötig, hier SSH zu durchlaufen. Wenn Sie nur Komprimierung brauchen, gibt es doch andere Tools?
Thomas
@Thomas Der Vorteil von SSH ist, dass, wenn Sie Zugriff auf den Remote-Server haben sollen, mit ziemlicher Sicherheit SSH ausgeführt wird. Eine andere Möglichkeit wäre, die Datei lokal zu komprimieren, auf den Server zu kopieren und dann sshzu dekomprimieren.
Monica am
8

Die cpImplementierung ist höchstwahrscheinlich kein Engpass. Versuchen Sie, die E / A-Nutzung iotopsowohl auf dem Server als auch auf dem Clusterknoten zu beobachten . Auf diese Weise erhalten Sie eine Vorstellung davon, wo Sie die Leistung verbessern können.

Ein weiterer Tipp ist, das Kopieren derselben Daten von demselben Host zu vermeiden. Wenn Sie beispielsweise eine identische 20G-Datei haben, die vom Dateiserver über das Netzwerk an alle Clusterknoten verteilt werden soll, funktioniert dies wesentlich schneller, wenn Sie Dateien auf Peer-to-Peer-Weise kopieren und nicht auf einen Server für alle Clients. Es ist etwas komplizierter zu implementieren, aber Sie können sogar versuchen, ein Kommandozeilen-P2P wie Direct Connect Hub zu verwenden.

Wenn in diesen 20G-Dateien ein Teil gemeinsam ist und einige spezifisch für Clusterknoten sind, sollten Sie ihn in gemeinsame und spezifische Teile aufteilen und dann den gemeinsamen Teil auf P2P-Weise verteilen.

Michał Šrajer
quelle
1
Wenn Sie sich in einem LAN befinden, sollten Sie Multicast anstelle von Peer-to-Peer durchführen können. Das sollte schneller sein und das Netzwerk weniger belasten.
Derobert
8

Die Art / der Inhalt dieser Dateien kann einen Unterschied machen. Ich habe verstanden, dass Sie 200 Dateien mit jeweils ~ 20 GB von einem Computer auf einen anderen kopieren müssen, oder?

Wenn diese Dateien komprimierbar sind oder ähnliche / identische Teile haben, haben Sie zwei Ansätze:

  • komprimieren Sie sie vor dem Kopieren, oder erstellen Sie einen Tunnel zwischen den Computern mit aktivierter ZIP-Funktion. Wenn also das Netzwerk der Engpass ist, wird es ein bisschen schneller sein

  • Wenn die Dateien sehr ähnlich sind oder einige gemeinsame Inhalte haben, versuchen Sie, rsync zu verwenden . Es wird einige Zeit darauf verwendet, herauszufinden, was in den Dateien häufig vorkommt, und es muss nicht buchstäblich kopiert werden , da es auf der Grundlage der gebräuchlichen Informationen wiederhergestellt wird.

bearbeiten

Müssen Sie diese Dateien mehrmals kopieren? (wie eine Kopie -> benutze diese Dateien -> ändere etwas an den Dateien auf Computer A -> kopiere die Dateien erneut auf Computer B)

In diesem Fall ist rsync hilfreich, da es versucht, die gleichen Werte in den Versionen zu ermitteln und die unveränderten Werte nicht zu kopieren.

Und eine dritte Methode: Wenn das oben Genannte korrekt ist (Änderungen in der Datei, dann kopieren Sie alle Dateien erneut auf den zweiten Computer), könnten Sie versuchen, einige binary diffÄnderungen nur auf dem zweiten Computer vorzunehmen, was auf dem ersten Computer geändert wurde.

woliveirajr
quelle
6

Ich sehe hier Folgendes: Verschlüsselung ist keine gute Idee, da sie möglicherweise die zu übertragende Datenmenge ERHÖHT.

Wenn Sie zwischen zwei Systemen kopieren, ist der Engpass natürlich die Verbindung zwischen den Servern.

Wenn Sie lokal kopieren, sehen Sie sich an, wie der Prozess abläuft. Es handelt sich um einen SINGLE-Thread. Daher verwenden Standard-Linux-Dienstprogramme:

- for all blocks in a file
      read a block
      write a block

Bei dieser Operation gibt es KEINE Parallelität.

Um die Dinge zu beschleunigen, können Sie so etwas verwenden:

  buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte

Weitere Informationen finden Sie in der Manpage buffer (1).

Der Befehl buffer richtet zwei Prozesse ein, um den Kopiervorgang gleichzeitig auszuführen: einen zum Lesen und einen zum Schreiben. Er verwendet einen gemeinsam genutzten Speicherpuffer, um die Daten zwischen den beiden Prozessen zu übertragen. Der Shared Memory Buffer ist Ihr klassischer Ringspeicher, der das Überschreiben von nicht geschriebenen und das Schreiben von bereits geschriebenen Daten verhindert. Ich habe dieses Programm verwendet, um etwa 10-20% der Kopierzeit bei Übertragungen von der Festplatte auf das Band zu verkürzen.

mdpc
quelle
Tatsächlich gibt es eine Parallelität bei "Block lesen / Block schreiben", da "Block schreiben" ihn tatsächlich nur in den Puffer des Kernels legt und der Kernel den eigentlichen Blockschreibvorgang im Hintergrund abwickelt (zumindest bis Sie zu Ende gehen) RAM). Oder wenn Sie aus irgendeinem Grund O_DSYNC / O_SYNC verwenden.
Derobert
3

Probieren Sie einen P2P-Propagierungsalgorithmus aus, wenn Sie gleichzeitig den gesamten Cluster aktualisieren müssen.

https://github.com/lg/murder wird von Twitter verwendet

Es gibt auch BTSync , das Sie ausprobieren können.

Gui13
quelle
1

Wenn Sie häufig dieselben Dateisätze von Ihrem lokalen Computer auf den Server kopieren und hier und da geringfügige Änderungen vornehmen. Sie können die Übertragung mit rsync oder einem DVCS (z. B. hg oder git) beschleunigen.

git oder hg können Deltas verfolgen und erkennen und nur diese Deltas übertragen. Wenn Sie einen Git verwenden, ist es sehr günstig, das Delta zu ermitteln, da beide Seiten eine vollständige Historie des Repositorys haben.

rsync verwendet eine Art Algorithmus für rollierende Prüfsummen, um Deltas zu erkennen, ohne vorher zu wissen, was sich auf der anderen Seite befindet. Während rsync mehr Arbeit benötigt, um die Deltas zu berechnen, muss nicht der gesamte Dateiversionsverlauf gespeichert werden.

Lüge Ryan
quelle
1

Möglicherweise möchten Sie versuchen, alle Dateien in ein einziges Archiv zu packen (muss nicht komprimiert werden). Nach meiner Erfahrung ist das Kopieren dieses einen Archivs schneller als das Kopieren einer großen Anzahl einzelner Dateien

Munim
quelle
3
Gute allgemeine Beobachtung, aber da die Frage "~ 200 große Dateien - jeweils ~ 20 GB" lautet, glaube ich nicht, dass dies eine tatsächliche Antwort auf dieses Problem sein kann.
Manatwork
@manatwork ah .. ich habe nicht klar gelesen. Ich dachte, er hätte 200 Dateien mit insgesamt 20 GB
Munim
0

Versuchen Sie es mit BBCP . Tests in unserer Umgebung haben ergeben, dass in cp eine Art Regler eingebaut ist. Seien Sie vorsichtig, denn wenn Sie den Governer abnehmen, können Sie Ihren Server neu ausrichten und einen Ausfall verursachen. In unserem Fall haben wir den Server offline geschaltet, um die Kopie zu erstellen. Schneller war also besser. Dies verbesserte die Übertragungszeit um mehrere Stunden.

James Shewey
quelle
0

Stellen Sie vor dem Kopieren sicher, dass die Zieldateien nicht vorhanden sind.

Manchmal ist es überraschend, wie viel Zeit auch nur für das Kopieren auf demselben Host aufgewendet wird (kein Netzwerk erforderlich).

Siehe meine Antwort auf eine andere Frage hier . Um es kurz zu machen: Das Überschreiben einer vorhandenen Datei ist viel langsamer als das Abschneiden oder Aufheben der Verknüpfung und das anschließende Kopieren. Letzteres ist 8x schneller für eine 1,2 GB-Datei.

Pierre D
quelle