在两台计算机之间发送大量数据的最快方法是什么?[关闭]


111

我经常遇到这种情况:

  • 我有一个内部服务器,其中有一个320GB的硬盘驱动器,以及16GB的ram(可在此处找到确切的规格,但是由于这也是我在其他计算机上经常遇到的一个问题,因此我希望答案适用于任何计算机“合理的” Linux计算机)
  • 我有一个备份服务器,其中有几个TB的硬盘空间(具体规格在此处,请参见上面的免责声明)

我想将320GB的数据从源服务器传输到目标服务器(特别是来自的数据/dev/sda)。

  1. 两台计算机实际上彼此相邻,因此我可以在它们之间进行电缆连接。
  2. 我在局域网上,并且正在使用新型路由器,这意味着我的网络速度应该“理想地”为1000Mbit,对吗?
  3. 安全性不是问题。我在本地网络上,我信任网络上的所有计算机,包括路由器。
  4. (可选)我不一定需要数据的签名校验和,但是应该检测基本的错误检查(例如丢包或驱动器变得不可读),而不仅仅是消失在输出中。

我在线搜索了这个问题,并测试了几个命令。最常出现的一个是:

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

事实证明,此命令太慢(运行了一个小时,仅通过数据获得了约80GB)。1GB的测试数据包花费了大约1分22秒的时间,最终没有压缩时的速度提高了两倍。由于传输的文件小于源系统上的RAM数量,因此结果可能也有偏差。

而且(这已经在1GB的测试件上进行了测试),如果我使用gzip命令and dd,则会遇到问题。与直接管道传输相比,在目标上提取时,结果文件具有不同的校验和。我仍在尝试找出原因。


54
不要忘sneakernet
gwillie

4
您要传输/dev/sda图像还是仅传输文件。为什么rsync没有选项?/dev/sda在您dd编辑时是否已安装?
Jodka Lemon

15
您的性能数据(1GB / 80sec,80GB / 1h)完全符合我们对100MBit的期望。检查您的硬件。... gerrit是正确的,320 GB可能很大,但是“大量数据”引起了错误的期望。
blafasel

8
“永远不要低估装满磁盘的货运列车的带宽。” ..您是在询问吞吐量,延迟还是两者的某种组合?
keshlam 2015年

8
我的一个朋友总是说:“永远不要低估卡车上一堆硬盘的带宽”。
AMADANON Inc.

Answers:


139

由于服务器在物理上彼此相邻,并且您在注释中提到可以物理访问它们,因此最快的方法是将硬盘驱动器从第一台计算机中取出,放入第二台计算机,然后传输文件通过SATA连接。


15
+1:通过物理传输似乎是最快的方法,即使这意味着从某处获取大的外部硬盘驱动器也是如此。大约40英镑,您可能已经花了很多时间,
deworde 2015年

3
如果人们正在通过千兆位网络实现全速运行,我完全不同意这种想法。通过HP Gen 7微型服务器和Pentium G630计算机之间的Zyxel千兆交换机在NFS / SMB上进行测试,可以使我每秒传输约100MB。(直到我离开驱动器盘片的外边缘。)因此,我认为可以在3小时内完成。除非您使用SSD或极高性能的驱动器/存储,否则我认为2个副本不会产生100MB / s的吞吐量,这要求每个副本操作达到200MB / s才能达到收支平衡。
2015年

3
@Phizes:显然您不会复制到临时文件。那是deword的坏主意,而不是其他所有人在说的。将源驱动器连接到目标计算机的重点是使用SATA-> SATA dd(或文件系统树状副本)。
彼得·科德斯

10
“永远不要低估装满硬盘的卡车的带宽。尽管如此,延迟还是令人难以置信”
凯文

3
@Kevin:是的,我的意思是,同一台计算机中磁盘之间的直接复制至少与其他任何可能的方法一样快。我提出了实际的带宽数字,以承认Phize的观点,即通过gigE进行操作对OP的旧驱动器来说是很好的,但对于新驱动器来说却是一个瓶颈。(一种情况下,一台计算机上的两个驱动器都不是最佳选择,那就是让另外一台计算机使用其RAM来缓存源和dest的元数据非常重要,例如,对于数十亿个文件的rsync。)
Peter Cordes,2015年

