Qual é a maneira mais rápida de enviar grandes quantidades de dados entre dois computadores? [fechadas]


111

Esta é uma situação em que estou frequentemente:

  • Eu tenho um servidor de origem com um disco rígido de 320 GB e 16 GB de RAM ( especificações exatas disponíveis aqui , mas como esse é um problema que eu encontro frequentemente em outras máquinas também, prefiro a resposta para trabalhar em qualquer máquina Linux "razoável")
  • Eu tenho um servidor de backup com vários terabytes de espaço no disco rígido ( especificações exatas aqui , consulte o aviso acima)

Desejo transferir 320 GB de dados do servidor de origem para o servidor de destino (especificamente, os dados de /dev/sda).

  1. Os dois computadores estão fisicamente próximos um do outro, para que eu possa passar os cabos entre eles.
  2. Estou em uma LAN e estou usando um roteador novo , o que significa que a velocidade da minha rede deve "idealmente" ser de 1000Mbit, certo?
  3. Segurança não é um problema. Estou em uma rede local e confio em todas as máquinas da rede, incluindo o roteador.
  4. (opcional) Não preciso necessariamente de uma soma de verificação assinada dos dados, mas a verificação básica de erros (como pacotes descartados ou a unidade se tornar ilegível) deve ser detectada em vez de simplesmente desaparecer na saída.

Eu procurei esta pergunta online e testei vários comandos. O que aparece com mais frequência é o seguinte:

ssh user@192.168.1.100 'dd bs=16M if=/dev/sda | gzip' > backup_sda.gz

Este comando se mostrou muito lento (ele foi executado por uma hora, só obteve cerca de 80 GB pelos dados). Demorou cerca de 1 minuto e 22 segundos para o pacote de teste de 1 GB e acabou sendo duas vezes mais rápido quando não compactado. Os resultados também podem ter sido distorcidos pelo fato de o arquivo transferido ser menor que a quantidade de RAM no sistema de origem.

Além disso (e isso foi testado em peças de teste de 1 GB), estou tendo problemas se usar o gzipcomando e dd; o arquivo resultante possui uma soma de verificação diferente quando extraída no destino, do que se for canalizada diretamente. Ainda estou tentando descobrir por que isso está acontecendo.


54
Não esqueça o sneakernet
gwillie

4
Deseja transferir /dev/sdacomo uma imagem ou apenas os arquivos. Por que o rsync não é uma opção? Está /dev/sdamontado enquanto você dded?
Jodka Lemon

15
Seus dados de desempenho (1 GB / 80 s, 80 GB / 1 h) correspondem perfeitamente ao que devemos esperar em 100 MBit. Verifique seu hardware. ... e o gerrit está certo, 320 GB podem ser grandes, mas "uma enorme quantidade de dados" gera expectativas erradas.
blafasel 7/09/15

8
"Nunca subestime a largura de banda de um trem de carga cheio de discos." .. Você está perguntando sobre taxa de transferência, latência ou alguma mistura dos dois?
keshlam

8
Um amigo meu sempre dizia: "Nunca subestime a largura de banda de uma pilha de discos rígidos em um caminhão".
AMADANON Inc.

Respostas:


139

Como os servidores estão fisicamente próximos um do outro e você mencionou nos comentários que tem acesso físico a eles, a maneira mais rápida seria retirar o disco rígido do primeiro computador, colocá-lo no segundo e transferir os arquivos pela conexão SATA.


15
+1: A transferência via física parece ser a rota mais rápida, mesmo que isso signifique obter um grande disco rígido externo de algum lugar. É cerca de £ 40, e você provavelmente já passou muito no tempo já,
deworde

3
Eu discordo completamente dessa idéia se alguém estiver obtendo velocidade máxima em uma rede de gigabit. Testar em NFS / SMB em um switch Zyxel Gigabit entre um microsservidor HP Gen 7 e uma máquina Pentium G630 me fornece uma transferência de ~ 100 MB / s. (Até eu deixar a borda externa dos pratos da unidade.) Então acho que isso seria feito em menos de 3 horas. A menos que você esteja usando SSDs ou unidades / armazenamento de desempenho extremamente alto, não acho que duas cópias possam produzir uma taxa de transferência de 100 MB / s, o que exigiria que cada operação de cópia tivesse 200 MB / s apenas para se equilibrar.
Phizes

3
@ Pizes: obviamente você não copia para um arquivo temporário. Essa foi a má idéia de deword, não o que todo mundo está falando. O ponto de conectar a unidade de origem à máquina de destino é usar SATA-> SATA dd(ou uma cópia da árvore do sistema de arquivos).
Peter Cordes

10
"Nunca subestime a largura de banda de um caminhão cheio de discos rígidos. Porém, uma latência infernal"
Kevin

3
@ Kevin: sim, meu argumento era que uma cópia direta entre discos no mesmo computador é pelo menos tão rápida quanto qualquer outro método possível. Criei números de largura de banda da vida real para reconhecer o argumento de Phize de que analisar o gigE é bom para a unidade antiga do OP, mas um gargalo para novas unidades. (Um caso em que ambas as unidades em um computador é não a melhor opção é quando ter computadores separados usando sua memória RAM para armazenar em cache os metadados da fonte e destino é importante, por exemplo, para rsync de bilhões de arquivos.)
Peter Cordes

