OK Eu tentei responder essa pergunta para dois computadores com "pipes muito grandes" (10Gbe) que estão "próximos" um do outro.
O problema que você encontra aqui é: a maioria das compressões irá afunilar na CPU, já que os canos são tão grandes.
desempenho para transferir arquivos de 10 GB (conexão de rede de 6 Gb [linode], dados não compressíveis):
$ time bbcp 10G root@$dest_ip:/dev/null
0m16.5s
iperf:
server: $ iperf3 -s -F /dev/null
client:
$ time iperf3 -c $dest_ip -F 10G -t 20 # -t needs to be greater than time to transfer complete file
0m13.44s
(30% cpu)
netcat (1.187 openbsd):
server: $ nc -l 1234 > /dev/null
client: $ time nc $dest_ip 1234 -q 0 < 10G
0m13.311s
(58% cpu)
scp:
$ time /usr/local/bin/scp 10G root@$dest_ip:/dev/null
1m31.616s
scp with hpn ssh patch (scp -- hpn patch on client only, so not a good test possibly):
1m32.707s
socat:
server:
$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:/dev/null,creat,trunc
client:
$ time socat -u FILE:10G TCP:$dest_ip:9876
0m15.989s
E duas caixas no 10 Gbe, versões ligeiramente mais antigas do netcat (CentOS 6.7), arquivo de 10 GB:
nc: 0m18.706s (100% cpu, v1.84, no -q option
iperf3: 0m10.013s (100% cpu, but can go up to at least 20Gbe with 100% cpu so not sure it matters)
socat: 0m10.293s (88% cpu, possibly maxed out)
Então, em uma instância, o netcat usava menos cpu, na outra socat, então YMMV.
Com o netcat, se ele não tiver uma opção "-N -q 0", ele poderá transferir arquivos truncados, tenha cuidado ... outras opções, como "-w 10", também podem resultar em arquivos truncados.
O que está acontecendo em quase todos esses casos é que a CPU está sendo maximizada, não a rede. scp
atinge o máximo de 230 MB / s, atrelando um núcleo a 100% de utilização.
O Iperf3 infelizmente cria arquivos corrompidos . Algumas versões do netcat parecem não transferir o arquivo inteiro, muito estranho. Especialmente versões mais antigas.
Diversos encantamentos de "gzip como um pipe para o netcat" ou "mbuffer" também pareciam maximizar a CPU com o gzip ou o mbuffer, portanto, não resultou em uma transferência mais rápida com esses tubos grandes. lz4 pode ajudar. Além disso, algumas das coisas sobre o gzip pipe que eu tentei resultaram em transferências corrompidas para arquivos muito grandes (> 4 GB), então tenha cuidado lá fora:)
Outra coisa que pode funcionar especialmente para maior latência (?) é ajustar as configurações do tcp. Aqui está um guia que menciona os valores sugeridos:
link e link (de outra resposta)
possivelmente configurações de IRQ: link
sugestões do linode, adicione ao /etc/sysctl.conf:
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_no_metrics_save = 1
net.core.default_qdisc = fq
Além disso, eles gostariam que você executasse:
/sbin/ifconfig eth0 txqueuelen 10000
vale a pena verificar novamente depois de fazer ajustes para garantir que as alterações também não causem danos.
Também vale a pena ajustar o tamanho da janela: link
Com a compressão de conexões lentas (er), pode ser útil. Se você tem canais grandes, a compactação muito rápida pode ajudar com dados prontamente compactáveis, ainda não tentei.
A resposta padrão para "sincronizar discos rígidos" é rsync os arquivos, que evita a transferência sempre que possível.