69

netcat 对于像这样安全性不成问题的情况非常有用:

# 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

注意,如果您使用的dd是GNU coreutils,则可以发送SIGUSR1到进程,它将进程发送到stderr。对于BSD dd,请使用SIGINFO

pv在报告复制过程中的进度方面更加有用:

# 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
对于第二个示例,dd甚至是必需的,还是可以pv/ nc单独使用/dev/sda就可以了?(当我尝试读取特殊文件之类的特殊文件或带0x00字节的文件时,我已经注意到一些命令“抛出” )
IQAndreas

5
@ user1794469压缩有帮助吗?我在想网络不是瓶颈所在。
IQAndreas

17
不要忘记,bash可以使用> /dev/tcp/IP /端口< /dev/tcp/IP /端口重定向来代替分别往返于netcat的管道。
Incnis Mrsi 2015年

5
好答案。千兆以太网通常比硬盘驱动器速度快,因此压缩是没有用的。要传输几个文件,请考虑tar cv sourcedir | pv | nc dest_host_or_ip 9999cd destdir ; nc -l 9999 | pv | tar xv。可能有多种变体,例如,您可能想保留.tar.gz目的地而不是副本。如果将目录复制到目录,则为了提高安全性,您可以在以后执行rsync,例如,从dest开始rsync --inplace -avP user@192.168.1.100:/path/to/source/. /path/to/destination/.,它将确保所有文件确实是精确的副本。
斯特凡纳·古里科

3
代替使用IPv4,您可以通过使用IPv6获得更好的吞吐量,因为IPv6具有更大的有效负载。您甚至不需要配置它,如果机器支持IPv6,则它们可能已经具有IPv6链接本地地址
David Costa

33
  1. 使用快速压缩。

    • 无论使用哪种传输介质(尤其是用于网络或USB的传输介质),您都将使用数据突发进行读取,缓存和写入,而这些突发不会完全同步。
    • 除了磁盘固件,磁盘缓存和内核/内存缓存之外,如果您还可以通过某种方式使用系统的CPU来集中每个突发所交换的数据量,那么您应该这样做
    • 任何压缩算法都将自动尽可能快地自动处理稀疏的输入,但是很少有压缩算法可以处理网络吞吐量的其余部分。
    • lz4 是您最好的选择:

      LZ4是一种非常快速的无损压缩算法,其压缩速度为每核400 MB / s,可与多核CPU一起扩展。它还具有极快的解码器,每个内核的速度为数GB / s,通常在多内核系统上达到RAM速度限制。

  2. 最好不要没有不必要的寻求。

    • 这可能很难衡量。
    • 如果要从中进行复制的设备上有很多可用空间,并且该设备最近没有被清零,但是应该复制所有源文件系统,那么可能值得您花些时间来做就像是:

      </dev/zero tee >empty empty1 empty2; sync; rm empty*
    • 但这取决于您应该阅读源代码的级别。通常希望从/dev/some_disk设备文件的头到尾读取设备,因为在文件系统级别进行读取通常会涉及到来回搜索以及不连续地在磁盘周围进行搜索。因此,您的读取命令应类似于:

      </dev/source_device lz4 | ...
    • 但是,如果您的源文件系统不应该整体传输,那么在文件系统级别进行读取是不可避免的,因此您应该将输入内容汇总到流中。pax通常是那种情况下最好和最简单的解决方案,但您也可能会考虑mksquashfs

      pax -r /source/tree[12] | lz4 | ...
      mksquashfs /source/tree[12] /dev/fd/1 -comp lz4 | ...
      
  3. 不要与加密ssh

    • 将加密开销添加到受信任的介质是不必要的,并且可能对持续传输的速度造成严重损害,因为读取的数据需要读取两次
    • 所述PRNG需要读出的数据,或者至少它的一些,以维持随机性。
    • 当然,您还需要传输数据。
    • 您还需要传输加密开销本身-这意味着需要进行更多工作,每次突发传输的数据更少。
    • 因此,您应该使用netcat或者,我更喜欢该nmap项目的功能更强大的ncat)进行简单的网络复制,就像其他地方建议的那样:

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

