Maneira rápida de copiar um arquivo grande em uma LAN

24

Estou com alguns problemas com o NFS e gostaria de tentar usar o TCP antigo.

Eu não tenho idéia por onde começar, no entanto.

Em termos de hardware, estou usando um cabo cruzado Ethernet para conectar dois netbooks à rede.

Para colocá-los em rede, digito

$ sudo ifconfig eth0 192.168.1.1 up && ping -c 10 -s 10 192.168.1.2 && sudo /etc/init.d/nfs-kernel-server start

no primeiro netbook e

$ sudo ifconfig eth0 192.168.1.2 up
$ ping -c 10 -s 10 192.168.1.1
$ mount /mnt/network1

no segundo

onde /mnt/network1é especificado em / etc / fstab como

192.168.1.1:/home /mnt/network1 nfs noauto,user,exec,soft,nfsvers=2 0 0

bem como em /etc/exports(usando a sintaxe desse arquivo), no primeiro netbook.

O acima funciona bem, mas os arquivos e diretórios são enormes. Os arquivos têm em média cerca de meio gigabyte por peça e os diretórios têm entre 15 e 50 gigabytes.

Estou usando rsyncpara transferi-los, e o comando (on 192.168.1.2) é

$ rsync -avxS /mnt/network1 ~/somedir

Não tenho certeza se há uma maneira de ajustar minhas configurações de NFS para lidar melhor com arquivos enormes, mas gostaria de ver se a execução de um rsyncdaemon sobre TCP antigo simples funciona melhor do que rsyncsobre NFS.

Então, para reiterar, como faço para configurar uma rede semelhante ao TCP?

ATUALIZAR:

Então, depois de algumas horas tentando me livrar do pântano da minha própria ignorância (ou, como eu gosto de pensar nisso, me puxar pelas minhas próprias botas), descobri alguns fatos úteis.

Mas, antes de tudo, o que me levou a essa trilha de coelhos, em vez de simplesmente aceitar a melhor resposta atual, foi esta: ncé um programa incrivelmente legal que resolutamente falha em trabalhar para mim. Eu tentei o netcat-openbsde netcat-traditionalpacotes sem qualquer sorte.

O erro que recebo na máquina receptora ( 192.168.1.2) é:

me@netbook:~$ nc -q 1 -l -p 32934 | tar xv
Can't grab 0.0.0.0:32934 with bind
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

route dá:

me@netbook:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         dir-615         0.0.0.0         UG    0      0        0 wlan0
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.0.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0

Mas, eis as boas notícias: ter os endereços IP estáticos definidos /etc/network/interfaces, o que comecei a fazer enquanto tentava nctrabalhar, corrigiu todos os meus problemas de NFS e reacendeu meu amor pelo NFS.

A configuração exata que eu usei (com 192.168.1.1para o primeiro netbook, é claro) foi:

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

Com essas configurações, os dois netbooks poderão fazer ping diretamente um após o outro após serem inicializados, mesmo sem um ifup.

Enfim, eu ainda gostaria de ver ncem ação, então espero que alguém me ajude a depurar esse processo.

ixtmixilix
fonte
Se os dois diretórios forem locais, é melhor usar apenas o antigo simples /bin/cpou não usar o NFS
Karlson
1
Executar o rsync em um arquivo acessado pelo NFS significa que todo o conteúdo do arquivo precisa ser copiado pela rede pelo menos uma vez. Você não precisa de um daemon para chamar um cliente / servidor rsync - basta executá-lo no ssh. (é teoricamente possível invocar a extremidade remota através de telnet / rsh - mas é tolo executar esse serviço na prática - o ssh não adiciona muita sobrecarga).
symcbean 17/09/12
O NFSv2 é bem antigo. Qual sistema operacional você está usando?
Nils
o último Debian e o último Ubuntu, respectivamente. eu tenho todos os comandos (incluindo nfsvers=2) a partir deste tutorial ( michaelminn.com/linux/home_network )
ixtmixilix
5
na verdade, o ssh adiciona uma grande quantidade de sobrecarga, a criptografia não é barata. Em velocidades normais da Internet, isso não importa, mas em uma LAN (ou conexão direta direta, neste caso), você pode perceber. Acima de gigabit, exceto nas máquinas mais rápidas (ou com instruções AES-NI, se o SSH as usar), tenho certeza de que será perceptível.
Derobert 17/09/12

Respostas:

43

A maneira rápida

A maneira mais rápida de transferir arquivos pela LAN provavelmente não é o rsync, a menos que haja poucas alterações. O rsync gasta um bom tempo fazendo somas de verificação, calculando diferenças etc. Se você sabe que vai transferir a maioria dos dados de qualquer maneira, faça algo assim (nota: há várias implementações de netcat; consulte o manual para as opções corretas. Em particular, o seu pode não querer o -p):

