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 cp
Kopieren 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 cp
Vorgang nicht sehr effizient ist, da (1) time
mir mitteilt, dass die Systemzeit für eine solche Kopie nur ~ 45 Sekunden beträgt; und weil (2), wenn ich top
während des Kopierens untersuche, % CPU ziemlich niedrig ist (nach Prüfung durchschnittlich etwa 0-10% ).
Das cp
Kopieren 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 cp
Kopieren 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.
dd
undrsync
zu vergleichen , die man schneller in Ihrer Umgebung funktioniertdd
, aber ich habe es nur versuchtrsync
. Die Echtzeit betrug ungefähr 11,5 Minuten und die Systemzeit ungefähr 1,5 Minutentime
./dev/sda1
nach/dev/sdb1
ist schneller als das Kopieren von einem Speicherort an/dev/sda1
einen anderen Speicherort auf/dev/sda1
oder auf eine andere Partition,/dev/sda
da 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).Antworten:
% 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:
Es
iostat -kx 10
wird 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:
lzop
oder vielleichtgzip --fastest
.rsync
hilft 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.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.
quelle
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.
quelle
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.
quelle
Wenn Sie direkten SSH- (oder SFTP-) Zugriff haben (fragen Sie Ihren Sysadmin), können Sie
scp
mit compression (-C
) Folgendes verwenden :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.
quelle
-c none
, aber das scheint kein Standard zu sein .ssh
zu dekomprimieren.Die
cp
Implementierung ist höchstwahrscheinlich kein Engpass. Versuchen Sie, die E / A-Nutzungiotop
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 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.
quelle
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.quelle
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:
Bei dieser Operation gibt es KEINE Parallelität.
Um die Dinge zu beschleunigen, können Sie so etwas verwenden:
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.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
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.
quelle