it-swarm.com.de

Wie kopiere ich Dateien so schnell wie möglich?

Ich führe mein Shell-Skript auf machineA aus, das die Dateien von machineB und machineC nach machineA kopiert.

Wenn die Datei in machineB nicht vorhanden ist, sollte sie auf jeden Fall in machineC vorhanden sein. Also werde ich zuerst versuchen, von machineB zu kopieren. Wenn es in machineB nicht vorhanden ist, gehe ich zu machineC, um dieselben Dateien zu kopieren.

In machineB und machineC befindet sich ein Ordner wie dieser YYYYMMDD in diesem Ordner -

/data/pe_t1_snapshot

Unabhängig davon, welches Datum das späteste Datum in diesem Format ist - YYYYMMDD im obigen Ordner - Ich wähle diesen Ordner als vollständigen Pfad aus, von dem aus ich mit dem Kopieren der Dateien beginnen muss.

angenommen, dies ist der neueste Datumsordner 20140317 innerhalb von /data/pe_t1_snapshot, dann ist dies der vollständige Pfad für mich.

/data/pe_t1_snapshot/20140317

von dort muss ich mit dem Kopieren der Dateien in machineB und machineC beginnen. Ich muss 400-Dateien in machineA aus machineB und machineC kopieren und jede Dateigröße ist 1.5 GB.

Momentan habe ich mein unteres Shell-Skript, das gut funktioniert, da ich scp verwende, aber irgendwie dauert es ~ 2 hours, um die 400-Dateien in machineA zu kopieren, was meiner Meinung nach zu lang ist. :(

Unten ist mein Shell-Skript -

#!/bin/bash

readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 3 5 7 9) # this will have more file numbers around 200
SECONDARY_PARTITION=(1 2 4 6 8) # this will have more file numbers around 200

