Wie parallelisiert man den SCP-Befehl?

Wie parallelisiert man den SCP-Befehl?

Ich muss die Dateien per SCP von machineBund machineCnach ü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 zipoder sogar tarund gzipoder bzip2und dann scpdie resultierenden Archive verwenden (dann mit verbinden sshund 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.

https://gist.github.com/KartikTalwar/4393116

verwandte Informationen