在LAN上复制大文件的快速方法


24

我在使用NFS时遇到了一些麻烦,我想尝试仅使用普通的旧TCP。

不过,我不知道从哪里开始。

在硬件方面,我正在使用以太网交叉电缆将两个上网本联网。

要联网,我输入

$ 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

在第一个上网本上

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

在第二

其中/mnt/network1在/ etc / fstab中作为被指定

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

以及/etc/exports第一个上网本中的内容(使用该文件的语法)。

上面的工作正常,但文件和目录很大。每个文件平均大约半GB,目录都在15到50 GB之间。

我正在rsync转移它们,命令(on 192.168.1.2)是

$ rsync -avxS /mnt/network1 ~/somedir

我不确定是否可以通过调整NFS设置来更好地处理大文件,但是我想看看rsync在普通的旧TCP上运行守护程序是否比rsync在NFS上运行更好。

因此,重申一下,如何使用TCP建立类似的网络?

更新:

因此,经过数小时的尝试,使自己摆脱了自己愚昧无知的困境(或者,就像我想考虑的那样,借助自己的自我引导,使自己振作起来),我想到了一些有用的事实。

但是首先,导致我走上这条兔子路而不是简单地接受当前最佳答案的是:这nc是一个令人难以置信的很棒的程序,绝对无法为我工作。我已经尝试了netcat-openbsdnetcat-traditional软件包,但都没有运气。