1
很棒的答案。一个较小的语法要点–“减少每次突发需要交换的数据量” –我认为您正在使用压缩来增加信息密度,因为“突发”是固定宽度的,因此交换的数据量保持不变尽管每个突发传输的信息可能会有所不同。
Engineer Dollery

@EngineerDollery-是的,这很愚蠢。我认为这更好,
mikeserv

@IQAndreas-我会认真考虑这个答案。就我个人而言,我使用Pigz,并且速度的提高是惊人的。并行性是一个巨大的胜利;CPU比数据管道的任何其他部分都要快得多,因此我怀疑并行压缩会降低您的速度(gzip无法并行化)。您可能会发现速度如此之快,以至于没有动力去打乱硬盘。如果这整体上更快(包括磁盘交换时间),我不会感到惊讶。您可以在压缩和不压缩的情况下进行基准测试。无论如何,BlueRaja的diskswap答案或此答案都应该是您接受的答案。
Mike S

快速压缩是一个极好的建议。但是,应该指出的是,只有在数据可以合理压缩的情况下,它才有用。这意味着,例如,数据一定不是压缩格式。
Walter Tross 2015年

@WalterTross -它会帮助,如果任何输入是可压缩的,无论比,只要压缩工作优于转移工作。在现代的四核系统上,lz4即使打开GIGe,工作也应轻松完成,而USB 2.0则没有机会。此外,lz4它仅设计为在应有的时候才起作用-它之所以这么快是因为它知道何时应该尝试压缩以及何时不应该尝试压缩。而且,如果它是一个正在传输的设备文件,那么即使源文件系统中有任何碎片,即使是预压缩的输入也可能会有所压缩。
mikeserv

25

有几个限制可能会限制传输速度。

  1. 1Gbps管道存在固有的网络开销。通常,这会将ACTUAL吞吐量降低到900Mbps或更小。然后,您必须记住,这是双向流量,因此您应该期望的速度大大低于900Mbps。

  2. 即使您使用的是“新型路由器”,您是否确定该路由器支持1Gbps?并非所有新路由器都支持1Gbps。另外,除非它是企业级路由器,否则您可能会失去效率低下的路由器的额外传输带宽。虽然基于我在下面找到的内容,但看来您已经达到了100Mbps以上。

  3. 共享您的网络的其他设备可能会造成网络拥塞。您是否尝试过使用直接连接的电缆,如您所说的那样?

  4. 您正在使用多少磁盘IO?您可能会受到限制,而不是受到网络的限制,而是受到磁盘驱动器的限制。大多数7200rpm硬盘仅能达到40MB / s的速度。您是否正在使用突袭?您正在使用SSD吗?您在远端使用什么?

我建议使用rsync(如果希望重新运行该备份)。您也可以在另一端使用filezilla之类的下载程序来scp,ftp或http,因为它将并行化ssh / http / https / ftp连接。当其他解决方案都在单个管道上时,这可以增加带宽。单管道/线程仍然受到单线程事实的限制,这意味着它甚至可能受CPU约束。

使用rsync,您可以消除解决方案的大量复杂性,并可以压缩,保留权限并允许部分传输。还有其他一些原因,但这通常是大型企业的首选备份方法(或运行备份系统)。Commvault实际上将其软件下方的rsync用作备份的传递机制。

根据给定的80GB / h的示例,您获得的速度约为177Mbps(22.2MB / s)。我觉得您可以通过在两个盒子之间的专用以太网线路上使用rsync轻松将其加倍,因为我已经在自己的测试中通过千兆位的rsync设法做到了这一点。


12
为+1 rsync一次运行它可能不会更快,但是以后的所有时间肯定会更快。
Skrrp

4
>大多数7200rpm硬盘仅能达到40MB / s的速度。IME,使用现代驱动器(包括约5k个驱动器),您更有可能看到连续100MB / s以上的速度。但是,这可能是较旧的磁盘。
鲍勃