69

netcat é ótimo para situações como essa em que a segurança não é um problema:

# on destination machine, create listener on port 9999
nc -l 9999 > /path/to/outfile

# on source machine, send to destination:9999
nc destination_host_or_ip 9999 < /dev/sda
# or dd if=/dev/sda | nc destination_host_or_ip 9999

Note que, se você estiver usando o ddGNU coreutils, poderá enviar SIGUSR1para o processo e ele emitirá progresso para o stderr. Para BSD dd, use SIGINFO.

pv é ainda mais útil ao relatar o progresso durante a cópia:

# on destination
nc -l 9999 | pv > /path/to/outfile

# on source
pv /dev/sda | nc destination_host_or_ip 9999
# or dd if=/dev/sda | pv | nc destination_host_or_ip 9999

2
Para o segundo exemplo, é ddmesmo necessário, ou pode pv/ nctratar /dev/sdamuito bem por conta própria? (Tenho notado alguns comandos "vomitar" ao tentar ler arquivos especiais como aquele, ou arquivos com 0x00bytes)
IQAndreas

5
@ user1794469 A compactação ajudará? Estou pensando que a rede não está onde está o gargalo.
IQAndreas

17
Não se esqueça que no bashse pode usar > /dev/tcp/IP /de porta e < /dev/tcp/IP /porta redirecionamentos em vez de tubulação de e para netcat respectivamente.
Incnis MRSI

5
Boa resposta. A Ethernet Gigabit geralmente é mais rápida que a velocidade do disco rígido, portanto a compactação é inútil. Para transferir vários arquivos, considere tar cv sourcedir | pv | nc dest_host_or_ip 9999e cd destdir ; nc -l 9999 | pv | tar xv. Muitas variações são possíveis; você pode, por exemplo, manter um .tar.gzlado do destino em vez de cópias. Se você copiar diretório para diretório, para segurança extra, você poderá executar um rsync posteriormente, por exemplo, a partir do dest rsync --inplace -avP user@192.168.1.100:/path/to/source/. /path/to/destination/., garantirá que todos os arquivos sejam cópias exatas.
Stéphane Gourichon

3
Em vez de usar o IPv4, você pode obter uma melhor taxa de transferência usando o IPv6, pois possui uma carga útil maior. Você não precisa nem configurá-lo, se as máquinas são capazes IPv6 eles provavelmente já tem um IPv6 link-local endereço
David Costa

33
  1. Não usar rápido compressão.

    • Qualquer que seja o seu meio de transferência - especialmente para rede ou usb - você estará trabalhando com rajadas de dados para leituras, caches e gravações, e elas não estarão exatamente sincronizadas.
    • Além do firmware do disco, caches de disco e caches de kernel / ram, se você também pode empregar as CPUs do sistema de alguma forma para concentrar a quantidade de dados trocados por burst , faça isso .
    • Qualquer algoritmo de compactação manipulará automaticamente execuções esparsas de entrada o mais rápido possível, mas há muito poucos que manipularão o restante nas taxas de transferência de rede.
    • lz4 é sua melhor opção aqui:

      O LZ4 é um algoritmo de compactação sem perdas muito rápido, que fornece velocidade de compactação a 400 MB / s por núcleo, escalável com CPU de vários núcleos. Ele também possui um decodificador extremamente rápido, com velocidade em vários GB / s por núcleo, normalmente atingindo os limites de velocidade da RAM em sistemas com vários núcleos.

  2. De preferência, não procure desnecessariamente.

    • Isso pode ser difícil de avaliar.
    • Se houver muito espaço livre no dispositivo do qual você copia e o dispositivo não foi zerado recentemente, mas todos os sistemas de arquivos de origem devem ser copiados, provavelmente vale a pena fazer o primeiro algo como:

      </dev/zero tee >empty empty1 empty2; sync; rm empty*
    • Mas isso depende de qual nível você deve ler a fonte. Geralmente, é desejável ler o dispositivo do início ao fim do /dev/some_diskarquivo do dispositivo, porque a leitura no nível do sistema de arquivos geralmente envolve a busca e o retorno do disco de forma não sequencial. E assim seu comando de leitura deve ser algo como:

      </dev/source_device lz4 | ...
    • No entanto, se o sistema de arquivos de origem não deve ser transferido inteiro, a leitura no nível do sistema de arquivos é inevitável e, portanto, você deve agrupar seu conteúdo de entrada em um fluxo. paxgeralmente é a melhor e mais simples solução nesse caso, mas você também pode considerar mksquashfs.

      pax -r /source/tree[12] | lz4 | ...
      mksquashfs /source/tree[12] /dev/fd/1 -comp lz4 | ...
      
  3. Você não criptografar com ssh.

    • A adição de sobrecarga de criptografia a uma mídia confiável é desnecessária e pode prejudicar seriamente a velocidade das transferências sustentadas , pois a leitura dos dados precisa ser lida duas vezes .
    • O PRNG precisa dos dados lidos, ou pelo menos alguns deles, para sustentar a aleatoriedade.
    • E é claro que você também precisa transferir os dados.
    • Você também precisa transferir a sobrecarga de criptografia em si - o que significa mais trabalho por menos dados transferidos por burst .
    • Então, você deve usar netcat( ou, como preferir, o nmapprojeto é mais capazncat ) para uma cópia de rede simples, como já foi sugerido em outros lugares:

      ###  on tgt machine...
      nc -l 9999 > out.lz4
      ###  then on src machine...
      ... lz4 | nc tgt.local 9999
      

