Ich muss die Dateien per SCP von machineB
und machineC
nach übertragen machineA
. Ich führe mein folgendes Shell-Skript von aus machineA
. Ich habe die SSH-Schlüssel richtig eingerichtet.
Wenn die Dateien nicht in vorhanden sind machineB
, sollten sie in vorhanden sein machineC
. Ich muss alle PARTITION1- und PARTITION2-DATEIEN in den entsprechenden Ordner machineA verschieben, wie unten in meinem Shell-Skript gezeigt -
#!/bin/bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$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" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
rm -r $PRIMARY/*
rm -r $SECONDARY/*
for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
for sl in "${PARTITION2[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Derzeit habe ich 5 Dateien in PARTITION1 UND PARTITION2, aber insgesamt sind es etwa 420 Dateien, das heißt, die Dateien werden einzeln verschoben, was meiner Meinung nach ziemlich langsam sein kann. Gibt es eine Möglichkeit, den Vorgang zu beschleunigen?
Ich verwende Ubuntu 12.04
Antwort1
Die Parallelisierung von SCP ist kontraproduktiv, es sei denn, beide Seiten laufen auf SSDs. Der langsamste Teil von SCP befindet sich im Netzwerk, in diesem Fall hilft die Parallelisierung überhaupt nicht, oder es gibt Festplatten auf beiden Seiten, was Sie durch die Parallelisierung nur noch schlimmer machen: Die Suchzeit wird Sie umbringen.
Sie sagen, dass Maschine A auf einer SSD läuft, also sollte eine Parallelisierung pro Maschine ausreichen. Der einfachste Weg, dies zu tun, besteht darin, die erste For-Schleife in eine Subshell einzubinden und sie in den Hintergrund zu stellen.
( for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done ) &
Antwort2
Sie können GNU Parallel verwenden, um mehrere Aufgaben parallel auszuführen.
In Ihrer Situation scheint es jedoch so, als würden Sie für jede Dateiübertragung eine separate sichere Verbindung herstellen, was wahrscheinlich tatsächlich ziemlich ineffizient ist, insbesondere wenn sich die anderen Computer nicht in einem lokalen Netzwerk befinden.
Der beste Ansatz wäre, ein Tool zu verwenden, das speziell für die Stapeldateiübertragung geeignet ist, z. B. rsync
, das auch über einfaches SSH funktioniert.
Wenn rsync nicht verfügbar ist, können Sie alternativ zip
oder sogar tar
und gzip
oder bzip2
und dann scp
die resultierenden Archive verwenden (dann mit verbinden ssh
und das Entpacken durchführen).
Antwort3
Ich hatte bereits ein Problem mit SCP: zwei Maschinen im selben Netzwerk mit Gigabit-Verbindung, die sehr langsam über SCP übertrugen.
Wenn Sie KEINE Verschlüsselung benötigen, hilft es sicherlich ein wenig, FTP oder NFS zu verwenden.
Ich fand heraus, dass das Problem darin bestand, dass einer der Rechner einen langsamen RAM hatte und die SSH-Verschlüsselung für diesen Rechner sehr anspruchsvoll war. Die Verwendung von FTP oder NFS löste mein Problem, ich kam von 15-20 MB/s auf über 100 MB/s.
[BEARBEITEN]
Ich habe gerade das hier gefunden, das das hervorragende rsync statt scp verwendet. Löst zwar nicht Ihr gesamtes Problem, könnte aber helfen.