2
@Bob:那些现代人仍然每分钟只能读取5400条圆形轨道。这些磁盘仍然很快,因为每个磁道包含一个以上的兆字节。那确实意味着它们也是很大的磁盘,一个320 GB的小磁盘不能在每个磁道上容纳太多千字节,这必然限制了它们的速度。
MSalters

1
对于过去十年中制造的任何驱动器的顺序读取,40MB / s绝对是非常悲观的。如Bob所说,当前的7200RPM驱动器可以超过100MB / s。
hobbs 2015年

3
千兆以太网是1000 mbps 全双工。您每个方向将获得1000mbps(或者说,实际上约为900mbps)。第二...硬盘驱动器现在通常可以达到100MB /秒。除非这是已有十年历史的驱动器,否则40MB /秒的速度很慢。
derobert

16

我们会定期处理。

我们倾向于使用的两种主要方法是:

  1. SATA / eSATA / sneakernet
  2. 直接NFS挂载,然后本地cprsync

首先取决于驱动器是否可以物理重定位。这并非总是如此。

第二个效果出奇的好。通常,通过直接NFS挂载,我们可以很容易地最大化1gbps的连接。使用scp,dd而不是ssh或类似的东西,您将无法获得与之接近的任何东西(可疑的最大速率通常会接近100mpbs)。即使在速度非常快的多核处理器上,您也将遇到两台机器中最慢的一个内核最大加密吞吐量的瓶颈,与未加密网络安装中的全口径cp或rsync相比,它的速度令人沮丧。有时候,你会打的IOPS墙了一小会儿,并在周围被卡住〜53MB / s,而不是更典型的〜110MB / s的,但通常是短暂的,除非源或目标是实际一个驱动器,那么您可能最终会受到驱动器自身持续速率的限制(由于实际原因,这种差异会因随机原因而变化,直到您实际尝试时才会知道)。

如果在不熟悉的发行版上安装NFS可能会有些烦人,但通常来说,这是尽可能充分地填充管道的最快方法。我上一次以超过10gbps的速度进行连接时,我实际上并没有发现连接是否达到极限,因为传输是在我从喝咖啡回来之前结束的,所以您可能会遇到一些自然限制。如果源和目标之间有少量网络设备,则可能会由于网络的滞后效应而受到一些轻微的延迟或打,,但是通常这可以在整个办公室(不使其他流量瘫痪)或从数据中心的一端到另一端正常工作。另一个(除非您内部进行某种过滤/检查,在这种情况下所有下注都为off)。

编辑

我注意到有关压缩的一些讨论…… 压缩连接。它将以与加密层相同的方式使您变慢。如果您压缩连接,则瓶颈将始终是单个核心(并且您甚至不会获得该核心总线的特别好利用)。在这种情况下,最慢的事情是在两台以1gbps或更高的速度彼此相邻的计算机之间使用加密的压缩通道。

未来发展

该建议截至2015年中期。几乎可以肯定,这种情况不会持续太多年了。因此,每样东西都要花一分钱,如果您定期面对这项任务,请在实际负载上尝试各种方法,而不是想像您会得到接近理论最佳值的结果,甚至观察到类似Web之类的典型压缩/加密吞吐率流量,其中大部分是文本流量(提示:批量传输通常主要由已压缩的图像,音频,视频,数据库文件,二进制代码,办公文件格式等组成)以自己的方式运行,并从另一个压缩例程中受益匪浅,压缩例程的大小几乎可以保证与已压缩的二进制数据不对齐...)。

我想在将来,像SCTP这样的概念将被带到一个更有趣的地方,在这里,通常会使用绑定连接(或内部按频谱绑定的光纤通道连接),并且每个通道可以接收独立于其他通道的流。流可以并行压缩/加密,等等。那太好了!但是2015年的今天情况并非如此,尽管幻想和理论化还不错,但我们大多数人都没有运行在冷冻室中的自定义存储集群,直接将数据馈送到Blue Gene / Q的内部,从而为Watson生成了答案。那不是现实。我们也没有时间详尽地分析数据有效负载来确定压缩是否是一个好主意-传输本身将在我们完成分析之前结束,

但...

时代在变,我对压缩和加密的建议将一去不复返。我真的很希望此建议在典型情况下能尽快被推翻。这会让我的生活更轻松。


