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, welche Spezifikationen der Dateiserver in Bezug auf Geschwindigkeit, Netzwerkfähigkeit usw. aufweist. 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 Dateiserver.

Die Verwendung von cp zum Kopieren einer Datei mit ~ 20 GB vom Dateiserver auf eine der lokalen Festplatten dauert durchschnittlich etwa 11,5 Minuten in Echtzeit (laut time). Ich weiß, dass diese cp -Operation nicht sehr effizient ist, da (1) time mir sagt, dass die Systemzeit für eine solche Kopie nur ~ beträgt 45 Sekunden; und weil (2) wenn ich top während des Kopierens untersuche, % CPU ist ziemlich niedrig (laut Inspektion ungefähr 0-10% im Durchschnitt).

Die Verwendung von cp zum Kopieren derselben ~ 20-GB-Datei von einem Ordner auf der lokalen Festplatte in einen anderen Ordner auf derselben lokalen Festplatte dauert weniger Zeit – etwa 9 Minuten in Echtzeit (~ 51 Sekunden in der Systemzeit gemäß 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 zu demselben lokalen nicht schneller als 9 Minuten dauert.

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 zu cp zum Kopieren großer Dateien unter Linux? (Oder gibt es in cp Flags, die ich verwenden könnte, um das Kopieren zu beschleunigen?) Selbst wenn ich diese Kopierzeit irgendwie um eine Minute verkürzen könnte Hilfe immens.

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 – – Ich habe also keinen Zugriff auf detailliertere Informationen zur Last auf den Festplatten. Ich weiß, dass ungefähr ein Dutzend Menschen täglich den Dateiserver verwenden, aber ich bin die einzige Person, die diesen bestimmten Knoten / diese lokale Festplatte verwendet.

Kommentare

  • Das sind ungefähr 29 MB / s, was ziemlich schnell ist, wenn Sie mich fragen. Ich glaube nicht, dass ‚ einen Befehl gibt, der dies beschleunigt, den “ Engpass “ ist höchstwahrscheinlich a) das Netzwerk oder b) der Dateiserver.
  • tink ist 100% korrekt. Ich ‚ habe noch nie etwas gesehen, das dies verbessern könnte. Das einzige, was ich ‚ in der Vergangenheit getan habe, ist, die Daten vor dem Senden zu komprimieren, aber das bedeutet, dass Sie ‚ Zeit hinzufügen mit den Komprimierungsschritten und Dekomprimierungsschritten, aber manchmal lohnt sich ‚, wenn die Daten ein guter Kandidat für die Komprimierung sind!
  • Sie können auch dd und rsync, um zu vergleichen, welche in Ihrer Umgebung schneller funktioniert
  • @Salton Danke. Ich habe dd noch nicht ausprobiert, aber ich habe gerade rsync ausprobiert. Die Echtzeit betrug ungefähr 11,5 Minuten und die Systemzeit betrug ungefähr 1,5 Minuten gemäß time.
  • I ‚ Ich bin überrascht, dass niemand darauf hingewiesen hat, dass die Kopie von lokaler Festplatte zu lokaler Festplatte effizienter werden könnte, wenn mehrere Festplatten bereitgestellt werden. Das Kopieren von /dev/sda1 nach /dev/sdb1 ist schneller als das Kopieren von einem Speicherort auf /dev/sda1 an einen anderen Speicherort auf /dev/sda1 oder an eine andere Partition auf /dev/sda, da die Festplatte ‚ t nicht gewinnt müssen zusätzliche Suchvorgänge zwischen Lese- und Schreibvorgängen durchführen (vorausgesetzt, herkömmliche Festplatten mit sich drehenden Festplatten und beweglichen Köpfen; SSD ist offensichtlich anders).

Antwort

% CPU sollte während einer Kopie niedrig sein. Die CPU teilt dem Plattencontroller mit, „Daten aus den Sektoren X – Y in den Speicherpuffer bei Z zu erfassen“. Dann geht es und macht etwas anderes (oder schlafen, wenn es nichts anderes gibt). Die Hardware löst einen Interrupt aus, wenn sich die Daten im Speicher befinden. Dann muss die CPU es einige Male kopieren und teilt der Netzwerkkarte mit, dass „Pakete an den Speicherstellen A, B und C übertragen werden“. Dann geht es wieder um etwas anderes.

Sie drücken ~ 240 MBit / s.In einem Gigabit-LAN sollten Sie mindestens 800 MBit / s ausführen können, aber:

  1. Dies wird von allen Benutzern des Dateiservers (und möglicherweise einer Verbindung zwischen Switches usw.) Geteilt / li>
  2. Dies ist durch die Geschwindigkeit begrenzt, mit der der Dateiserver das Schreiben verarbeiten 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 greifen auf den Dateiserver zu (NFS, CIFS (Samba), AFS usw.). Möglicherweise müssen Sie Ihren Netzwerk-Mount optimieren, aber bei halbwegs aktuellen Versionen sind die Standardeinstellungen normalerweise recht normal.