我在接收机器(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 给出:

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

但是,这是个好消息:设置了静态IP地址/etc/network/interfaces,我在尝试nc上班时就开始这样做,修复了我所有的NFS问题,并重新点燃了我对NFS的热爱。

我使用的确切配置(192.168.1.1当然是用于第一个上网本)是:

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

有了这些设置,两台上网本在启动后将能够彼此直接ping通,甚至不需要输入ifup

无论如何,我还是很想看看nc实际情况,因此希望有人帮助我调试此过程。


如果两个目录都是本地目录,那么最好只使用普通旧目录,/bin/cp或者根本不使用NFS
Karlson 2012年

1
对通过NFS访问的文件运行rsync意味着该文件的全部内容至少需要通过网络复制一次。您不需要守护程序来调用客户机/服务器rsync,只需在ssh上运行它即可。(理论上可以通过telnet / rsh调用远程端,但是在实践中运行这样的服务很愚蠢-ssh不会增加很多开销)。
symcbean 2012年

NFSv2很老了。您正在使用什么操作系统?
尼尔斯2012年

最新的Debian和最新的Ubuntu。我nfsvers=2从本教程(michaelminn.com/linux/home_network)中获得了所有这些命令(包括)
ixtmixilix 2012年

5
实际上,ssh会增加相当大的开销,而加密并不便宜。在正常的Internet速度下,这并不重要,但是在LAN(在这种情况下为直接交叉连接)上,您可能会注意到。以千兆为单位,除了最快的机器(或带有AES-NI指令的机器,如果SSH使用的机器除外)之外,我敢肯定它会引起注意。
derobert 2012年

Answers:


43

快速方法

除非有很少的更改,否则通过LAN传输文件的最快方法可能不是rsync。rsync花费大量时间进行校验和,计算差异等。如果您知道无论如何都要传输大多数数据,则只需执行以下操作即可(请注意:有多种实现netcat;请参见的手册正确的选项。尤其是您可能不需要-p):

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

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

它使用netcat(nc)通过端口1234上的原始TCP连接发送tar。由于没有加密,真实性检查等,因此速度非常快。如果交叉连接的运行速率为千兆或更少,那么您将固定网络。如果更多,则将钉住磁盘(除非您有存储阵列或快速磁盘)。vtar 的标志使它可以随时打印文件名(详细模式)。对于大文件,几乎没有任何开销。如果要处理大量的小文件,则可以将其关闭。另外,您可以pv在管道中插入类似内容以获取进度指示器:

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

当然,您也可以插入其他内容,例如gzip -1(并z在接收端添加标志- z发送端上的标志将使用比1更高的压缩级别,除非您当然设置了GZIP环境变量)。尽管gzip实际上可能会变慢,除非您的数据真正压缩。

如果您真的需要rsync

如果您实际上只传输一小部分已更改的数据,则rsync可能会更快。您可能还需要查看-W/ --whole-file选项,因为使用真正快速的网络(例如交叉连接)可以更快。

运行rsync的最简单方法是通过ssh。您将要尝试使用ssh密码,看看哪种最快,它将是AES,ChaCha20或Blowfish(尽管Blowfish的64位块大小存在一些安全问题),具体取决于您的芯片是否具有Intel AES -NI指令(您的OpenSSL使用它们)。在足够新的ssh上,rsync-over-ssh如下所示:

user@source:~$ rsync -e 'ssh -c aes128-gcm@openssh.com' -avP /source/ user@dest-ip:/target

对于较旧的ssh / sshd,请尝试aes128-ctraes128-cbc代替aes128-gcm@openssh.com

ChaCha20将是chacha20-poly1305@openssh.com(也需要一个足够新的ssh / sshd),而河豚将是河豚-cbc。OpenSSH不允许在没有密码的情况下运行。当然,您可以使用任何喜欢的rsync选项代替-avP。当然,您可以朝另一个方向运行,并从目标计算机(拉)而不是源计算机(推)运行rsync。

使rsync更快

如果运行rsync守护程序,则可以消除加密开销。首先,您将在后台/etc/rsyncd.conf机器上创建一个守护程序配置文件()(有关详细信息,请阅读rsyncd.conf手册页):

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

然后,在目标计算机上,运行:

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

您也可以用另一种方式进行此操作(但是,您当然需要将只读设置为否)。有用于身份验证的选项等,有关详细信息,请参见手册页。


2
这是一个很好的答案。另一个也很棒。是否仅因为申请者无法在选择者之间进行选择,就没有可接受的答案吗?
sudo

netcat方法的鲁棒性如何?如果网络丢弃数据包,则似乎将丢失文件的随机部分。
sudo

1
@sudo使用的是TCP,它将根据需要重新传输。因此,它应该可以防止数据包丢失,随机破坏(在TCP和以太网校验和能够捕获的范围内)等。当然,它不能安全地防止通过ssh进行隧道攻击。
derobert

1
@sudo可以一次完成所有操作,将一些tee命令插入管道的两侧以计算校验和。
derobert

1
@TheStoryCoder零件中的点tar告诉它执行当前目录。这实际上不是nc命令的一部分,tar用于创建tar归档文件,该归档文件通过管道传递到netcat(另一方面,netcat则通过管道传递到tar以提取归档文件)。恐怕评论还不足以解释管道,但希望这足以使您入门……
derobert

17

怎么样?或TL; DR

我发现最快的方法是组合tarmbufferssh

例如:

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

使用此工具,我已经在1Gb链路上实现了950 Mb / s的持续本地网络传输。替换每个tar命令中的路径以适合您要传输的内容。

为什么?mbuffer!

到目前为止,通过网络传输大文件的最大瓶颈是磁盘I / O。答案是mbufferbuffer。它们在很大程度上相似,但mbuffer具有一些优势。的默认缓冲区大小是2MB mbuffer和1MB buffer。较大的缓冲区更有可能永远不会为空。选择一个块大小,它是目标文件系统和目标文件系统上本机块大小的最小公倍数,将提供最佳性能。

缓冲才是一切的关键!如果有,请使用它!如果您没有它,那就去!使用(m}?bufferplus胜过任何事物本身。实际上,它几乎是缓慢的网络文件传输的灵丹妙药。

如果要传输多个文件,则可以tar将它们“集中”在一起成为一个数据流。如果是单个文件,则可以使用cat或I / O重定向。tarvs. 的开销在cat统计上是微不足道的,因此,除非它已经是tarball,否则我总是使用tar(或zfs -send在可能的地方)。这些都不能保证为您提供元数据(特别是不会)。如果您需要元数据,我将保留它作为练习。cat

最后,ssh用于传输机制既安全又几乎没有开销。同样,sshvs nc。的开销在统计上微不足道。


4
openssl speed在i7-3770上,河豚CBC的速度为〜126–146 MB /秒,AES CBC的速度为〜138–157 MB /秒(此芯片具有AES-NI指令)。然后,sha256约为200–300 MB /秒。因此,它只能勉强推动1吉比特。使用OpenSSH 6.1+,您可以使用AES GCM,它可以盲目的速率(370–1320 MB /秒,具体取决于消息大小)执行。因此,我认为只有在使用AES-NI并使用AES-GCM的芯片上运行6.1+时,OpenSSH的开销才很小。
derobert 2013年

1
gh,我在最后一刻将其更改为6.1+,而不是6.2+,并迅速进行了检查。当然,这是一个错误,它是6.1版以来的更改。因此,OpenSSH 6.2+是正确的版本。而且现在我再也不能编辑评论了。超过5分钟的评论必须保持不正确。当然,如果少于OpenSSH 6.4,请参阅openssh.com/txt/gcmrekey.adv,因为没有补丁,则OpenSSH的AES-GCM实现存在可利用的漏洞。
derobert

ssh(或ssh上的rsync)的开销非常重要。我有一个使用Intel Atom CPU的NAS。SSH加密绝对可以提高传输速度。对于RSA,我始终保持<400 Mbit / sec的速度,手动将其重写为RC4会使我获得〜600 Mbits / sec的速度,如果我将rsync用作守护程序,则它将以链接本机速度(> 900 MBit / sec,在千兆位上运行)连接)。
假名称

在许多情况下,传输确实不是关键,但考虑它绝对是重要的,特别是如果您不是在极高端的硬件上运行的话。就我而言,Atom(D525,双核1.8 Ghz)构成了一个完美的NAS,并为SMB提供了足够的速度,但是加密绝对可以杀死它。
假名称

2
由于mbuffer的参数化,导致出现致命错误:'mbuffer:致命:总内存必须大于块大小\ n Terminated'。为了更正,我怀疑它应该读为“ mbuffer -s 1K -m 512M”,最后一个“ M”代表兆字节(来源:man mbuffer)
Peter Lustig

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.