Estou tentando copiar um lote de arquivos, scp
mas é muito lento. Este é um exemplo com 10 arquivos:
$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png 100% 413KB 413.2KB/s 00:00
cap_20151023T113019_999990226.png 100% 413KB 412.6KB/s 00:00
cap_20151023T113020_649251955.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_284028464.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_927950468.png 100% 413KB 413.0KB/s 00:00
cap_20151023T113022_567641507.png 100% 413KB 413.1KB/s 00:00
cap_20151023T113023_203534753.png 100% 414KB 413.5KB/s 00:00
cap_20151023T113023_855350640.png 100% 412KB 411.7KB/s 00:00
cap_20151023T113024_496387641.png 100% 412KB 412.3KB/s 00:00
cap_20151023T113025_138012848.png 100% 414KB 413.8KB/s 00:00
cap_20151023T113025_778042791.png 100% 413KB 413.4KB/s 00:00
real 0m43.932s
user 0m0.074s
sys 0m0.030s
O estranho é que a taxa de transferência é de cerca de 413KB / s e o tamanho do arquivo é de cerca de 413KB; portanto, ele deve transferir um arquivo por segundo, no entanto, leva cerca de 4,3 segundos por arquivo.
Alguma idéia de onde vem essa sobrecarga e existe alguma maneira de torná-la mais rápida?
scp
time
batch-jobs
Laurent
fonte
fonte
Respostas:
O comentário de @ wurtel provavelmente está correto: há muitas despesas gerais estabelecendo cada conexão. Se você pode consertar que obterá transferências mais rápidas (e se não conseguir, basta usar a
rsync
solução alternativa do @ roaima ). Fiz um experimento transferindo arquivos de tamanho semelhante (head -c 417K /dev/urandom > foo.1
e fiz algumas cópias desse arquivo) para um host que demora um pouco para conectar (HOST4) e um que responde muito rapidamente (HOST1):fonte
Você pode usar
rsync
(sobressh
), que usa uma única conexão para transferir todos os arquivos de origem.Se você não tem
rsync
(e por que não !?) que você pode usartar
comssh
como esta, o que evita a criação de um arquivo temporário:A
rsync
deve ser preferida, todas as outras coisas sendo iguais, porque é restartable em caso de uma interrupção.fonte
scp
invocação não usaria uma única conexão para transferir todos os arquivos?f -
os lados, pois o tar gera / lê de stdout / stdin por padrão. Entãotar cz cap_* | ssh user@host tar xvzC dir
faria isso.tar
pode ser compilado com diferentes valores padrão (vejatar --show-defaults
se você está usando o GNU tar, ou/etc/default/tar
de outra forma, e em ambos os casos não se esqueça daTAPE
variável de ambiente)scp
criaria uma nova conexão para cada arquivo, mas, ao lembrar - e depois de checar novamentetshark
-, percebi que estava incorreto. Neste ponto, não sei mais por que os OPsscp
devem demorar tanto tempo por arquivo.É a negociação da transferência que leva tempo. Em geral, operações em n arquivos de b bytes levam muito, muito mais tempo do que uma única operação em um único arquivo de n * b bytes. Isso também é verdade, por exemplo, para E / S de disco.
Se você observar com atenção, verá que a taxa de transferência neste caso é size_of_the_file / s.
Para transferir arquivos com mais eficiência, junte-os
tar
e transfira o tarball:tar cvf myarchive.tar cap_20151023T*.png
ou, se você também deseja compactar o arquivo morto,
tar cvzf myarchive.tar.gz myfile*
A compressão ou não depende do conteúdo do arquivo, por exemplo. se forem JPEGs ou PNGs, a compactação não terá efeito.
fonte
-z
tar
faz normalmente uma segunda passagem para compressão ou se seria a compressão e arquivamento, ao mesmo tempo-z
CPU vinculado e muito mais lento. O gzip sempre tentará compactar, daí a desaceleração; afinal, você não pode dizer se uma sequência de bytes é compactável até ter tentado compactá-la. Na minha configuração, mesmo ao transferir arquivos de texto sem formatação, o rsync sem compactação é o mais rápido em um fator de 2 a 3 em comparação com a compactação mais leve. Claro, YMMV.Outro motivo pelo qual o scp é mais lento do que deveria ser, especialmente em redes de alta largura de banda, é que ele possui buffers de controle de fluxo interno definidos estaticamente, que acabam se tornando gargalos no desempenho da rede.
HPN-SSH é uma versão corrigida do OpenSSH que aumenta o tamanho desses buffers. Faz uma enorme diferença a velocidade de transferência do scp (veja os gráficos no site, mas também falo por experiência própria). Obviamente, para obter os benefícios, você precisa instalar o HPN-SSH em todos os seus hosts, mas vale a pena se você precisar transferir regularmente arquivos grandes.
fonte
Eu usei a técnica descrita aqui, que usa gzip e netcat paralelos para compactar e copiar dados rapidamente.
Tudo se resume a:
Isso usa o tar para reunir o arquivo ou arquivos. Em seguida, usa pigz para obter muitos threads de CPU para compactar e enviar o arquivo; a transmissão de rede está usando o netcat. No lado do recebimento, o netcat ouve e descompacta (em paralelo) e desarma.
fonte
nc
não está criptografado. Adicione um pouco dessh -D
magia, talvez?Só tive esse problema ao fazer uma transferência site a site de um grande arquivo mp4 via
scp
. Estava recebendo ~ 250KB / s. Depois de desativar a proteção contra inundação UDP (FP) no firewall de destino, a taxa de transferência aumentou para 6,5 MB / s. Ao reativar o FP, a taxa caiu para ~ 250 KB / s.Remetente: cygwin, Receptor: Fedora 20, Firewall Sophos UTM.
Para que o SSH usa o UDP? @ superuser.com - Não é diretamente do que eu leio.
Ao revisar o log do firewall, a detecção de inundação estava ocorrendo nas portas de origem e de destino 4500 nos endereços IP públicos, não nos endereços VPN internos de site a site privados. Portanto, parece que meu problema é provavelmente uma situação NAT Transversal em que os
scp
dados TCP são criptografados e encapsulados em pacotes ESP e UDP e, consequentemente, sujeitos a FP. Para removerscp
da equação, executei uma operação de cópia de arquivo do Windows na VPN e notei um desempenho semelhante aoscp
com e sem o FP ativado. Também executou umiperf
teste no TCP e notou 2Mbits / s com FP e 55Mbits / s sem.Como o NAT-T funciona com o IPSec? @ cisco.com
fonte