dir1=$(ssh -o "StrictHostKeyChecking no" [email protected]${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" [email protected]${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

echo $dir1
echo $dir2

if [ "$dir1" = "$dir2" ]
then
    # delete all the files first
    find "$PRIMARY" -mindepth 1 -delete
    for el in "${PRIMARY_PARTITION[@]}"
    do
        scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
    done

    # delete all the files first
    find "$SECONDARY" -mindepth 1 -delete
    for sl in "${SECONDARY_PARTITION[@]}"
    do
        scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
    done
fi

Ich kopiere PRIMARY_PARTITION Dateien in PRIMARY Ordner und SECONDARY_PARTITION Dateien in SECONDARY Ordner in machineA.

Gibt es eine Möglichkeit, die Dateien in machineA schneller zu verschieben? Kann ich 10 Dateien gleichzeitig oder 5 Dateien gleichzeitig kopieren, um diesen Vorgang oder einen anderen Ansatz zu beschleunigen?

HINWEIS: machineA wird auf SSD ausgeführt

UPDATE: -

Paralleles Shell-Skript, das ich ausprobiert habe. Der obere Teil des Shell-Skripts ist derselbe wie oben gezeigt.

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
    find "$PRIMARY" -mindepth 1 -delete
    for el in "${PRIMARY_PARTITION[@]}"
    do
        (scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.) &
          WAITPID="$WAITPID $!"        
    done

    find "$SECONDARY" -mindepth 1 -delete
    for sl in "${SECONDARY_PARTITION[@]}"
    do
        (scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%[email protected]%h:%p' -o ControlPersist=900 [email protected]${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.) &
          WAITPID="$WAITPID $!"        
    done
     wait $WAITPID
     echo "All files done copying."
fi

Fehler, die ich mit parallelen Shell-Skript bekam

channel 24: open failed: administratively prohibited: open failed
channel 25: open failed: administratively prohibited: open failed
channel 26: open failed: administratively prohibited: open failed
channel 28: open failed: administratively prohibited: open failed
channel 30: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 32: open failed: administratively prohibited: open failed
channel 36: open failed: administratively prohibited: open failed
channel 37: open failed: administratively prohibited: open failed
channel 38: open failed: administratively prohibited: open failed
channel 40: open failed: administratively prohibited: open failed
channel 46: open failed: administratively prohibited: open failed
channel 47: open failed: administratively prohibited: open failed
channel 49: open failed: administratively prohibited: open failed
channel 52: open failed: administratively prohibited: open failed
channel 54: open failed: administratively prohibited: open failed
channel 55: open failed: administratively prohibited: open failed
channel 56: open failed: administratively prohibited: open failed
channel 57: open failed: administratively prohibited: open failed
channel 59: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 61: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 64: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 68: open failed: administratively prohibited: open failed
channel 72: open failed: administratively prohibited: open failed
channel 74: open failed: administratively prohibited: open failed
channel 76: open failed: administratively prohibited: open failed
channel 78: open failed: administratively prohibited: open failed
15
john

sie können diesen Befehl versuchen

rsync

von dem

man rsync

sie werden Folgendes feststellen: Mit dem Remote-Update-Protokoll von rsync kann rsync mithilfe eines effizienten Prüfsummen-Suchalgorithmus, der im technischen Bericht zu diesem Paket beschrieben ist, nur die Unterschiede zwischen zwei Dateigruppen über die Netzwerkverbindung übertragen.

18
oohcode

Versuchen Sie es mit HPN-SSH (Hochleistungs-SSH/SCP). - http://www.psc.edu/index.php/hpn-ssh oder http://hpnssh.sourceforge.net/

Das HPN-SSH-Projekt ist eine Reihe von Patches für OpenSSH (scp ist Teil davon), um verschiedene TCP- und interne Puffer besser abzustimmen. Es gibt auch eine "Keine" -Verschlüsselung ("None Cipher Switching"), die die Verschlüsselung deaktiviert. Dies kann Ihnen auch helfen (wenn Sie zum Senden der Daten keine öffentlichen Netzwerke verwenden).

Sowohl die Komprimierung als auch die Verschlüsselung verbrauchen CPU-Zeit. und 10-Gbit-Ethernet kann manchmal schneller sein, um nicht komprimierte Dateien zu übertragen, als wenn die CPU auf die Komprimierung und Verschlüsselung wartet.

Sie können Ihr Setup profilieren:

  • Messen Sie die Netzwerkbandbreite zwischen Computern mit iperf oder netperf. Vergleichen Sie mit dem tatsächlichen Netzwerk (Netzwerkkartenfunktionen, Switches). Mit einem guten Setup sollten Sie mehr als 80-90 Prozent der angegebenen Geschwindigkeit erreichen.
  • Berechnen Sie das Datenvolumen und die Zeit, die erforderlich ist, um so viele Daten mit Ihrem Netzwerk zu übertragen, indem Sie die Geschwindigkeit von iperf oder netperf verwenden. Gibt es im Vergleich zur tatsächlichen Übertragungszeit einen großen Unterschied?
    • Wenn Ihre CPU schnell ist, Daten komprimierbar sind und das Netzwerk langsam ist, hilft Ihnen die Komprimierung.
  • Werfen Sie einen Blick auf top, vmstat, iostat.
    • Sind die CPU-Kerne zu 100% geladen (führen Sie top aus und drücken Sie 1, um die Kerne anzuzeigen)?
    • Gibt es zu viele Interrupts (in) in vmstat 1? Was ist mit Kontextwechseln (cs)?
    • Was ist die Lesegeschwindigkeit von Dateien in iostat 1? Sind Ihre Festplatten schnell genug, um Daten zu lesen? Daten auf Empfänger schreiben?
  • Sie können versuchen, eine vollständige Systemprofilerstellung mit perf top oder perf record -a durchzuführen. Gibt es viel Computing per SCP oder Netzwerk-Stack in Linux? Wenn Sie dtrace oder ktap installieren können, versuchen Sie auch off-cpu profiling
7
osgx

Sie haben 1,5 GB * 400 = 600 GB Daten. Unabhängig von der Antwort schlage ich vor, dass die Einrichtung der Maschine falsch aussieht, wenn Sie diese Datenmenge übertragen müssen. Wahrscheinlich mussten Sie diese Daten zuerst auf Maschine A generieren.

Es werden 600 GB Daten in 2 Stunden übertragen, dh eine Übertragungsrate von ~ 85 MB/s. Dies bedeutet, dass Sie wahrscheinlich die Übertragungsgrenzen Ihrer Laufwerke oder (fast) des Netzwerks erreicht haben. Ich glaube, Sie können mit keinem anderen Befehl schneller übertragen.

Wenn die Computer nahe beieinander liegen, besteht die meiner Meinung nach schnellste Kopiermethode darin, den Speicher physisch von Computer B und C zu entfernen, sie in Computer A abzulegen und sie dann lokal zu kopieren, ohne sie über das Netzwerk zu übertragen. Die Zeit dafür ist die Zeit, um sich im Speicher zu bewegen, plus Datenträgerübertragungszeiten. Ich befürchte jedoch, dass die Kopie nicht viel schneller als 85 MB/s sein wird.

Der Netzwerkübertragungsbefehl, von dem ich glaube, dass er der schnellste ist, ist netcat, da er keinen Overhead im Zusammenhang mit der Verschlüsselung hat. Wenn die Dateien keine Mediendateien sind, müssen Sie sie mit einem Kompressor komprimieren, der schneller als 85 MB/s komprimiert. Ich kenne lzop und lz4, denen zugestanden wird, dass sie schneller sind als diese Rate. Meine Befehlszeile zum Übertragen eines einzelnen Verzeichnisses wäre also (BSD-Netcat-Syntax):

maschine A:

$ nc -l 2000 | lzop -d | tar x

maschine B oder C (kann mit Hilfe von ssh von Maschine A ausgeführt werden):

$ tar c directory | lzop | nc machineA 2000

Entfernen Sie den Kompressor, wenn Sie bereits komprimierte Mediendateien übertragen.

Die Befehle zum Organisieren Ihrer Verzeichnisstruktur sind in Bezug auf die Geschwindigkeit irrelevant, daher habe ich mich nicht darum gekümmert, sie hier zu schreiben, aber Sie können Ihren eigenen Code wiederverwenden.

Dies ist die schnellste Methode, die ich mir vorstellen kann, aber ich glaube auch nicht, dass dieser Befehl viel schneller sein wird als das, was Sie bereits haben.

5
hdante

Sie möchten auf jeden Fall rclone ausprobieren. Dieses Ding ist schnell verrückt:

Sudo rclone sync/usr/home/fred/temp -P -L --transfers 64

Übertragen: 17.929G/17.929 GByte, 100%, 165.692 MByte/s, ETA 0s Fehler: 75 (Wiederholung kann helfen) Überprüfungen: 691078/691078, 100% Übertragen: 345539/345539, 100% Verstrichene Zeit: 1m50.8s

Dies ist eine lokale Kopie von und zu einer LITEONIT LCS-256 (256 GB) SSD.

1
Frédéric N.

Die Fernbedienung unterstützt kein ssh-Multiplexing.

So bringen Sie die Nachricht zum Schweigen:

mux_client_request_session: session request failed: Session open refused by peer

Ändern Sie Ihre ~/.ssh/config Datei:

Host destination.hostname.com
  ControlMaster no

Host *
  ControlMaster auto
  ControlPersist yes
  ControlPath ~/.ssh/socket-%[email protected]%h:%p

Weitere Details und Hinweise finden Sie hier .

0
Tom Hale

rsync ist eine gute Antwort, aber wenn Sie Wert auf Sicherheit legen, sollten Sie Folgendes in Betracht ziehen:

rdist

Einige Details zu den Unterschieden zwischen rsync und rdist finden Sie hier: rdist vs rsync und ein Blog darüber, wie man es mit ssh einrichtet, finden Sie hier: non root remote update

Schließlich können Sie das berüchtigte Teerpfeifenteermuster mit einem Schuss SSH verwenden.

tar zcvf - /wwwdata | ssh [email protected] "cat > /backup/wwwdata.tar.gz"

Über dieses Beispiel wird hier gesprochen: Teerkopie über sicheres Netzwerk

0
Jeff Sheffield

optional komprimiert rsync seine Daten. Das beschleunigt die Übertragung in der Regel erheblich.

Sie haben SCP nicht erwähnt, aber SCP-C komprimiert auch.

Beachten Sie, dass durch die Komprimierung die Übertragung abhängig von der Geschwindigkeit Ihrer CPU und Ihrer Netzwerkverbindung möglicherweise beschleunigt oder verlangsamt wird.

Langsamere Verbindungen und eine schnellere CPU machen die Komprimierung zu einer guten Idee. Schnellere Verbindungen und langsamere CPU machen die Komprimierung zu einer schlechten Idee.

Messen Sie wie bei jeder Optimierung die Ergebnisse in Ihrer eigenen Umgebung.

Ich denke auch, dass FTP eine weitere Option für Sie ist, da mein Übertragungsgeschwindigkeitstest für große Dateien (> 10 MB) FTP schneller als SCP und sogar rsync funktioniert (abhängig vom Dateiformat und der Komprimierungsrate).

0
M.Abooali