Como paralelizar o comando scp?

3

Eu preciso scp os arquivos de machineB e machineC para machineA . Estou executando meu script de shell abaixo de machineA . Eu configurei as chaves ssh corretamente.

Se os arquivos não estiverem em machineB , eles deverão estar em machineC . Preciso mover todos os arquivos PARTITION1 e PARTITION2 para a pasta machineA respectiva, conforme mostrado abaixo no meu 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

Atualmente, estou tendo 5 arquivos em PARTITION1 E PARTITION2, mas em geral ele terá cerca de 420 arquivos, o que significa que ele moverá os arquivos um por um, o que acho que pode ser bem lento. Existe alguma maneira de acelerar o processo?

Estou executando o Ubuntu 12.04

    
por arsenal 24.12.2013 / 22:07

3 respostas

3

Paralelizar o SCP é contraproducente, a menos que ambos os lados funcionem em SSDs. A parte mais lenta da SCP é a rede, caso em que a paralelização não ajudará, ou discos de ambos os lados, o que você tornará pior ao paralelizar: o tempo de busca vai matar você.

Você diz que machineA está em SSD, portanto, o paralelismo por máquina deve ser suficiente. A maneira mais simples de fazer isso é envolver o primeiro forloop em um subshell e colocar em 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 ) &
    
por 24.12.2013 / 22:27
1

Você poderia usar o GNU Parallel para ajudá-lo a executar várias tarefas em paralelo.

No entanto, na sua situação, parece que você está estabelecendo uma conexão segura separada para cada transferência de arquivo, o que provavelmente é bastante ineficiente, especialmente se as outras máquinas não estiverem em uma rede local.

A melhor abordagem seria usar uma ferramenta que faz especificamente a transferência de arquivos em lote - por exemplo, rsync , que pode funcionar também em ssh simples.

Se o rsync não estiver disponível, como alternativa, você pode usar zip ou mesmo tar e gzip ou bzip2 e, em seguida, scp dos arquivamentos resultantes (em seguida, conecte com ssh , e fazer a descompactação).

    
por 25.12.2013 / 03:19
0

Eu já tive um problema com scp, duas máquinas na mesma rede com conexão Gigabit que estavam transferindo muito lentamente sobre scp.

Se você NÃO precisa de criptografia, com certeza ajudará um pouco a usar ftp ou nfs.

Descobri que o problema era que uma das máquinas tinha RAM lenta e a parte de criptografia ssh era muito exigente para essa máquina. Usando ftp ou nfs resolveu o meu problema, eu fui de 15-20 MB / s para 100+ MBps.

[EDITAR]

Acabei de encontrar isso que usa o excelente rsync em vez de scp. Não resolve todo o seu problema, mas pode ajudar.

link

    
por 16.01.2014 / 21:51