zoukankan      html  css  js  c++  java
  • [转载]Linux大文件传输

    http://www.kuqin.com/linux/20120207/317913.html

    我们经常需要在机器之间传输文件。比如备份,复制数据等等。这个是很常见,也是很简单的。用scp或者rsync就能很好的完成任务。但是如果文件很大,需要占用一些传输时间的时候,怎样又快又好地完成任务就很重要了。在我的测试用例中,一个最佳的方案比最差的方案,性能提高了10倍。

    复制文件

    如果我们是复制一个未压缩的文件。这里走如下步骤:

    1. 压缩数据
    2. 发送到另外一台机器上
    3. 数据解压缩
    4. 校验正确性

    这样做会很有效率,数据压缩后可以更有效的利用带宽

    使用ZIP+SCP

    我们可以通过ZIP+SCP的组合实现这个功能。

    gzip -c /home/yankay/data | ssh yankay01 "gunzip -c - > /home/yankay/data"

    这条命令是将/home/yankay/data经过GZIP压缩,通过ssh传输到yankay01的机器上。

    data文件的大小是1.1GB,经过Zip压缩后是183MB,执行上面的命令需要45.6s。平均吞吐量为24.7MB/s

    我们会发现Scp也有压缩功能,所以上面的语句可以写成

    scp -C -c blowfish /home/yankay/data yankay01:/home/yankay/data

    这样运行效果是相同的,不通之处在于我使用了blowfish算法作为Scp的密匙算法,使用这个算法可以比默认的情况快很多。单单对与scp,使用了blowfish 吞吐量是62MB/s,不使用只有46MB/s。

    可是我执行上面一条命令的时候,发现还是需要45s。平均吞吐量还为24MB/s。没有丝毫的提升,可见瓶颈不在网络上。

    那瓶颈在哪里呢?

    性能分析

    我们先定义几个变量

    • 压缩工具的压缩比是 CompressRadio
    • 压缩工具的压缩吞吐是CompressSpeed MB/s
    • 网络传输的吞吐是 NetSpeed MB/s

    由于使用了管道,管道的性能取决于管道中最慢的部分的性能,所以整体的性能是:

    speed=min(NetSpeed/CompressRadio,CompressSpeed)

    当压缩吞吐较网络传输慢的时候,压缩是瓶颈;但网络较慢的时候,网络传输/吞吐 是瓶颈。

    根据现有的测试数据(纯文本),可以得到表格:


             压缩比    吞吐量    千兆网卡(100MB/s)吞吐量    千兆网卡吞吐量,基于ssh(62MB/s)    百兆网卡(10MB/s)吞吐量
    ZLIB    35.80%    9.6    9.6    9.6    9.6
    LZO    54.40%    101.7    101.7    101.7    18.38235294
    LIBLZF    54.60%    134.3    134.3    113.5531136    18.31501832
    QUICKLZ    54.90%    183.4    182.1493625    112.9326047    18.21493625
    FASTLZ    56.20%    134.4    134.4    110.3202847    17.79359431
    SNAPPY    59.80%    189    167.2240803    103.6789298    16.72240803
    NONE    100%    300    100    62   

    可以看出来。在千兆网卡下,使用QuickLZ作为压缩算法,可以达到最高的性能。如果使用SSH作为数据传输通道,则远远没有达到网卡可以达到的最佳性能。在百兆网卡的情况下,各个算法相近。对比下来QuickLZ是有优势的。

    对于不同的数据和不同的机器,可以得出不同的最佳压缩算法。但有一点是肯定的,尽量把瓶颈压在网络上。对于较慢的网络环境,高压缩比的算法会比较有优势;相反对于较快的网络环境,低压缩比的算法会更好。

    结论

    根据上面的分析结果,我们不能是用SSH作为网络传输通道,可以使用NC这个基本网络工具,提高性能。同时使用qpress作为压缩算法。

    scp /usr/bin/qpress yankay01:/usr/bin/qpress
    ssh yankay01 "nc -l 12345 |  qpress -dio > /home/yankay/data" &
    qpress -o /home/yankay/data |nc yankay01 12345

    第一行是将gpress安装到远程机器上,第二行在远程机器上使用nc监听一个端口,第三行压缩并传送数据。

    执行上面的命令需要2.8s。平均吞吐量为402MB/s,比使用Gzip+Scp快了16倍!!

    根据上文的公式,和自己的数据,可以绘出上面的表格,就可以选择出最适合的压缩算法和传输方式。达到满意的效果。如果是一个长期运行的脚本的话,这么做是值得的。

  • 相关阅读:
    三毛
    深复制和浅复制
    并发和并行
    PhotoKit保存图片到相册
    利用代码块
    Maven打包程序
    通过Nginx+Tomcat简单实现发布时不间断服务的提供
    C# java MD5加密方不一致问题
    SpringBoot读取配置值的方式
    Java8之集合排序
  • 原文地址:https://www.cnblogs.com/lovemdx/p/2893054.html
Copyright © 2011-2022 走看看