1
Resposta fantástica. Um pequeno ponto gramatical - "diminua a quantidade de dados que precisam ser trocados por rajada" - acho que você está usando a compactação para aumentar a densidade de informações, pois as 'explosões' têm largura fixa e, portanto, a quantidade de dados trocados permanece constante embora as informações transferidas por rajada possam variar.
Engineer Dollery

@ EngineerDollery - sim, isso foi idiota. Eu acho que é melhor,
mikeserv

@IQAndreas - eu consideraria seriamente esta resposta. Pessoalmente, uso pigz, e o aumento de velocidade é incrível . O paralelismo é uma grande vitória; As CPUs são muito mais rápidas do que qualquer outra parte do pipeline de dados, por isso duvido que a compactação paralela o atrapalhe (o gzip não é paralelizável). Você pode achar isso rápido o suficiente para não haver incentivo para manipular discos rígidos; Eu não ficaria surpreso se este for mais rápido (incluindo o tempo de troca do disco). Você pode comparar com e sem compactação. De qualquer forma, a resposta do diskswap do BlueRaja ou essa deve ser sua resposta aceita.
Mike S

A compactação rápida é um excelente conselho. Deve-se notar, no entanto, que ajuda apenas se os dados forem razoavelmente compactáveis, o que significa, por exemplo, que eles ainda não devem estar em um formato compactado.
Walter Tross

@WalterTross - ajudará se qualquer entrada for compressível, independentemente da proporção, desde que o trabalho de compactação supere o trabalho de transferência. Em um sistema moderno de quatro núcleos, um lz4trabalho deve facilmente acompanhar o GIGe bem aberto, e o USB 2.0 não tem chance. Além disso, lz4foi projetado apenas para funcionar quando deveria - é parcialmente tão rápido porque sabe quando a compactação deve ser tentada e quando não deveria. E se for um arquivo de dispositivo sendo transferido, mesmo as entradas pré-compactadas poderão ser compactadas de alguma maneira, se houver alguma fragmentação no sistema de arquivos de origem.
mikeserv

25

Existem várias limitações que podem estar limitando a velocidade de transferência.

  1. Há sobrecarga de rede inerente em um canal de 1 Gbps. Normalmente, isso reduz a taxa de transferência REAL para 900 Mbps ou menos. Então, lembre-se de que esse é um tráfego bidirecional e você deve esperar significativamente menos que 900 Mbps.

  2. Mesmo usando um "novo roteador ish", você tem certeza de que o roteador suporta 1Gbps? Nem todos os novos roteadores suportam 1Gbps. Além disso, a menos que seja um roteador de nível empresarial, você provavelmente perderá largura de banda de transmissão adicional, pois o roteador será ineficiente. Embora com base no que encontrei abaixo, parece que você está ficando acima de 100Mbps.

  3. Pode haver congestionamento na rede de outros dispositivos que compartilham sua rede. Você já tentou usar um cabo diretamente conectado, como disse que podia fazer?

  4. Qual a quantidade de IO do seu disco que você está usando? Provavelmente, você está sendo limitado, não pela rede, mas pela unidade de disco. A maioria dos HDDs de 7200 rpm alcança apenas cerca de 40 MB / s. Você está usando invasão? Você está usando SSDs? O que você está usando no terminal remoto?

Sugiro usar o rsync se for esperado que seja executado novamente para backups. Você também pode scp, ftp (s) ou http usando um downloader como o filezilla na outra extremidade, pois ele paraleliza as conexões ssh / http / https / ftp. Isso pode aumentar a largura de banda, pois as outras soluções passam por um único pipe. Um único pipe / thread ainda é limitado pelo fato de ser de thread único, o que significa que pode até ser vinculado à CPU.

Com o rsync, você tira grande parte da complexidade da sua solução, além de permitir compactação, preservação de permissão e permitir transferências parciais. Existem vários outros motivos, mas geralmente é o método de backup preferido (ou executa os sistemas de backup) de grandes empresas. O Commvault, na verdade, usa o rsync sob o software como mecanismo de entrega de backups.

Com base no seu exemplo de 80 GB / h, você terá 177 Mbps (22,2 MB / s). Eu sinto que você poderia facilmente dobrar isso com o rsync em uma linha Ethernet dedicada entre as duas caixas, já que eu consegui isso nos meus próprios testes com o rsync sobre gigabit.


12
+1 para rsync. Pode não ser mais rápido na primeira vez em que você o executa, mas certamente será para todos os momentos subsequentes.
Skrrp

4
> A maioria dos HDDs de 7200 rpm alcança apenas cerca de 40 MB / s. No IME, é mais provável que você veja mais de 100 MB / s sequenciais com uma unidade moderna (e isso inclui ~ 5k unidades). No entanto, este pode ser um disco mais antigo.
Bob