1
@jofel只有当网络速度是慢比处理器的压缩可以通过-这是从未用于1gpbs或更高的连接真。不过,在典型情况下,网络是瓶颈,而压缩确实可以有效地加快速度-但是,OP并非如此。
zxq9 2015年

2
lz4速度足够快,不会造成瓶颈,但是根据您要对副本执行的操作,可能需要将其解压缩。lzop也非常快。在我的i5-2500k Sandybridge(3.8GHz)上,lz4 < /dev/raid0 | pv -a > /dev/null输入速度为〜180MB / s,输出速度为〜105MB / s,正好适合gigE。在接收端解压缩在CPU上甚至更加容易。
彼得·科德斯

1
而且,3.8GHz的速度比大多数服务器处理器(或许多具有任何风味的企业级系统,至少我经常看到的)运行的速度要快得多。在数据中心中,看到更高的内核数量和更低的时钟速度是很常见的。传输负载的并行化很长一段时间以来就不是问题,因此在大多数情况下,我们都停留在单核的最大速度上,但是我希望这会改变,因为通常时钟速度已达到极限,但是网络速度仍然达到最高点还有很长的路要走。
zxq9

2
我完全不同意您关于压缩的评论。它完全取决于数据的可压缩性。如果您获得99.9%的压缩率,那么不这样做是很愚蠢的-为什么在可以转移100MB的情况下转移100GB?我并不是说这个问题是这种压缩水平,只是表明必须逐案考虑,并且没有绝对的规则。
Engineer Dollery

1
@EngineerDollery这并不能批量传送发挥出所有在现实世界中。我几乎每天都会这样做,并且已经测试了各种方法和设置。在一般情况下,大量的未知数据传输(任何您没有时间进行压缩调整测试的操作-这实际上意味着几乎任何数据中心,公司基础架构,小型企业服务器或家庭网络中的所有内容)都很多在1Gbps或更高的连接速度下更快。去试试看。文本通常是压缩的最佳情况。文本仅占典型批量传输有效载荷的一小部分。
zxq9


5

如果您以某种方式(通过有线/ sneakernet /任何方式)获得了第一通,则可以研究rsync某些选项,这些选项可以大大加快后续传输的速度。一个很好的方法是:

rsync -varzP sourceFiles destination

选项包括:详细,存档模式,递归,压缩,部分进度


2
Rsync比netcat更可靠,但是归档意味着递归,因此r是冗余的。
Tanath

另外,-z根据您的CPU和正在处理的数据,速度可能会缓慢增加。禁用压缩时,我经历了从30 MB / s到125 MB / s的传输。
lindhe

4

添加对原始海报坚持zackse答案的评论的补充,尽管我不确定这在典型情况下最快

bash具有特殊的重定向语法:
对于输出:      > /dev/tcp/IP /端口
对于输入:       < /dev/tcp/IP /端口
IP禁止为点分十进制IP或主机名; port ban可以是十进制数字,也可以是来自的端口名称/etc/services

没有实际/dev/tcp/目录。这是一个特殊的语法错误,命令bash创建一个TCP套接字,将其连接到指定的目标,然后执行与通常的文件重定向相同的操作(即,使用dup2(2)将相应的标准流替换为套接字)。

因此,人们可以直接通过TCP 从源机器ddtar在源机器上流数据。或者相反,tar直接通过TCP 将数据流传输到类似内容。无论如何,都消除了一个多余的网猫。

关于netcat的注意事项

经典的netcat和GNU的netcat之间的语法不一致。我将使用我惯用的经典语法。更换-lp-l的GNU的netcat。

另外,我不确定GNU netcat是否接受-q切换。

传输磁盘映像

(沿着zackse的答案。)
在目的地:

nc -lp 9999 >disk_image

来源:

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

使用以下命令创建tar.gz归档文件 tar

在目的地:

nc -lp 9999 >backup.tgz

来源:

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

更换.tgz.tbzczcj获得bzip2-compressed存档。

立即扩展到文件系统传输

也可以tar
在目的地:

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

来源:

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