user@dest:/target$ nc -q 1 -l -p 1234 | tar xv

user@source:/source$ tar cv . | nc -q 1 dest-ip 1234

Isso usa o netcat ( nc) para enviar tar através de uma conexão TCP bruta na porta 1234. Não há criptografia, verificação de autenticidade etc., portanto é muito rápido. Se sua conexão cruzada estiver executando em gigabit ou menos, você vinculará a rede; se for mais, você vinculará o disco (a menos que tenha uma matriz de armazenamento ou disco rápido). Os vsinalizadores para o tar fazem com que ele imprima os nomes dos arquivos (modo detalhado). Com arquivos grandes, isso praticamente não sobrecarrega. Se você estivesse produzindo toneladas de arquivos pequenos, desativaria isso. Além disso, você pode inserir algo como pvno pipeline para obter um indicador de progresso:

user@dest:/target$ nc -q 1 -l -p 1234 | pv -pterb -s 100G | tar xv

É claro que você também pode inserir outras coisas, como gzip -1(e adicionar o zsinalizador no final de recebimento - o zsinalizador no final de envio usaria um nível de compressão maior que 1, a menos que você defina a variável de ambiente GZIP, é claro). Embora o gzip provavelmente seja mais lento, a menos que seus dados sejam realmente compactados.

Se você realmente precisa do rsync

Se você estiver realmente transferindo apenas uma pequena parte dos dados que foram alterados, o rsync poderá ser mais rápido. Você também pode querer olhar para a opção -W/ --whole-file, como em uma rede muito rápida (como uma conexão cruzada) que pode ser mais rápida.

A maneira mais fácil de executar o rsync é pelo ssh. Você precisará experimentar as cifras ssh para ver qual é a mais rápida; será AES, ChaCha20 ou Blowfish (embora existam algumas preocupações de segurança com o tamanho do bloco de 64 bits do Blowfish), dependendo se o seu chip possui o AES da Intel Instruções -NI (e seu OpenSSL as usa). Em um ssh novo o suficiente, o rsync-over-ssh se parece com o seguinte:

user@source:~$ rsync -e 'ssh -c [email protected]' -avP /source/ user@dest-ip:/target

Para ssh / sshd mais antigo, tente aes128-ctrou aes128-cbcno lugar de [email protected].

ChaCha20 seria [email protected](também precisa de um ssh / sshd novo o suficiente) e Blowfish seria blowfish-cbc. O OpenSSH não permite a execução sem uma cifra. Obviamente, você pode usar as opções de rsync que desejar no lugar de -avP. E é claro que você pode ir na outra direção e executar o rsync na máquina de destino (pull) em vez da máquina de origem (push).

Tornando o rsync mais rápido

Se você executar um daemon rsync, poderá se livrar da sobrecarga de criptografia. Primeiro, você criaria um arquivo de configuração daemon ( /etc/rsyncd.conf), por exemplo, na máquina de origem (leia a página de manual do rsyncd.conf para obter detalhes):

[big-archive]
    path = /source
    read only = yes
    uid = someuser
    gid = somegroup

Em seguida, na máquina de destino, você executaria:

user@dest:~$ rsync -avP source-ip::big-archive/ /target

Você também pode fazer o contrário (mas é claro que precisará definir somente leitura como não). Existem opções para autenticação, etc., consulte a página de manual para obter detalhes.

derobert
fonte
2
Esta é uma excelente resposta. O outro também é ótimo. Não existe uma resposta aceita apenas porque o solicitante não pode escolher entre eles?
Sudo #
Quão robusta é a netcatabordagem? Se a rede soltar pacotes, parece que ela perderá partes aleatórias dos arquivos.
Sudo
1
@sudo está usando TCP, que retransmitirá conforme necessário. Portanto, deve ser bom contra a perda de pacotes, corrupção aleatória (na medida em que as somas de verificação TCP e Ethernet detectam), etc. É claro que não é seguro contra ataques como tunelamento sobre ssh.
derobert
1
@sudo, você pode fazer tudo de uma vez, insira alguns teecomandos no pipe de ambos os lados para calcular as somas de verificação.
precisa saber é
1
@TheStoryCoder O ponto da tarpeça está dizendo para ele fazer o diretório atual. Na verdade, isso não faz parte do nccomando, o tar está sendo usado para criar um arquivo tar, que está sendo canalizado para o netcat (e, por outro lado, o netcat está sendo canalizado para o tar para extrair o arquivo). Eu sou o comentário de um medo não é realmente suficiente para explicar tubos, mas espero que isso é o suficiente para você começar ...
derobert
17

Quão? Ou TL; DR