2
@ Bob: Os modernos ainda conseguem ler apenas 5400 faixas circulares por minuto. Esses discos ainda são rápidos porque cada faixa contém mais de um megabyte. Isso significa que eles também são discos muito grandes. Um pequeno disco de 320 GB não pode conter muitos kilobytes por faixa, o que necessariamente limita sua velocidade.
MSalters

1
Definitivamente, 40 MB / s é muito pessimista para leitura seqüencial de qualquer unidade feita na última década. As unidades atuais de 7200 RPM podem exceder 100 MB / s, como Bob diz.
hobbs 10/09

3
A Ethernet Gigabit é full duplex de 1000 mbps . Você ganha 1000mbps (ou, na realidade, cerca de 900mbps) em cada direção . Segundo ... os discos rígidos agora recebem rotineiramente 100 MB / s. 40 MB / s é lento, a menos que seja uma unidade de uma década.
Derobert 10/09

16

Lidamos com isso regularmente.

Os dois métodos principais que costumamos usar são:

  1. SATA / eSATA / sneakernet
  2. Montagem direta do NFS, depois local cpoursync

O primeiro depende se a unidade pode ser realocada fisicamente. Isso não é sempre o caso.

O segundo funciona surpreendentemente bem. Geralmente, atingimos no máximo uma conexão de 1GB / s com facilidade com montagens NFS diretas. Você não chegará nem perto disso com scp, dd over ssh ou qualquer coisa semelhante (geralmente você obtém uma taxa máxima suspeita de quase 100mpbs). Mesmo em processadores multicore muito rápidos, você encontrará um gargalo na taxa de transferência máxima de criptografia de um dos núcleos na mais lenta das duas máquinas, o que é deprimente em comparação com o cp ou rsync de furo máximo em uma montagem de rede não criptografada. Ocasionalmente, você atinge a parede do IOP por um tempo e fica preso a cerca de ~ 53 MB / s em vez dos ~ 110 MB / s mais comuns, mas isso geralmente dura pouco, a menos que a origem ou o destino seja realmenteuma única unidade, você pode acabar sendo limitado pela taxa sustentada da própria unidade (que varia o suficiente por razões aleatórias que você não saberá até tentar) - meh.

O NFS pode ser um pouco chato de configurar, se for uma distro desconhecida, mas de um modo geral, tem sido a maneira mais rápida de encher os canos da maneira mais completa possível. A última vez que fiz isso acima de 10 gbps, nunca descobri se a conexão estava no máximo, porque a transferência havia terminado antes de eu voltar a tomar um café - então pode haver algum limite natural que você atinja lá. Se você tiver alguns dispositivos de rede entre a origem e o destino, poderá encontrar alguns atrasos ou soluços do efeito furtivo da rede, mas geralmente isso funcionará em todo o escritório (sem outro tráfego disfarçado) ou em uma extremidade do datacenter para o outro (a menos que você tenha algum tipo de filtragem / inspeção ocorrendo internamente, caso em que todas as apostas estão desativadas ).

EDITAR

Notei algumas conversas sobre compressão ... não comprima a conexão. Isso diminuirá a velocidade da mesma maneira que uma camada de criptografia. O gargalo sempre será um núcleo único se você compactar a conexão (e você nem obterá uma utilização particularmente boa do barramento desse núcleo). A coisa mais lenta que você pode fazer na sua situação é usar um canal compactado e criptografado entre dois computadores sentados um ao lado do outro em uma conexão de 1 gbps ou superior.

FUTURA PROVA

Este conselho é válido desde meados de 2015. Isso quase certamente não será o caso por muitos outros anos. Portanto, leve tudo com um pouco de sal e, se você enfrentar essa tarefa regularmente, tente vários métodos com cargas reais, em vez de imaginar que obterá algo próximo dos ótimos teóricos ou mesmo taxas de taxa de transferência de compressão / criptografia observadas típicas para coisas como a Web tráfego, grande parte do qual é textual (protip: transferências em massa geralmente consistem principalmente em imagens, áudio, vídeo, arquivos de banco de dados, código binário, formatos de arquivo de escritório etc.) que estão compactadosà sua maneira e beneficiam-se muito pouco de serem executados em outra rotina de compactação, cujo tamanho do bloco de compactação quase garante não se alinhar com os dados binários já compactados ...).

Imagino que, no futuro, conceitos como SCTP sejam levados para um local mais interessante, onde as conexões ligadas (ou as conexões de fibra canalizada internamente por espectro) são típicas, e cada canal pode receber um fluxo independente dos outros, e cada o fluxo pode ser compactado / criptografado em paralelo, etc. etc. Isso seria maravilhoso! Mas esse não é o caso hoje em 2015, e embora fantasiar e teorizar seja bom, a maioria de nós não possui clusters de armazenamento personalizados executando em uma câmara de criogenia, alimentando dados diretamente nas entranhas de um Blue Gene / Q gerando respostas para Watson. Isso simplesmente não é realidade. Também não temos tempo para analisar exaustivamente nossa carga útil de dados para descobrir se a compactação é uma boa ideia ou não - a transferência em si terminaria antes de terminarmos nossa análise,

Mas...

Os tempos mudam e minha recomendação contra compactação e criptografia não será válida. Eu realmente adoraria que esse conselho fosse revogado no caso típico muito em breve. Isso tornaria minha vida mais fácil.


