Como paralelizar o comando scp?

Como paralelizar o comando scp?

Eu preciso copiar os arquivos de machineBe machineCpara machineA. Estou executando meu script de shell abaixo do machineA. Eu configurei as chaves ssh corretamente.

Se os arquivos não estiverem em machineB, então deverão estar em machineC. Preciso mover todos os ARQUIVOS PARTITION1 E PARTITION2 para a respectiva pasta machineA, conforme mostrado abaixo em 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 terá cerca de 420 arquivos, o que significa que irá 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

Responder1

Paralelizar o SCP é contraproducente, a menos que ambos os lados sejam executados em SSDs. A parte mais lenta do SCP é murchar a rede, caso em que a paralelização não ajudará em nada, ou os discos de ambos os lados, o que você piorará com a paralelização: o tempo de busca vai te matar.

Você diz que a máquina A está no SSD, então paralelizar por máquina deve ser suficiente. A maneira mais simples de fazer isso é agrupar o primeiro forloop em um subshell e colocá-lo 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 ) &

Responder2

Você poderia usar o GNU Parallel para ajudá-lo a executar múltiplas tarefas em paralelo.

No entanto, na sua situação, parece que você está estabelecendo uma conexão segura separada para cada transferência de arquivos, 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 faça especificamente a transferência de arquivos em lote - por exemplo, rsync, que também pode funcionar em ssh simples.

Se o rsync não estiver disponível, como alternativa, você poderá usar zip, ou mesmo tare gzipou bzip2, e então scpos arquivos resultantes (em seguida, conecte-se com sshe faça a descompactação).

Responder3

Já tive problema com o scp, duas máquinas na mesma rede com conexão Gigabit que estavam transferindo muito lentamente pelo scp.

Se você NÃO precisa de criptografia, com certeza ajudará um pouco usar FTP ou NFS.

Descobri que o problema era que uma das máquinas tinha RAM lenta e a parte da criptografia ssh era muito exigente para esta máquina. Usar FTP ou NFS resolveu meu problema, passei de 15-20 MB/s para mais de 100 MBps.

[EDITAR]

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

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

informação relacionada