当需要在机器之间传输400GB文件的时候,你就会非常在意传输的速度了。默认情况下(约125MB带宽,网络延迟17ms,Intel E5-2430,本文后续讨论默认是指该环境),scp的速度约为40MB,传输400GB则需要170分钟,约3小时,如果可以加速,则可以大大节约工程师的时间,让攻城师们有更多时间去看个电影,陪陪家人。

目录

  • 1. 结论
  • 2. 测试数据:加密算法和压缩的影响
  • 3. 关于是否启用压缩
  • 4. "压缩级别"对传输速度影响不大
  • 5. 测试数据:完整性校验算法MACs选择
  • 6. 参考阅读

1. 结论

声明:这里给出的测试数据不具有一般性,仅供参考。测试与数据本身特性有很大关系,本文使用InnoDB的redo log作为测试数据。

* 改变ssh加密算法,可以让速度更快;通常,越弱的加密算法,速度越快

通常压缩会降低scp速度,但这与数据类型有很大关系,对压缩率非常高的数据启用压缩,可以加速

* 压缩级别对传输效率影响很小

* 用于完整性校验的不同MAC( message authentication code)算法,对性能约有10%-20%的影响。

所以,简单尝试如下,让你的SCP速度double一下:

scp -r -c arcfour128 ...
scp -r -c aes192-cbc ...
scp -r -c arcfour128 -o "MACs umac-64@openssh.com" ...

注:启用压缩使用参数: -o "Compression yes"

2. 测试数据:加密算法和压缩的影响

这里对比了12种ssh中实现的加密算法和是否使用压缩的传输效率,测试文件使用的是InnoDB的1GB*4的日志文件(注意:不同类型的文件测试结果会很不同),这里纵坐标单位为MB/s,数据分为压缩传输和不压缩传输两组:

原始数据:scp_speed.txt

可以看到,不同加密算法传输速度相差很大;使用了压缩之后,速度下降很多,也看到不同加密算法加密后区别并不大。

3. 关于是否启用压缩

* 压缩只有在网络传输速度非常慢,以致于压缩后节省的传输时间大于压缩本身的时间,这时才有效果,所以是否启用压缩,需要实际测试

* 压缩比很低的数据,不要再启用压缩(例如已经压缩过的数据、视频等)

* 通常建议,传输前先压缩,而不是使用ssh的压缩;建议使用pigz/lbizp2等并行压缩工具

* 数据中大量重复、空洞,这类适合压缩的数据,可以尝试压缩选项,例如如下是一组,大量"空洞"数据的测试:

看到,压缩大大提高了传输效率

4. "压缩级别"对传输速度影响不大

最后一组对比是,将压缩级别从1改到9,对比传输速度,纵坐标单位MB/s,对12种加密算法分别使用了测试9个压缩级别,数据如下:

原始数据:

MB/s            with-compression  without-compressoin
3des-cbc 17.525 13.5
aes256-ctr 20.325 30.2
aes192-ctr 20.275 35.1
aes128-ctr 20.275 38.5
cast128-cbc 20.825 38.9
blowfish-cbc 20.8 43.1
arcfour 21.975 74.2
arcfour128 21.725 75
arcfour256 22.025 75.8
aes128-cbc 21.6 75.8
aes256-cbc 21.325 80.1
aes192-cbc 21.725 85.2

可以看到,压缩级别对传输影响较小。ssh使用的默认压缩级别是6。

5. 测试数据:完整性校验算法MACs选择

通过选项Macs可以设置对应的哈希算法,man ssh_config可以看到支持哪些哈希算法。这里对了比了12中加密算法下使用不用的完整性校验算法的性能情况:

看到,绝大数情况下"umac-64@openssh.com"(关于此哈希)性能都更好,所以建议尝试使用此哈希算法做验证,看看你的场景下速度是否与提升。也可以看到,默认的hmac-md5哈希在默认的加密aes128-ctr下表现比较好;

最新文章

  1. Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr
  2. iOS阶段学习第15天笔记(NSDate操作)
  3. 03Mybatis_mybatis框架原理——执行流程
  4. 【读书笔记】iOS网络-使用Bonjour实现自组织网络
  5. 匿名函数:Lambda表达式和匿名方法
  6. JSON和JS对象之间的互转(转)
  7. Servlet Study 1
  8. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用
  9. 苹果原生NSURLSession的上传和下载
  10. JVM如何理解Java泛型类(转)
  11. 如何使用通用Mapper
  12. [Silverlight] Visual Studio2010不能安装Silverlight4_Tools,提示语言不一致
  13. Android之进度条2
  14. bzoj 1014: [JSOI2008]火星人prefix hash && splay
  15. Code Snippet Library
  16. android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理
  17. 简化MonoTouch.Dialog的使用
  18. Mac OS 安装 Git 环境
  19. C++ 属性类
  20. [原][算法][earth]三段smooth,传入时间,返回距离。仿谷歌视角飞跃处理

热门文章

  1. C#基础知识 简单说明泛型的优点
  2. 关于一些常用的linux命令
  3. spring MVC上传附件
  4. 自学Zabbix3.7-事件Event
  5. Myeclipse Reload
  6. PHP是干什么用?
  7. 快速自检电脑是否被黑客入侵过(Linux版)
  8. SQL Server中varchar和nvarchar的区别
  9. 由于DG Broker的配置导致RAC某实例无法mount
  10. Webpack 2 视频教程 010 - 配置 ESLint 实现代码规范自动测试 (下)