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.
linux
centos
scp
multi-threading
caesay
fonte
fonte
Respostas:
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
tar
comandos: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
ssh
comando (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,
rsync
será muito mais rápido se você estiver fazendo sincronizações incrementais.fonte
Use em
rsync
vez descp
. Você pode usar orsync
maisssh
facilmente possívelscp
e 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.
fonte
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.
fonte
pssh
operar simultaneamente com várias máquinas. Não acho que implemente paralelismo no nível de arquivo.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.
fonte
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.
fonte