¿Cómo paralelizar el comando scp?

¿Cómo paralelizar el comando scp?

Necesito escanear los archivos desde machineBy machineChacia machineA. Estoy ejecutando mi siguiente script de shell desde machineA. He configurado las claves ssh correctamente.

Si los archivos no están en machineB, entonces deberían estar en machineC. Necesito mover todos los ARCHIVOS DE PARTICIÓN1 Y PARTICIÓN2 a la carpeta respectiva de la máquina, como se muestra a continuación en mi script de Shell:

#!/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

Actualmente, tengo 5 archivos en PARTICIÓN1 Y PARTICIÓN2, pero en general tendrá alrededor de 420 archivos, lo que significa que moverá los archivos uno por uno, lo que creo que puede ser bastante lento. ¿Hay alguna manera de acelerar el proceso?

Estoy ejecutando Ubuntu 12.04

Respuesta1

Paralelizar SCP es contraproducente, a menos que ambas partes se ejecuten en SSD. La parte más lenta de SCP está dentro de la red, en cuyo caso la paralelización no ayudará en absoluto, o los discos en ambos lados, lo que empeorará al paralelizar: el tiempo de búsqueda lo matará.

Usted dice que la máquina A está en SSD, por lo que la paralelización por máquina debería ser suficiente. La forma más sencilla de hacerlo es envolver el primer bucle for en un subshell y ponerlo en segundo plano.

( 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 ) &

Respuesta2

Podrías usar GNU Parallel para ayudarte a ejecutar múltiples tareas en paralelo.

Sin embargo, en su situación, parecería que está estableciendo una conexión segura separada para cada transferencia de archivos, lo que probablemente sea bastante ineficiente, especialmente si las otras máquinas no están en una red local.

El mejor enfoque sería utilizar una herramienta que realice específicamente la transferencia de archivos por lotes (por ejemplo, rsync, que también puede funcionar con ssh simple).

Si rsync no está disponible, como alternativa, puede usar zip, o incluso tary gzipo bzip2, y luego scplos archivos resultantes (luego conéctese con sshy descomprima).

Respuesta3

Ya tuve un problema con scp, dos máquinas en la misma red con conexión Gigabit que se transferían muy lentamente a través de scp.

Si NO necesita cifrado, seguramente le resultará un poco útil utilizar ftp o nfs.

Descubrí que el problema era que una de las máquinas tenía RAM lenta y la parte de cifrado ssh era muy exigente para esta máquina. Usar ftp o nfs resolvió mi problema, pasé de 15-20 MB/s a más de 100 MBps.

[EDITAR]

Acabo de encontrar esto que usa el excelente rsync en lugar de scp. No resuelve todo tu problema pero podría ayudar.

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

información relacionada