Um den Engpass aufzuspüren, iostat -kx 10 wird ein nützlicher Befehl sein. Es zeigt Ihnen die Auslastung auf Ihren lokalen Festplatten. Wenn Sie diese auf dem Dateiserver ausführen können, erfahren Sie, wie beschäftigt der Dateiserver ist.

Die allgemeine Lösung lautet Beschleunigen Sie diesen Engpass, für den Sie natürlich nicht das Budget haben. Es gibt jedoch einige Sonderfälle, in denen Sie einen schnelleren Ansatz finden können:

  • Wenn die Dateien komprimierbar sind, und Sie haben eine schnelle CPU, eine minimale Komprimierung im laufenden Betrieb ist möglicherweise schneller. So etwas wie lzop oder vielleicht gzip --fastest.
  • Wenn Sie hier und da nur ein paar Bits ändern und dann die Datei zurücksenden, ist das Senden von Deltas viel schneller. Leider rsync hilft 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 beim Ändern der Datei verfolgt … Die meisten Ansätze hier sind app-spezifisch. Es ist jedoch möglich, dass Sie etwas mit z. B. Device-Mapper (siehe das brandneue dm-era-Ziel ) oder btrfs aufrüsten.
  • Wenn Sie dieselben Daten auf mehrere Computer kopieren, können Sie sie mit udpcast gleichzeitig an alle Computer senden.

Und, Da Sie feststellen, dass Sie nicht der Systemadministrator sind, bedeutet dies vermutlich, dass Sie einen Systemadministrator haben. Oder zumindest jemanden, der für das Netzwerk des Dateiservers & verantwortlich ist. Sie sollten ihn wahrscheinlich fragen / Sie sollten mit den Besonderheiten Ihres Setups viel besser vertraut sein. Ihre Systemadministratoren sollten Ihnen zumindest sagen können, welche Übertragungsrate Sie vernünftigerweise erwarten können.

Kommentare

  • +1 für iostat -kx 10 🙂

Antwort

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 und schließen Sie sie an den Server und kopieren Sie die Dateien auf die Festplatte. Tragen Sie die Festplatte zu Ihrem lokalen Computer. Kopieren Sie die Dateien auf den Computer.

Kommentare

Antwort

Wenn Sie direkten SSH- (oder SFTP-) Zugriff haben (fragen Sie Ihren Systemadministrator), können Sie scp mit Komprimierung verwenden (-C):

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

Das ist natürlich nur nützlich, wenn die Datei komprimierbar ist, und dies wird seitdem mehr CPU-Zeit verbrauchen Es wird Verschlüsselung (weil es über SSH ist) und Komprimierung verwenden.

Kommentare

  • In diesem Fall wäre es nützlich, zu deaktivieren die Verschlüsselung. Denken Sie daran, dass wir versuchen, die Kopie schneller zu machen.
  • @lgeorget Ich vermute, dass der Overhead der Verschlüsselung ‚ nicht signifikant ist , wenn man bedenkt, wie langsam Festplatten sind. Ich habe überlegt, etwas über -c none hinzuzufügen, aber das scheint nicht dem Standard zu entsprechen .
  • 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 Verschlüsselung kann sein Er ist weitaus schneller als der Durchsatz, den er ‚ erhält, sodass ‚ nichts verlangsamt. Es scheint jedoch unnötig, hier SSH zu durchlaufen. Wenn Sie nur eine Komprimierung benötigen, gibt es sicherlich noch andere Tools?
  • @Thomas Der Vorteil von SSH besteht darin, dass Sie ‚ Zugriff auf den Remote-Server haben sollen. dann läuft ‚ mit ziemlicher Sicherheit SSH. Eine andere Möglichkeit wäre, die Datei lokal zu komprimieren, auf den Server zu kopieren, dann ssh einzutragen und zu dekomprimieren.

Antwort

Ihre Definition von effizient ist rückwärts. Eine effizientere Implementierung verschwendet weniger CPU-Zeit. Auf der lokalen Kopie liegt der durchschnittliche Durchsatz bei 74 MB / s (Lesen + Schreiben), was ungefähr so gut ist, wie es eine einzelne Festplatte erreichen wird.

Kommentare

  • Ups.Als ich sagte, “ effizient, “ meinte ich “ schnell. “

Antwort

Die cp Die Implementierung ist höchstwahrscheinlich kein Engpass. Versuchen Sie, die E / A-Nutzung über iotop sowohl 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 besteht darin, 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 viel schneller, wenn Sie Dateien auf Peer-to-Peer-Weise kopieren und nicht auf Server-zu-All-Clients. Die Implementierung ist etwas komplizierter, aber Sie können sogar versuchen, ein Befehlszeilen-P2P wie einen Direktverbindungs-Hub zu verwenden.

Wenn innerhalb dieser 20G-Dateien ein Teil häufig und einige Clusterknoten-spezifisch sind, sollten Sie dies berücksichtigen Teilen Sie es in gemeinsame und bestimmte Teile auf und verteilen Sie es dann auf p2p-Weise.