1
@jofel Somente quando a velocidade da rede é mais lenta que a taxa de transferência de compressão do processador - o que nunca é verdade para conexões de 1gpbs ou mais. No caso típico, porém, a rede é o gargalo e a compactação acelera efetivamente as coisas - mas esse não é o caso descrito pelo OP.
Zxq9 08/09/2015

2
lz4é rápido o suficiente para não causar gargalo, mas dependendo do que você deseja fazer com a cópia, pode ser necessário descompactá-la. O lzop também é muito rápido. No meu i5-2500k Sandybridge (3.8GHz), lz4 < /dev/raid0 | pv -a > /dev/nullchega a ~ 180MB / s de entrada, ~ 105MB / s de saída, ideal para gigE. Descomprimir no lado de recebimento é ainda mais fácil na CPU.
Peter Cordes

1
Além disso, 3,8 GHz é um pouco mais rápido do que a maioria dos processadores de servidor roda (ou muitos sistemas de nível empresarial de qualquer sabor, pelo menos que estou acostumado a ver). É mais comum ver contagens principais muito mais altas com velocidades de clock muito mais baixas nos data centers. A paralelização das cargas de transferência não é um problema há muito tempo, por isso estamos presos à velocidade máxima de um único núcleo na maioria dos casos - mas espero que isso mude agora que as velocidades do relógio geralmente são atingidas no máximo, mas as velocidades da rede ainda têm uma longo caminho a percorrer antes de atingir seus máximos.
Zxq9 10/09/2015

2
Discordo completamente de seus comentários sobre compactação. Depende completamente da compressibilidade dos dados. Se você pudesse obter uma taxa de compactação de 99,9%, seria tolice não fazê-lo - por que transferir 100 GB quando você pode se safar da transferência de 100 MB? Não estou sugerindo que esse nível de compactação seja o caso desta questão, apenas mostrando que isso deve ser considerado caso a caso e que não há regras absolutas.
Engineer Dollery

1
@ EngineerDollery Isso não ocorre na transferência em massa no mundo real. Faço isso quase todos os dias e testei uma variedade de métodos e configurações. No caso geral grandes transferências em massa de dados desconhecidos (qualquer coisa que você não tem tempo para executar testes de ajuste de compressão on - o que significa, na prática, quase tudo em qualquer centro de dados, infra-estrutura corporativa, servidor de pequena empresa ou rede doméstica) são muito mais rápido em uma conexão de 1 gbps ou superior. Vá tentar. Normalmente, o texto é o melhor caso para compactação. O texto compreende uma pequena fração de uma carga útil típica de transferência em massa.
Zxq9 10/09/2015

6

Uma ferramenta bacana que eu usei no passado é bbcp. Como visto aqui: https://www.slac.stanford.edu/~abh/bbcp/ .

Veja também http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm

Eu tive velocidades de transferência muito rápidas com esta ferramenta.


1
O segundo link desta resposta explica como ajustar os parâmetros do kernel para atingir velocidades mais altas. O autor conseguiu 800 megabytes por segundo em links de 10G e algumas coisas parecem aplicáveis ​​aos links de 1Gbps.
Stéphane Gourichon

5

Se você conseguir um primeiro passe de alguma forma (por telefone / sneakernet / qualquer que seja), poderá analisar rsyncalgumas opções que podem acelerar bastante as transferências subseqüentes. Uma maneira muito boa de ir seria:

rsync -varzP sourceFiles destination

As opções são: detalhado, modo de arquivamento, recursivo, compactar, progresso parcial


2
O Rsync é mais confiável que o netcat, mas o arquivo implica recursivo; portanto, o r é redundante.
Tanath

Além disso, -zpode ser incrivelmente lento, dependendo da sua CPU e de quais dados você está processando. Eu experimentei transferências de 30 MB / s para 125 MB / s ao desativar a compactação.
Lindhe

4

Adicionado à insistência do pôster original nos comentários à resposta de zackse, embora não tenha certeza de que seja o mais rápido em circunstâncias típicas.

bashtem uma sintaxe especial redireccionamento:
Para saída:      > /dev/tcp/IP /porta
Para entrada:       < /dev/tcp/IP /porta
IP proibição ser ou IP pontos decimais ou um nome de host; proibição de porta seja um número decimal ou um nome de porta /etc/services.

Não existe um /dev/tcp/diretório real . É um kludge sintático especial que comanda basha criação de um soquete TCP, conecta-o ao destino especificado e, em seguida, faz o mesmo que um redirecionamento de arquivo usual (substitua o respectivo fluxo padrão pelo soquete usando dup2 (2)).

Portanto, pode-se transmitir dados de ddou tarna máquina de origem diretamente via TCP. Ou, inversamente, para transmitir dados para taralgo semelhante diretamente via TCP. De qualquer forma, um netcat supérfluo é eliminado.

Notas sobre o netcat

uma inconsistência na sintaxe entre o netcat clássico e o GNU netcat . Vou usar a sintaxe clássica com a qual estou acostumado. Substitua -lppor -lpara GNU netcat.

Além disso, não tenho certeza se o GNU netcat aceita -qswitch.

Transferindo uma imagem de disco

(Seguindo as linhas da resposta de zackse.)
No destino:

nc -lp 9999 >disk_image