它可以在没有的情况下工作-q 1,但是在数据结束时netcat将卡住。有关的语法和注意事项,请参见tar(1)tar。如果有许多具有高冗余度(低熵)的文件,则可以尝试压缩(例如czxz而不是cand x),但是如果文件是典型的并且网络足够快,则只会减慢该过程。有关压缩的详细信息,请参见mikeserv的答案。

替代样式(目标侦听端口)

在目的地:

cd backups
nc -lp 9999 |tar x

来源:

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

bash显然不能在套接字上“监听”,以便等待并接收文件:unix.stackexchange.com/questions/49936/…因此,对于连接的至少一半,您必须使用其他东西...
rogerdpack


2

我将使用我编写的需要该程序包的脚本socat

在源计算机上:

tarnet -d wherefilesaretosend pass=none 12345 .

在目标计算机上:

tarnet -d wherefilesaretogo pass=none sourceip/12345

如果有vbuf软件包(Debian,Ubuntu),则文件发送者将显示数据进度。文件接收器将显示接收到的文件。pass =选项可用于可能暴露数据(速度较慢)的地方。

编辑:

-n如果CPU是瓶颈,请使用该选项禁用压缩。


2

如果预算不是主要问题,则可以尝试将驱动器与Intel Xeon E5 12核心“驱动器连接器”连接。该连接器通常功能强大,甚至可以在其上运行当前的服务器软件。从两个服务器!

这看起来可能是一个有趣的答案,但是您应该真正考虑一下为什么要在服务器之间移动数据,以及是否拥有共享内存和存储的大型服务器更有意义。

不确定当前的规格,但是传输速度可能受磁盘速度而非网络速度的限制?


1

如果您只关心备份,而不关心硬盘驱动器的字节复制,那么我建议您使用backupPC。http://backuppc.sourceforge.net/faq/BackupPC.html设置起来有点麻烦,但是传输非常快。

我最初传输约500G数据的时间约为3个小时。随后的备份大约需要20秒。

如果您对备份不感兴趣,但尝试同步内容,则rsync或unison会更适合您的需求。

一个字节的硬盘字节拷贝通常是出于备份目的的一个糟糕主意(没有增量,没有节省空间,驱动器无法使用,您必须备份“空白空间”,并且必须备份垃圾) (例如16G交换文件或200G核心转储等)。使用rsync(或backuppc或其他工具),您可以及时创建“快照”,从而可以使用以下命令转到“文件系统看起来像30分钟前的样子”:很少的开销。

就是说,如果您真的想传输一个字节进行字节复制,那么您的问题将出在传输上,而不是从驱动器获取数据。如果没有400G的RAM,则320G的文件传输将花费很长的时间。使用未加密的协议是一种选择,但是无论如何,您只需要坐在那里等待几个小时(通过网络)即可。


1
400G的RAM如何加速数据传输?
Skaperen 2015年

不确定是否是这样做的,但是我读它是因为“任何比RAM到RAM传输都要慢的介质都需要一段时间”,而不是“购买400 GB的RAM,而您的HDD到HDD的传输会更快”。
MichaelS 2015年

是的,ram将为您缓冲,并且看起来更快。您可以使用RAM缓冲进行HD到HD的传输,这似乎非常快。刷新到磁盘还需要花点时间,但是从HD到RAM到RAM到HD的速度要比从HD到HD的速度快。(请记住,无论如何,您都必须执行从HD到RAM到RAM到HD的操作,但是如果您的RAM的整个传输大小较小,则必须分段进行“刷新”。)
coteyr

放置的另一种方法是,压缩或什至只是发送整个源驱动器,都必须读入ram。如果不能一次全部满足,则必须读取一个段,发送,丢弃段,查找,读取段等。如果一次适合所有,则只需一次读取所有。在目的地相同。
coteyr

1
从HD到RAM到RAM到HD的速度要比从HD到HD的速度更快?
AL

1

无论使用哪种程序,我通常都发现通过网络“拉”文件比“推”文件快。也就是说,登录到目标计算机并进行读取比登录源计算机并进行写入要快。

