我们经常需要在机器之间传输文件。比如备份,复制数据等等。这个是很常见,也是很简单的。用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 10

可以看出来。在千兆网卡下,使用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倍!!

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

Linux大文件传输(转)相关推荐

  1. linux 传输大文件大小,Linux大文件传输(转)

    我们经常需要在机器之间传输文件.比如备份,复制数据等等.这个是很常见,也是很简单的.用scp或者rsync就能很好的完成任务.但是如果文件很大,需要占用一些传输时间的时候,怎样又快又好地完成任务就很重 ...

  2. Linux大文件传输工具分享

    sync--一个跨平台的文件传输工具,多用于Linux系统,下面也只介绍Linux上的应用. 这是我在远程传输大文件时找到的最有效便捷的"可断点重传"的工具,最大的优势就是可断点重 ...

  3. Linux、Windows都适用的跨国传输、大文件传输软件:飞驰传输

    随着"走出去"战略的实施,中国越来越多的企业走向国外,跨国企业将是大的潮流和趋势.跨国企业的分支机构遍及全球各地,员工来自多个国家,使用不同的语言.由于各地IT基础设施建设水平和使 ...

  4. 大文件传输软件的优势有哪些?-镭速传输

    互联网时代,大数据传输是企业面临的必不可免的问题,可以选择传统的FTP.网盘等方式来传输,对于小型文件或许是有优势的:但是对于大型文件数据的话,也许会出现传输速度慢,数据不可靠的情况,极大的影响了企业 ...

  5. 基于TCP的大文件传输c语言项目

    文章目录 前言:功能实现 tcp文件传输的基本过程: 1.用户登录 1.1创建数据库 2.文件普通下载和上传的实现: 2.1 普通下载 2.2 普通上传 2.3 文件秒上传的实现 2.断点下载和断点上 ...

  6. c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输

    一.项目要求 Please choose one of following programing languages: C, C++, Java, Python; 本项目采用的是python3.6 L ...

  7. 邮箱附件、QQ、微信等社交工具大文件传输解决方案

    工具说明:适用于邮箱附件.QQ.微信.钉钉.网盘等场景的大文件分割存储和传输. 下载地址:https://download.csdn.net/download/hj960511/85012515 作者 ...

  8. java rmi 文件传输_JAVA-RMI实现大文件传输

    在使用java-rmi的过程中,必然会遇到一个文件上传的问题,由于在rmi中无法传输文件流(比如rmi中的方法参数不能是FileInputStream之类的),那么我们只好选择一种折中的办法,就是先用 ...

  9. window 与 linux 之间文件传输

    window 与 linux 之间文件传输 linux 上安装工具 安装命令:yum install lrzsz 1.linux to windows sz filename 2.windows to ...

最新文章

  1. Effective java 43返回零长度的数组或者集合而不是null
  2. 美军称五角大楼遭网络袭击 2.4万份敏感文件被盗
  3. source insight(SI)C/C++符号标记含义
  4. tf.train.exponential_decay
  5. python数据展示平台_Python获取各大地图平台经纬度数据,哪家的数据最准确?
  6. 【jQuery】手机验证码倒计时效果
  7. android web3j 代币查询_Android通过web3j以太坊智能合约交互
  8. PaperNotes(15)-图神经网络、PyG极简版入门笔记
  9. python使用md5加密_如何使用Python创建自己的加密货币
  10. windows下ping命令的结果前加上系统的当前时间
  11. 360解压电脑版安装包_鲁大师电脑版2020下载-鲁大师pc版安装包exe下载v6.1020.3005.1020 官方最新版...
  12. 如何在Visual Studio 2012中撤消“范围到此”?
  13. Hue中Sqoop导数报错Could not load db driver class: com.mysql.jdbc.Driver
  14. 二次量子化与量子计算化学
  15. uniapp app 腾讯云 IM 通讯 UserSig 加密协议方案
  16. android 触摸接口,Android 多点触摸接口
  17. 使照片带有妙的电影色彩55款工具套件的lr微妙的电影调色预设
  18. linux下搜索文件名,Linux系统中怎么搜索文件命令大全
  19. 1 软件需求的本质(1)
  20. 从开发者的角度比较Kubernetes和Cloud Foundry

热门文章

  1. windows开启ssh当跳板机
  2. 天津理工大学c语言实验2答案,天津理工大学-c语言上机报告2.doc
  3. php判断邮箱是否合法性,php验证邮箱地址合法性
  4. 透过源码详解Spring Security 初始化流程
  5. Elasticsearch之分词
  6. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)
  7. python中的turtle函数_1.常用turtle功能函数
  8. matlab 二阶非线性微分方程组,二阶非线性常微分方程的打靶法matlab实现.doc
  9. 计算机安装两个键盘会怎样,外设门诊:一个键盘能否连接两个接收器?
  10. c++ 构造函数析构函数 数据安全_C++知识点 16:构造函数和析构函数的语法