Na fonte:

dd if=/dev/sda >/dev/tcp/destination/9999
 

Criando um arquivo tar.gz, com tar

No destino:

nc -lp 9999 >backup.tgz

Na fonte:

tar cz files or directories to be transferred >/dev/tcp/destination/9999

Substitua .tgzpor .tbze czcom cjpara obter um bzip2arquivo compactado.

Transferindo com expansão imediata para o sistema de arquivos

Também com tar.
No destino:

cd backups
tar x </dev/tcp/destination/9999

Na fonte:

tar c files or directories to be transferred |nc -q 1 -lp 9999

Ele funcionará sem -q 1, mas o netcat ficará bloqueado quando os dados terminarem. Veja tar (1) para explicação da sintaxe e das advertências de tar. Se houver muitos arquivos com alta redundância (baixa entropia), seguida de compressão (e. G. czE xz, em vez de ce x) pode ser tentado, mas se os arquivos são típicos e da rede é rápido o suficiente, seria apenas retardar o processo. Veja a resposta do mikeserv para obter detalhes sobre compactação.

Estilo alternativo (o destino escuta a porta)

No destino:

cd backups
nc -lp 9999 |tar x

Na fonte:

tar c files or directories to be transferred >/dev/tcp/destination/9999

aparentemente, o bash não pode "escutar" em um soquete, a fim de aguardar e receber um arquivo: unix.stackexchange.com/questions/49936/…, então você teria que usar outra coisa para pelo menos metade da conexão ...
rogerdpack


2

Eu usaria esse script que escrevi que precisa do socatpacote.

Na máquina de origem:

tarnet -d wherefilesaretosend pass=none 12345 .

Na máquina de destino:

tarnet -d wherefilesaretogo pass=none sourceip/12345

Se o vbufpacote (Debian, Ubuntu) estiver lá, o remetente do arquivo mostrará o progresso dos dados. O receptor do arquivo mostrará quais arquivos foram recebidos. A opção pass = pode ser usada onde os dados podem ser expostos (mais lentamente).

Editar:

Use a -nopção para desativar a compactação, se a CPU for um gargalo.


2

Se o orçamento não for a principal preocupação, tente conectar as unidades com um "conector de unidade" de núcleo Intel Xeon E5 12. Esse conector geralmente é tão poderoso que você pode até executar o software de servidor atual nele. Dos dois servidores!

Isso pode parecer uma resposta divertida, mas você deve realmente considerar por que está movendo os dados entre servidores e se um grande problema com memória e armazenamento compartilhado pode fazer mais sentido.

Não tem certeza sobre as especificações atuais, mas a transferência lenta pode ser limitada pelas velocidades do disco, não pela rede?


1

Se você se importa apenas com backups, e não com um byte para cópia de bytes do disco rígido, eu recomendaria o backupPC. http://backuppc.sourceforge.net/faq/BackupPC.html É um pouco trabalhoso configurar, mas é transferido muito rapidamente.

Meu tempo de transferência inicial para cerca de 500 G de dados foi de cerca de 3 horas. Os backups subsequentes acontecem em cerca de 20 segundos.

Se você não está interessado em backups, mas está tentando sincronizar as coisas, o rsync ou o unison atenderia melhor às suas necessidades.