另外,如果要使用中间驱动器,请考虑以下事项:获取使用eSATA而不是USB的外部驱动器(作为包装,或插入扩展坞的单独驱动器)。然后,在两台计算机的每台计算机上,要么安装带有eSATA端口的卡,要么获得一条简单的适配器电缆,该电缆将内部SATA端口之一连接到外部eSATA连接器。然后将驱动器插入源计算机,打开驱动器电源,然后等待其自动挂载(您可以手动挂载,但是如果反复执行此操作,则最好将其放入fstab文件中)。然后复制;您将以与内部驱动器相同的速度进行写入。然后卸下驱动器,关闭电源,插入另一台计算机,打开电源,等待自动安装并读取。


2
您能否提供有关“拉”文件方式的详细信息?您正在使用哪些实用程序,并且可以提供任何显示这种效果的示例吗?
STW

我不确定这是否是一个更完整的答案,但是请考虑以下情形:假设您有两台计算机,即foo和bar,并且想要将数据从foo复制到bar。(1)登录到foo,然后远程挂载物理连接到bar的驱动器。然后,从foo的磁盘复制到远程安装的目录(实际上位于bar上)。我称之为将数据推送到另一台计算机。(2)将此与其他复制相同数据的方式进行比较。登录bar,远程挂载foo附加的目录,然后从foo读取到bar的驱动器上。这是拉。
Mike Ciaraldi 2015年

可以使用Linux cp命令,从GUI文件管理器或任何其他复制文件的方式来完成此复制。我认为拉出速度更快,因为写入比读取要慢,并且有关如何写入目标磁盘的更多决定是在驱动器连接到的同一台计算机上完成的,因此开销较小。但是,对于更现代的系统,也许不再是这种情况了。
Mike Ciaraldi 2015年

1

我建议您看一下NIC组合。这涉及使用并行运行的多个网络连接。假设您确实需要超过1Gb的传输,并且10Gb的价格高得令人望而却步,那么NIC团队提供的2Gb将是一笔很小的费用,并且您的计算机可能已经具有额外的端口。


如果您指的是LACP(链路聚合控制协议),则不会看到速度的提高。它提供了冗余并提供了服务更多并发连接的能力,但不会为这种类型的传输提速。
STW 2015年

@STW:需要开关支持才能将到一台计算机的两个链接聚合为2gbit链接,但是这是可能的。但是,仅当两台计算机都具有到交换机的2gbit链接时才有用。如果您有两根运行NIC <-> NIC的电缆,并且没有开关,那也应该工作,但不是很有用(除非您在一台计算机中有第三个NIC来保持它们与Internet的连接)。
彼得·科德斯

交换机中此功能是否有特定名称?
STW

NIC分组,EtherChannel等有多种变体。STW适用于某些配置,这无济于事,但对于某些配置,它会适用。归结为绑定通道是否可以提高单个IP套接字的性能。您需要研究具体细节,以确定这是否对您而言是可行的解决方案。
拜伦·琼斯

802.3ad是您在交换机上寻找的开放标准。不过,作为一个快速技巧,您可能只是将额外的NIC连接到网络,并在专用地址空间的单独子网中为它们提供了适当的IP地址。(主机1端口a和主机2端口a获得一个子网,主机1端口b和主机2端口b获得另一个子网)。然后只需运行两个并行作业即可进行传输。这将是比学习以太通道,802.3ad的,等等的来龙去脉简单得多
丹Pritts

1

FWIW,我一直使用这个:

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

关于此方法的问题是,它将维护机器之间的文件/文件夹许可权(假设两台机器上都存在相同的用户/组)(我也通常这样做是为了复制虚拟磁盘映像,因为我可以使用-S参数来处理稀疏文件。 )

刚刚在两个繁忙的服务器之间进行了测试,并在216s(约64MB / s)的速度下管理了约14GB的内存-在专用计算机和/或压缩之间可能会做得更好... 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

除非要进行文件系统取证,否则请对文件系统使用转储/恢复程序,以避免复制FS未使用的可用空间。根据您拥有的文件系统,通常会保留所有元数据,包括ctime。但是,根据不同的文件系统(xfs,ext4,ufs ...),inode号可能会更改。

还原目标可以是目标系统上的文件。

