Executando vários threads scp simultaneamente

11

Executando vários threads scp simultaneamente:

Fundo:

Muitas vezes me vejo refletindo muito um conjunto de arquivos do servidor, e incluídos nesses arquivos do servidor estão milhares de pequenos arquivos de 1kb-3kb. Todos os servidores estão conectados às portas de 1 Gbps, geralmente espalhadas em uma variedade de data centers.

Problema:

O SCP transfere esses pequenos arquivos, UM a UM, e leva séculos, e sinto que estou desperdiçando os belos recursos de rede que tenho.

Solução?:

Eu tive uma ideia; Criar um script, que divide os arquivos em quantidades iguais, e inicia 5-6 threads de scp, que teoricamente seriam feitos 5-6 vezes mais rápido, não? Mas eu não tenho nenhuma experiência com scripts linux!

Questões):

  • Existe uma solução melhor para o problema mencionado?
  • Existe algo assim que já existe?
  • Se não, existe alguém que me dê um começo ou me ajude?
  • Se não fosse 2 ou 3, onde seria um bom lugar para começar a procurar aprender scripts de linux? Como bash, ou outro.
caesay
fonte

Respostas:

11

Eu faria assim:
tar -cf - /manyfiles | ssh dest.server 'tar -xf - -C /manyfiles'

Dependendo dos arquivos que você está transferindo, pode fazer sentido ativar a compactação nos tarcomandos:
tar -czf - /manyfiles | ssh dest.server 'tar -xzf - -C /manyfiles'

Também pode fazer sentido que você escolha uma cifra mais amigável da CPU para o sshcomando (como arcfour): tar -cf - /manyfiles | ssh -c arcfour dest.server 'tar -xf - -C /manyfiles'

Ou combine os dois, mas isso realmente depende do seu gargalo.
Obviamente, rsyncserá muito mais rápido se você estiver fazendo sincronizações incrementais.

falsificador
fonte
10

Use em rsyncvez de scp. Você pode usar o rsyncmais sshfacilmente possível scpe ele suporta "pipelining de transferências de arquivos para minimizar os custos de latência".

Uma dica: se os dados forem compactáveis, ative a compactação. Caso contrário, desative-o.

David Schwartz
fonte
Eu fiz uma transferência ontem à noite com o scp e estou fazendo outra transferência semelhante com o rsync - parece muito mais rápido. No entanto, ainda parece estar transferindo um arquivo de cada vez - qualquer idéia de como fazer isso fazer vários threads (além de - incluir e excluir um conjunto de diretórios por script; veja: sun3.org/archives / 280 )
aendrew
Não faz sentido transferir vários arquivos ao mesmo tempo, dada a largura de banda limitada. Acredito que você não considerará esse comando quando a largura de banda for abundante. A eliminação do custo de latência já ajudou bastante quando você está lidando com muitos arquivos pequenos. Mesmo se você puder copiar vários arquivos ao mesmo tempo, a largura de banda limitada não acelerará sua transferência de arquivos.
Joe
1

Eu estava prestes a sugerir o GNO Parallel (que ainda requer algum trabalho de script da sua parte), mas então encontrei o pscp (que faz parte do pssh ). Isso pode atender à sua necessidade.

Rilindo
fonte
1
Parece psshoperar simultaneamente com várias máquinas. Não acho que implemente paralelismo no nível de arquivo.
David Schwartz
Eu provavelmente deveria ser específico - eu quis dizer pscp.
Rilindo
1

Não é o scp diretamente, mas uma opção para transferência encadeada mutli (mesmo em arquivos únicos) é bbcp - https://www2.cisl.ucar.edu/resources/storage-and-file-systems/bbcp .

use a opção -s para o número de threads que você deseja transferir dados. Ótimo para conexões de alta largura de banda, mas atrasadas, pois o atraso limita o tamanho da janela TCP por thread.

thetoolman
fonte
0

Possivelmente não relacionado, mas se você quiser algo mais em tempo real, tente o GlusterFS . Funciona bem, mas requer alguns ajustes, se você quiser ler com eficiência arquivos pequenos.

Kyle
fonte