-C标志在scp中的作用是什么?


35

我总是使用rsyncscp以便从/向远程计算机复制文件。最近,我在scpman scp)手册中发现了该标志-C

 -C      Compression enable.  Passes the -C flag to
         ssh(1) to enable compression.

在发现此标志之前,我习惯于zipbefore和then scp

仅使用-Czip和解压缩是否一样有效?什么时候使用一个或另一个过程来加快传输速度?


2
我认为最好的方法是自己进行基准测试。使用scp -rvscp -Crv比较吞吐量。
cuonglm

3
这与问题完全无关,但是zip是非常“ windows”式的文件格式。使用本地linux软件操作linux机器时,几乎几乎不会看到或不需要它。tar用于目录卷起成一个文件,同时保留权限和姓名及,同时gzipbzip2xz等来压缩文件。tars的压缩经常,使得tar.gztar.xz在Linux档案常见的格式。我已经看到人们scp使用诸如这样的命令来进行自己的工作tar cvz directory | ssh machine 'cd somewhere; tar xz'
2015年

2
@Score_Under-Java也使用zip格式来打包.jar文件,因此在许多Linux服务器上仍广泛使用zip。
约翰尼

您可以Compression yes.ssh/config文件中放入文件,而不用在每次文件传输时都使用该选项。
Barmar 2015年

如果您确实想要速度,则可以避免使用SSH:unix.stackexchange.com/questions/227951/…–
rogerdpack

Answers:


22

永远不会有什么大的不同,但是在复制文件之前将其压缩会降低效率,因为不需要使用诸如zip可以封装多个文件的容器格式(例如tar),并且无法流式传输zip输入和输出(因此需要一个临时文件)。

使用gzip而不是在另一方面,zip应该是完全一样的,因为它就是ssh -C引擎盖下呢?除了gzip压缩自己更不是仅仅使用工作ssh -C


好的,我会检查是什么gzip。您的答案是否意味着这scp -rC可能是我拥有的最有效的解决方案?
Remi.b,2015年

1
您的答案不考虑-C压缩交互式协议流。您仅考虑数据。所以你的结论是错误的。看看我的回答
Martin Prikryl 2015年

由于成员目录位于末尾,因此@Celada Zip可以写入管道。但是,正如您所说,解压缩需要设法提取多个成员,因此无法从管道读取。
jrw32982支持Monica 2015年

20

-C标志启用SSH流的gzip压缩。

等效Accept-Encoding: gzip于HTTP。

标志的执行方式取决于您传输的数据类型:

  • 传输单个大文件时,性能几乎与传输前压缩文件的性能相同(忽略zip与gzip算法的效率)。

    但是-C,对于用户来说,使用它的工作量较小。

  • 传输大量小文件时,性能将不如传输前压缩文件。

    其背后的原因是,在每次文件传输之前,SCP服务器和客户端之间都存在交互通信(用于交换文件元数据,例如时间戳和权限)。因此,双方都必须稍等片刻,对方才能做出响应(等待时压缩无济于事)。这对于每个传输的文件来说都是浪费时间。浪费多少时间取决于连接的等待时间。最后,传输速度可能会变慢。

    当您传输单个压缩文件时,该通信仅发生一次。


8

它启用ssh中的gzip压缩(在scp下)。

慢速连接上,这将加快处理速度;在任何相当快速的连接(100Mbit或更快)上,压缩很可能会使处理速度减慢。

根据gzip(特别是gzip -6)是否比您选择的zip压缩级别更高或更低的效率,它会比zip效率更高或更低。


1
在我的特定情况下,我有一个相对较好的连接(我在校园里),但是我必须复制的文件夹非常大(442 .bin.txt文件超过100GB )。因此,您建议仅使用scp -r并且不使用-C标志,不使用zipgzip不是tar吗?
Remi.b

2
@ Remi.b:您可能必须同时对两种方法进行基准测试并看看。问题是,CPU的速度是否足以以比未经压缩的网络发送数据更快的速度压缩数据。因此,答案将取决于您的特定机器和网络。
Nate Eldredge,2015年

好吧,我得了+1点。感谢您的帮助
Remi.b,2015年

我注意到SSH本身似乎要占用一些CPU,有时会超出您的带宽最大值。不知道该怎么办...
rogerdpack '18

性能也取决于数据。复制本质上为零的文件将得到高度压缩。我在两台远程服务器之间有一个500Mb的链接,并且刚刚通过该链接以〜128-130MB / s(可能有一些scp压缩缓冲区限制)复制了一个包含所有零的50G文件(VMWare VMDK),仅花费了大约6-7分钟的时间。没有压缩,这将花费1:45个小时。您的里程会因数据的复杂性以及压缩的程度而异。
Topher
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.