Kommentare

  • Wenn Sie ‚ Wenn Sie sich in einem LAN befinden, sollten Sie Multicast anstelle von Peer-to-Peer ausführen können. Dies sollte schneller sein und das Netzwerk weniger belasten.

Antwort

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 , ist es das?

Wenn diese Dateien komprimierbar sind oder ähnliche / identische Teile haben, haben Sie zwei Möglichkeiten:

  • komprimieren Sie sie vor dem Kopieren oder erstellen Sie eine Tunnel zwischen den Computern mit aktivierter Zip-Funktion. Wenn das Netzwerk also der Engpass ist, ist es etwas schnell r

  • Wenn die Dateien sehr ähnlich sind oder einige gemeinsame Inhalte gemeinsam haben, verwenden Sie rsync . Es wird einige Zeit damit verbringen, herauszufinden, was in den Dateien gemeinsam ist, und es muss nicht buchstäblich kopiert werden, da es auf der Grundlage der Gemeinsamkeiten rekonstruiert wird.

Müssen Sie diese Dateien viele Male kopieren? (wie eine Kopie -> verwenden Sie diese Dateien -> ändern Sie etwas in den Dateien auf dem Computer A -> kopiere die Dateien erneut auf den Computer B)

Wenn ja, ist rsync hilfreich, da es versucht, die Gleichheit zwischen den Versionen zu erkennen und nicht zu kopieren, was unverändert ist.

Und eine dritte Methode: Wenn das oben Gesagte korrekt ist (Änderungen in der Datei, dann kopieren Sie alle Dateien erneut auf den zweiten Computer), können Sie versuchen, binary diff zu verwenden Änderung im zweiten Computer Was auf dem ersten Computer geändert wurde.

Antwort

Ich sehe hier Folgendes: Verschlüsselung ist keine Gute Idee, da dies möglicherweise die zu übertragende Datenmenge ERHÖHEN könnte.

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

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

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

Diese Operation ist NICHT parallel.

Um die Arbeit zu beschleunigen, können Sie Folgendes verwenden:

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

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

Der Pufferbefehl 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 kommunizieren. Der Shared Memory Buffer ist Ihr klassischer Ringpuffer, der das Überschreiben ungeschriebener Daten und das Schreiben bereits geschriebener Daten verhindert. Ich habe dieses Programm verwendet, um etwa 10 bis 20% der Kopierzeit bei Übertragungen von der Festplatte auf das Band zu verkürzen.

Kommentare

  • Tatsächlich gibt es Parallelität in “ einen Block lesen / einen Block schreiben “ weil “ einen Block “ legt es tatsächlich nur im Puffer des Kernels ‚ ab, und der Kernel verarbeitet den eigentlichen Blockschreibvorgang im Hintergrund (zumindest bis Sie) RAM wird knapp). Oder wenn Sie aus irgendeinem Grund O_DSYNC / O_SYNC verwenden.

Antwort

Probieren Sie einen P2P-Ausbreitungsalgorithmus aus , wenn Sie Ihren gesamten Cluster gleichzeitig aktualisieren müssen?

https://github.com/lg/murder ist Was Twitter verwendet

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

Antwort

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

git oder hg können Deltas verfolgen und erkennen und nur diese Deltas übertragen. Im Falle der Verwendung eines Git ist es sehr billig, das Delta herauszufinden, da beide Seiten die vollständige Historie des Repositorys haben.

rsync verwendet eine Form des rollierenden Prüfsummierungsalgorithmus, um Deltas zu erkennen, ohne vorher zu wissen, was auf der anderen Seite ist. Während rsync mehr Arbeit benötigt, um die Deltas zu berechnen, muss es nicht das Ganze speichern Dateiversionsverlauf.

Antwort

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

Kommentare

  • Gute allgemeine Beobachtung, aber wie die Frage sagt „~ 200 große Dateien – jeweils ~ 20 GB“, glaube ich nicht ‚, dass dies als tatsächliche Antwort auf dieses Problem angesehen werden kann.
  • @manatwork ah .. ich habe ‚ nicht klar gelesen. Ich dachte, er hätte 200 Dateien mit insgesamt 20 GB

Antwort

Versuchen Sie bbcp . Tests in unserer Umgebung ergaben, dass cp eine Art o hatte f eingebauter Gouverneur. Seien Sie vorsichtig, denn wenn Sie den Gouverneur abheben, 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.

Antwort

Stellen Sie sicher, dass das Ziel erreicht ist Dateien sind vor dem Kopieren nicht vorhanden.

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

Siehe meine Antwort auf eine andere CP-Frage hier . Kurz gesagt, das Überschreiben einer vorhandenen Datei ist viel langsamer als das Abschneiden oder das Aufheben der Verknüpfung. und dann kopieren. Letzteres ist für eine 1,2-GB-Datei 8x schneller.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.