如果要使用分区表的全磁盘映像,则可以dd在磁盘的前1M处获取分区表/引导加载程序/内容,然后xfsdump获取分区。

我无法从您的信息转储中得知您实际上拥有哪种文件系统。如果是BSD ufs,那么我认为它具有转储/还原程序。如果是ZFS,最好是IDK,可能有些问题。

通常,除了恢复情况外,对其他任何东西来说,全盘复制都太慢了。您也无法以这种方式进行增量备份。


1

您也可以将系统设置为具有共享存储!

我正在考虑这些是彼此相邻的,您很可能会一遍又一遍....


1

以太网交叉电缆怎么样?您不必依赖无线速度,而可以限制NIC的有线速度。

这是带有类似解决方案示例的类似问题。

如今,显然只有一条典型的以太网电缆就足够了。显然,NIC越好,传输速度就越快。

总之,如果需要进行任何网络设置,则应仅限于为服务器和备用计算机设置子网掩码为255.255.255.0的静态IP。

祝好运!

编辑:

@Khrystoph在回答中谈到了这一点


如何提高速度?你能解释一下你的答案吗?
AL

1
这可能会提高速度,因为您不必担心中间网络会使您的速度降低。关于“典型”与“交叉”以太网电缆-1Gb以太网将根据需要自动交叉。HP以太网交换机将以100Mb的速度执行此操作。其他品牌通常不会,如果卡在100Mb,则需要分频器。
Dan Pritts 2015年

1

一些人建议您跳过ssh,因为加密会使您变慢。现代CPU实际上可能足够快,达到1Gb,但是OpenSSH的内部窗口实现存在问题,可能会大大降低您的速度。

如果要使用ssh进行此操作,请查看HPN SSH。它解决了窗口问题,并添加了多线程加密。不幸的是,您将需要在客户端和服务器上都重建ssh。


0

好的,我尝试为两台彼此“靠近”的“非常大的管道”(10Gbe)的计算机回答这个问题。

您在这里遇到的问题是:由于管道太大,因此大多数压缩都会使cpu成为瓶颈。

传输10GB文件的性能(6 Gb网络连接[linode],不可压缩的数据):

$  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

在10 Gbe上的两个盒子,稍旧版本的netcat(CentOs 6.7),10GB文件:

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)

因此,在一个实例中,netcat使用的cpu较少,在另一个实例中,netcat的使用较少,因此YMMV。

使用netcat,如果它没有“ -N -q 0”选项,则可以传输被截断的文件,请注意...其他选项,例如“ -w 10”,也可能导致被截断的文件。

在几乎所有这些情况下,正在发生的事情是CPU利用率最高,而不是网络利用率最高。 scp最大速度约为230 MB / s,将一个内核固定在100%的利用率下。

不幸的是,Iperf3创建损坏的文件。某些版本的netcat似乎无法传输整个文件,这很奇怪。特别是它的旧版本。

“ gzip作为通往netcat的管道”或“ mbuffer”的各种说法似乎也使gzip或mbuffer的cpu发挥到了最大,因此并没有导致使用如此大的管道更快地进行传输。lz4可能会有所帮助。另外,我尝试的某些gzip管道内容导致非常大(> 4 GB)文件的传输损坏,因此请小心:)

特别对于更高的延迟(?)可能有用的另一件事是调整tcp设置。以下是提及建议值的指南:

http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htmhttps://fasterdata.es.net/host-tuning/linux/(从另一个答案中)可能是IRQ设置:https : //fasterdata.es .net / host-tuning / 100g-tuning /

来自linode的建议,添加到/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 

此外,他们希望您运行:

 /sbin/ifconfig eth0 txqueuelen 10000 

调整后值得仔细检查,以确保更改也不会造成损害。

也可能值得调整窗口大小:https : //iperf.fr/iperf-doc.php#tuningtcp

使用较慢的连接,压缩绝对可以帮助您。如果管道很大,那么非常快的压缩可能会帮助您轻松压缩数据,而没有尝试过。

“同步硬盘驱动器”的标准答案是使文件同步,从而避免可能的传输。

另一个选择:使用“ parallel scp”(以某种方式或其他方式),那么它将使用更多的内核...

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.