O método mais rápido que encontrei é uma combinação de tar, mbuffere ssh.

Por exemplo:

tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"

Com isso, obtive transferências sustentadas de rede local acima de 950 Mb / s em links de 1Gb. Substitua os caminhos em cada comando tar para ser apropriado para o que você está transferindo.

Por quê? mbuffer!

O maior gargalo na transferência de arquivos grandes por uma rede é, de longe, a E / S do disco. A resposta para isso é mbufferou buffer. Eles são amplamente similares, mas mbuffertêm algumas vantagens. O tamanho padrão do buffer é 2 mbufferMB e 1 MB buffer. Buffers maiores provavelmente não ficarão vazios. Escolher um tamanho de bloco que seja o menor múltiplo comum do tamanho de bloco nativo no sistema de arquivos de destino e de destino dará o melhor desempenho.

O buffer é a coisa que faz toda a diferença! Use-o se tiver! Se você não tiver, pegue! Usar (m}?buffermais qualquer coisa é melhor do que qualquer coisa por si só. é quase literalmente uma panacéia para transferências lentas de arquivos de rede.

Se você estiver transferindo vários arquivos, use-os tarpara "agrupá-los" em um único fluxo de dados. Se for um único arquivo, você poderá usar cato redirecionamento de E / S. A sobrecarga de tarvs. caté estatisticamente insignificante, então eu sempre uso tar(ou zfs -sendonde posso), a menos que já seja um tarball . Não é garantido que nenhum desses fornece metadados (e, em particular cat, não). Se você quiser metadados, deixarei isso como um exercício para você.

Por fim, a utilização sshde um mecanismo de transporte é segura e carrega muito pouca sobrecarga. Novamente, a sobrecarga de sshvs. ncé estatisticamente insignificante.

bahamat
fonte
4
openssl speedem um i7-3770, fornece ~ 126–146 MB / s para a CBC blowfish e ~ 138–157 MB / s para a AES CBC (este chip possui instruções da AES-NI). Então ~ 200–300 MB / s para sha256. Portanto, ele mal consegue 1 gigabit. Com o OpenSSH 6.1+, você pode usar o AES GCM, o que pode ser feito com taxas ofuscantes (370–1320 MB / s, dependendo do tamanho da mensagem). Então eu acho que é verdade que o OpenSSH tem pouca sobrecarga se você estiver executando 6.1+ em um chip com AES-NI e usando AES-GCM.
derobert
1
Ugh, mudei isso para 6.1+ em vez de 6.2+ no último minuto, depois de verificar novamente rapidamente. Claro, isso foi um erro, é uma mudança desde 6.1. Portanto, o OpenSSH 6.2+ é a versão correta. E não vou mais editar o comentário agora. Comentários com mais de 5 minutos devem permanecer incorretos. Obviamente, se for menor que o OpenSSH 6.4, consulte openssh.com/txt/gcmrekey.adv como sem um patch, houve uma falha explorável na implementação do ASS-GCM do OpenSSH.
Derobert
A sobrecarga para ssh(ou rsync sobre ssh) é muito, MUITO importante. Eu tenho um NAS que usa uma CPU Intel Atom. A criptografia SSH ABSOLUTA A velocidade de transferência. Eu recebo consistentemente <400 Mbit / s para RSA, substituindo-o manualmente para RC4, obtendo ~ 600 Mbits / s e, se eu usar o rsync como um daemon, ele será executado na velocidade nativa do link (> 900 MBit / s, em um gigabit conexão).
Fake Name
Embora seja verdade que, para muitas situações, o transporte não seja crítico, é absolutamente importante considerá-lo, principalmente se você não estiver executando em hardware extremamente sofisticado. No meu caso, o Atom (é um D525, dual core de 1,8 Ghz) cria um NAS completamente bom, com muita velocidade para SMB, mas a criptografia o mata absolutamente.
Fake Name
2
Eu recebo um erro fatal devido à parametrização do mbuffer: 'mbuffer: fatal: a memória total deve ser maior que o tamanho do bloco \ n Terminado'. Para corrigir, eu suspeito que deve ler algo como 'mbuffer -s 1K -m 512M' com a final 'M' de pé para MByte (fonte: Homem mbuffer)
Peter Lustig
1

Você nem precisa usar o TCP. AoE é uma implementação de ATA via Ethernet, sendo a camada 2 uma abordagem de menor sobrecarga, sem conhecimento da pilha TCP / IP. Ele fornecerá a transferência mais rápida possível com o mínimo de sobrecarga. ***

https://en.wikipedia.org/wiki/ATA_over_Ethernet

*** Se a rede for um gargalo, verifique se você está enviando dados compactados.

William Deans
fonte
Uau, que é o núcleo duro! :) saber se há qualquer referência ...
rogerdpack