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.

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.


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.


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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.