Um byte para cópia de byte de um disco rígido geralmente é uma péssima idéia para fins de backup (sem incrementos, sem economia de espaço, a unidade não pode estar em uso, é necessário fazer backup do "espaço vazio" e fazer backup do lixo (como um arquivo de swap de 16 G ou 200 G de core dumps ou algo assim). Usando o rsync (ou backuppc ou outros), você pode criar "snapshots" a tempo para poder ir para "como era o seu sistema de arquivos há 30 minutos" com muito pouco em cima.

Dito isto, se você realmente deseja transferir um byte para cópia de bytes, seu problema está na transferência e não na obtenção de dados da unidade. Com 400G de RAM, uma transferência de arquivos de 320G levará muito tempo. Usar protocolos que não são criptografados é uma opção, mas não importa o quê, você terá que ficar sentado lá e esperar várias horas (pela rede).


1
como 400G de RAM acelera a transferência de dados?
Skaperen

Não tenho certeza se essa era a intenção, mas li como "qualquer transferência mais lenta que a RAM para RAM demorará um pouco", em vez de "comprar 400 GB de RAM e sua transferência HDD para HDD será mais rápida".
Michaels

Sim, ram será armazenado em buffer para você e parecerá mais rápido. Você pode fazer uma transferência de HD para HD com buffer de RAM até o fim e isso parecerá muito rápido. Também levará bastante tempo para liberar para o disco, mas HD para RAM para RAM para HD é mais rápido que HD para HD. (Tenha em mente que você tem que fazer HD para a memória RAM para a memória RAM para HD de qualquer maneira, mas se você tem menos então o seu tamanho de transferência inteira de RAM você terá de "lavar" em segmentos.)
coteyr

Outra maneira de colocar é que para compactar ou até apenas enviar a unidade de origem inteira, é necessário ler o arquivo para ram. Se não couber de uma só vez, ele terá que ler um segmento, enviar, descartar segmento, procurar, ler segmento, etc. Se couber de uma só vez, precisará ler tudo de uma só vez. O mesmo no destino.
coteyr

1
HD para RAM para RAM para HD é mais rápido que HD para HD Como pode ser mais rápido?
AL

1

Independentemente do programa, geralmente descobri que "puxar" arquivos em uma rede é mais rápido que "empurrar". Ou seja, fazer login no computador de destino e fazer uma leitura é mais rápido do que fazer login no computador de origem e fazer uma gravação.

Além disso, se você usar uma unidade intermediária, considere o seguinte: Obtenha uma unidade externa (como um pacote ou uma unidade separada conectada a uma estação de acoplamento) que use eSATA em vez de USB. Em cada um dos dois computadores, instale uma placa com uma porta eSATA ou obtenha um cabo adaptador simples que leve uma das portas SATA internas a um conector eSATA externo. Em seguida, conecte a unidade ao computador de origem, ligue-a e aguarde a montagem automática (você pode montar manualmente, mas se estiver fazendo isso repetidamente, poderá colocá-la no seu arquivo fstab). Então copie; você estará escrevendo na mesma velocidade que em uma unidade interna. Em seguida, desmonte a unidade, desligue-a, conecte-se ao outro computador, ligue-a, aguarde uma montagem automática e leia.


2
Você pode fornecer detalhes de como você está "puxando" arquivos? Quais utilitários você está usando e você pode fornecer qualquer amostra mostrando esse efeito?
STW

Não tenho certeza se essa será uma resposta mais completa, mas considere este cenário: suponha que você tenha dois computadores, foo e bar, e deseje copiar dados de foo para bar. (1) Você entra no foo e monta remotamente a unidade que está fisicamente conectada à barra. Então você copia do disco do foo para o diretório montado remotamente (que está fisicamente na barra). Eu chamei isso de enviar os dados para o outro computador. (2) Compare isso com a outra maneira de copiar os mesmos dados. Faça logon no bar, monte remotamente o diretório anexado ao foo e leia de foo na unidade do bar. Isso está puxando.
Mike Ciaraldi

Essa cópia pode ser feita com o comando Linux cp, a partir de um gerenciador de arquivos da GUI ou qualquer outra maneira de copiar arquivos. Eu acho que puxar acaba sendo mais rápido porque a gravação é mais lenta que a leitura, e mais decisões sobre como gravar no disco de destino estão sendo tomadas no mesmo computador em que a unidade está conectada, portanto, há menos sobrecarga. Mas talvez esse não seja mais o caso de sistemas mais modernos.
Mike Ciaraldi

1

Vou recomendar que você analise as equipes da NIC. Isso envolve o uso de várias conexões de rede em execução paralela. Supondo que você realmente precise de mais de 1 Gb de transferência e 10 Gb seja proibitivo em termos de custo, 2 Gbs fornecidos pela equipe da NIC seriam um custo menor e seus computadores já podem ter portas extras.


Se você está se referindo ao LACP (Link Aggregation Control Protocol), não verá um aumento na velocidade. Forneceu redundância e alguma capacidade para atender a conexões simultâneas, mas não fornecerá um aumento de velocidade para esse tipo de transferência.
STW

@STW: Requer suporte de switch para agregar dois links a uma máquina em um link de 2gbit, mas é possível. Útil apenas se ambas as máquinas tiverem um link de 2 gbit ao comutador. Se você tiver dois cabos executando a NIC <-> NIC, sem comutador, isso também funcionará, mas não será muito útil (a menos que você tenha uma terceira NIC em uma máquina para mantê-los conectados à Internet).
Peter Cordes

existe um nome específico para esse recurso nos switches?
STW

Existem várias variações de formação de equipes da NIC, EtherChannel, etc. O STW é adequado para determinadas configurações, isso não ajuda, mas, para algumas configurações, ajudaria. Tudo se resume a saber se o canal conectado acelera ou não o desempenho de um único soquete IP. Você precisará pesquisar os detalhes para determinar se essa é uma solução viável para você.
Byron Jones

802.3ad é o padrão aberto que você procuraria em seus comutadores. Como um hack rápido, você pode conectar NICs extras à rede e fornecer endereços IP apropriados em sub-redes separadas no espaço de endereço privado. (porta 1 do host a e porta 2 do host a obter uma sub-rede, porta 1 do host be porta 2 do host b obter outra sub-rede). Em seguida, basta executar dois trabalhos paralelos para fazer a transferência. Isso será muito mais simples do que aprender os meandros do Etherchannel, 802.3ad etc.
Dan Pritts

1

FWIW, eu sempre usei isso:

tar -cpf - <source path> | ssh user@destserver "cd /; tar xf -"

O que é esse método é que ele manterá permissões de arquivo / pasta entre máquinas (supondo que os mesmos usuários / grupos existam em ambos) (também costumo fazer isso para copiar imagens de disco virtual, pois posso usar um parâmetro -S para manipular arquivos esparsos. )

Acabei de testar isso entre dois servidores ocupados e conseguiu ~ 14 GB em 216s (cerca de 64 MB / s) - poderia fazer melhor entre máquinas dedicadas e / ou compactação ... YMMV

$ date; tar -cpf - Installers | ssh elvis "cd /home/elvis/tst; tar xf -"; date
Wed Sep  9 15:23:37 EDT 2015
Wed Sep  9 15:27:13 EDT 2015

$ du -s Installers
14211072   Installers

1

A menos que você queira fazer análise forense do sistema de arquivos, use um programa de despejo / restauração para o seu sistema de arquivos para evitar a cópia do espaço livre que o FS não está usando. Dependendo do sistema de arquivos que você possui, isso normalmente preservará todos os metadados, inclusive ctime. números de inode podem mudar, no entanto, novamente, dependendo do sistema de arquivos (xfs, ext4, ufs ...).

O destino de restauração pode ser um arquivo no sistema de destino.

Se você deseja uma imagem de disco completo com a tabela de partições, pode obter ddo primeiro 1M do disco para obter a tabela de partições / gerenciadores de inicialização / outras coisas, mas depois xfsdumpas partições.

Não posso dizer pelo seu depósito de informações que tipo de sistema de arquivos você realmente possui. Se for BSD ufs, acho que tem um programa de despejo / restauração. Se for ZFS, bem, IDK, pode haver algo.

Geralmente, os discos de cópia completa são muito lentos para qualquer coisa, exceto para situações de recuperação. Você também não pode fazer backups incrementais dessa maneira.


1

Você também pode configurar os sistemas para ter um armazenamento compartilhado!

Estou considerando que estes estão próximos um do outro, e é provável que você faça isso de novo e de novo ....


1

Que tal um cabo cruzado Ethernet? Em vez de depender das velocidades sem fio, você está limitado à velocidade com fio da sua NIC.

Aqui está uma pergunta semelhante com alguns exemplos desse tipo de solução.

Aparentemente, apenas um cabo Ethernet típico é suficiente hoje em dia. Obviamente, quanto melhor sua NIC, mais rápida será a transferência.

Para resumir, se qualquer configuração de rede for necessária, deve-se limitar a simplesmente definir IPs estáticos para o servidor e o computador de backup com uma máscara de sub-rede 255.255.255.0

Boa sorte!

Editar:

@Khrystoph tocou nisso em sua resposta


Como isso irá melhorar as taxas de velocidade? Você pode explicar sua resposta?
AL

1
Potencialmente, isso aumentaria a velocidade, pois você não precisaria se preocupar com a velocidade da rede intermediária. Em relação aos cabos ethernet "típicos" vs "crossover" - 1Gb ethernet fará o crossover automático conforme necessário. Os switches Ethernet da HP farão isso a 100Mb. Outras marcas, geralmente não, e você precisará de um crossover se estiver preso a 100Mb.
Dan Pritts

1

Várias pessoas recomendam que você pule o ssh porque a criptografia o atrasará. As CPUs modernas podem, na verdade, ser rápidas o suficiente em 1Gb, mas o OpenSSH tem problemas com sua implementação de janelas internas que pode atrasá-lo drasticamente.

Se você quiser fazer isso com o ssh, dê uma olhada no HPN SSH . Ele resolve os problemas de janelas e adiciona criptografia multithread. Infelizmente, você precisará reconstruir o ssh no cliente e no servidor.


0

OK Tentei responder a essa pergunta em dois computadores com "tubos muito grandes" (10Gbe) "próximos" um do outro.

O problema com o qual você se depara aqui é: a maior parte da compactação afunila na CPU, pois os tubos são muito grandes.

desempenho para transferir arquivos de 10 GB (conexão de rede de 6 Gb [linode], dados não compactá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 em 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 usou menos CPU, por outro, então YMMV.

Com o netcat, se não tiver a 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. scpatinge o máximo de 230 MB / s, atrelando um núcleo a 100% de utilização.

Infelizmente, o Iperf3 cria arquivos corrompidos . Algumas versões do netcat parecem não transferir o arquivo inteiro, muito estranho. Versões especialmente antigas.

Vários encantamentos de "gzip como um pipe para netcat" ou "mbuffer" também pareciam maximizar o cpu com o gzip ou mbuffer, portanto, não resultavam em uma transferência mais rápida com canos tão grandes. lz4 pode ajudar. Além disso, algumas das coisas que eu tentei resultaram em transferências corrompidas para arquivos muito grandes (> 4 GB); portanto, tenha cuidado lá fora :)

Outra coisa que pode funcionar especialmente para uma latência mais alta (?) É ajustar as configurações do tcp. Aqui está um guia que menciona valores sugeridos:

http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm e https://fasterdata.es.net/host-tuning/linux/ (de outra resposta) possivelmente configurações de IRQ: https://fasterdata.es .net / ajuste do host / 100g-tuning /

sugestões do linode, adicione /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 desejam que você execute:

 /sbin/ifconfig eth0 txqueuelen 10000 

vale a pena conferir duas vezes depois de ajustar para garantir que as alterações também não causem danos.

Também pode valer a pena ajustar o tamanho da janela: https://iperf.fr/iperf-doc.php#tuningtcp

Com conexões lentas (er), a compactação pode definitivamente ajudar. Se você possui tubos grandes, a compactação muito rápida pode ajudar com dados prontamente compactáveis, mas não tentei.

A resposta padrão para "sincronizar discos rígidos" é sincronizar os arquivos, o que evita a transferência sempre que possível.

Outra opção: use "scp paralelo" (de uma forma ou de outra), então ele usará mais núcleos ...

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.