目前很多应用场景中,出于各种考虑,使用了 scp  或者 rsync+ssh 的方式进行数据传输。但是一直都使用缺省选项,很少进行优化。我在内部数据同步时,也长期使用了缺省选项,后来碰到几百G到几个T的数据同步,不得不考虑到带宽和效率问题,决定进行一些简单优化。

经过一个快速的简单测试,可以明显看到:建立ssh数据通道进行传输时,缺省使用的加密方式(3des-cbc为缺省优先选择加密算法)和指定arcfour(在openssl中为rc4)的传输速率相差很大,是否使用压缩参数也差异显著,大概有5倍左右的传输速率差异。因此有必要对scp或者rsync+ssh数据传输的参数进行调整。我的最终调整结果如下:
    rsync -apur --partial -e "ssh -p 22 -c arcfour"  SRC  DEST

scp -P 22 -c arcfour  SRC  DEST

其中数字22为ssh服务监听端口号,可以根据实际情况变更。大多数情况下服务器内都是缺省22端口的,同时在比较新的GNU/Linux Distros如RHEL5U4、CentOS 5.2里边rsync缺省已经设置—rsh=ssh,因此可以省略-e选项中的[-p 22]部分。但是为了完整起见,请尽量不要省略此参数。

我之前给过的命令行参数是:
    rsync -azpur --progress -e "ssh -p 22"  SRC DEST

请取消如下参数:
-z压缩选项,避免浪费CPU解压缩计算资源。对于已经压缩过或者可压缩性很低的文件就不要使用此选项了。对于纯文本或者有高压缩率的文件可以考虑使用。但建立ssh加密通道时最好是别用了。鉴于目前大多数情况下的数据传输的实际使用场景,建议不要使用-z压缩选项。

-v和--progress选项是适合于交互使用或者需要日志统计的情况,可以随时观察进度;对于后台执行的可以忽略不要。
 
ssh的cipher可用算法列表,同时也是缺省使用次序:3des-cbc, aes128-cbc, aes192-cbc, aes256-cbc, aes128-ctr, aes192-ctr, aes256-ctr, arcfour128, arcfour256, arcfour, blowfish-cbc, andcast128-cbc

寻找最快的加密算法的方法,用于选择ssh的fastest cipher参数:openssl speed或者openssl speed aes rc4 blowfish

执行openssl speed后一般结果类似如下,可见在ssh可用cipher范围内rc4即arcfour是最快的:

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md2               1384.62k     2981.03k     4037.40k     4448.60k     4575.00k
mdc2                 0.00         0.00         0.00         0.00         0.00
md4              19895.28k    70035.88k   203554.99k   391295.91k   534844.76k
md5              16912.29k    56978.09k   150375.42k   255405.33k   327666.35k
hmac(md5)        26742.97k    78918.78k   186822.66k   280025.22k   328025.64k
sha1             16956.33k    52774.93k   131750.61k   205110.95k   242145.72k
rmd160           13317.83k    38738.54k    82252.89k   114359.03k   132024.56k
rc4             137556.45k   145273.47k   150050.62k   145494.07k   145716.57k
des cbc          31621.27k    32913.00k    33047.81k    33397.71k    33357.82k
des ede3         12143.84k    12626.01k    12332.40k    12461.16k    12394.50k
idea cbc             0.00         0.00         0.00         0.00         0.00
rc2 cbc          19102.94k    19044.85k    19397.97k    19251.20k    19304.27k
rc5-32/12 cbc        0.00         0.00         0.00         0.00         0.00
blowfish cbc     63417.48k    65578.21k    67336.11k    67362.53k    67982.71k
cast cbc         50512.07k    53306.26k    53302.70k    53730.30k    53770.55k
aes-128 cbc      88831.05k    96848.85k    99854.93k    98875.39k    97495.69k
aes-192 cbc      80169.20k    83880.75k    84916.82k    86935.21k    86690.96k
aes-256 cbc      71787.50k    74987.33k    75160.83k    74983.00k    75999.91k
sha256           10791.78k    27241.64k    50905.39k    66458.28k    73566.89k
sha512            7165.80k    28350.70k    57986.65k    93516.37k   113161.19k

sign    verify    sign/s verify/s
rsa  512 bits 0.000314s 0.000023s   3185.2  43532.5
rsa 1024 bits 0.001162s 0.000062s    860.5  16111.0
rsa 2048 bits 0.006553s 0.000185s    152.6   5406.7
rsa 4096 bits 0.040898s 0.000606s     24.5   1649.5

sign    verify    sign/s verify/s
dsa  512 bits 0.000200s 0.000228s   5007.7   4387.9
dsa 1024 bits 0.000550s 0.000666s   1817.1   1501.3
dsa 2048 bits 0.001709s 0.002058s    585.2    486.0

执行openssl speed aes rc4 blowfish后一般结果类似如下:
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
rc4             133412.22k   143452.66k   144250.16k   147214.38k   145713.39k
blowfish cbc     63015.38k    65686.18k    65891.08k    68284.76k    67544.54k
aes-128 cbc      91761.54k    97438.66k    94242.07k    95801.94k    94533.98k
aes-192 cbc      79059.61k    83866.89k    84766.83k    82777.51k    86793.26k
aes-256 cbc      71811.05k    76131.73k    75018.97k    75897.11k    77007.53k

还有其他参数是可以再进行调优的,比如--block-size。有兴趣的同学可以参考我提供的思路和命令行进行扩展,继续测试并优化。如果将来有机会,还可以使用ssl硬件卡和给openssh加上HPN补丁,留待以后再细述了。

测试传输时生成的文件方法:

1、生成高可压缩文件:
dd if=/dev/zero of=bigfile.dat bs=1M count=100

2、生成不可压缩文件:
dd if=/dev/urandom of=bigfile.dat bs=1M count=100

dd if=/dev/zero of=/tmp/bigfile.dat bs=1M count=100; shred -v -n3 /tmp/bigfile.dat

我测试过程当中使用的若干完整命令行,仅供参考:
生成不可压缩测试文件:
time (dd if=/dev/zero of=bigfile.dat bs=1M count=100; shred -v -n3 /tmp/bigfile.dat)

不同算法不压缩传输速率测试:
set -x; for cipher in none 3des-cbc aes128-cbc aes256-cbc arcfour blowfish; do rm -f /tmp/bigfile.dat; rsync -apur --stats --progress -e "ssh -c ${cipher}" bigfile.dat localhost:/tmp/; sleep 3; done; set +x

不同算法压缩传输速率测试:
set -x; for cipher in none 3des-cbc aes128-cbc aes256-cbc arcfour blowfish; do rm -f /tmp/bigfile.dat; rsync -zapur --stats --progress -e "ssh -c ${cipher}" bigfile.dat localhost:/tmp/; sleep 3; done; set +x

不同算法不同传输块大小不压缩传输速率测试:
for i in 1 2 3; do for SIZE_BLOCK in 8 16 32 64 126 256 1024 2048 4196 8192; do rm -f /tmp/bigfile.dat; echo "---------->${SIZE_BLOCK}<----------"; time rsync -apur --block-size=${SIZE_BLOCK} --stats --progress -e "ssh -c arcfour" bigfile.dat localhost:/tmp/; sleep 3; done; done

不同算法不同传输块大小压缩传输速率测试:
for i in 1 2 3; do for SIZE_BLOCK in 8 16 32 64 126 256 1024 2048 4196 8192; do rm -f /tmp/bigfile.dat; echo "---------->${SIZE_BLOCK}<----------"; time rsync -zapur --block-size=${SIZE_BLOCK} --stats --progress -e "ssh -c arcfour" bigfile.dat localhost:/tmp/; sleep 3; done; done

转载于:https://blog.51cto.com/floss/138088

数据传输优化篇之:scp 或 rsync+ssh 参数优化相关推荐

  1. MySQL-索引优化篇(2)_使用索引扫描来优化排序

    文章目录 生猛干货 官方文档 使用索引扫描来优化排序 索引的列顺序和Order By子句的顺序完全一致 索引中所有列的方向(升序.降序)和 order by子句完全相同 order by中的字段全部在 ...

  2. mysql 优化300例_MySQL配置文件my.cnf参数优化和中文详解

    Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的 ...

  3. Mysql优化系列(1)--Innodb重要参数优化

    1.简单介绍 InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特 ...

  4. Mysql优化系列(1)--Innodb重要参数优化(转)

    原创作者:https://www.cnblogs.com/kevingrace/p/6133818.html 1.简单介绍 InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACI ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  6. android 优化启动事件,张绍文android开发高手课读书笔记4-启动优化篇

    启动优化篇 在说如何对启动时间进行优化之前,我们得先知道从用户点击应用图标开始,一共经历了那些阶段. 主要阶段如下图. image T0-T1阶段 这个阶段是手机系统解析点击事件,效应快慢跟手机性能有 ...

  7. android开发 解析 b5,张绍文android开发高手课读书笔记4-启动优化篇

    启动优化篇 在说如何对启动时间进行优化之前,我们得先知道从用户点击应用图标开始,一共经历了那些阶段. 主要阶段如下图. image T0-T1阶段 这个阶段是手机系统解析点击事件,效应快慢跟手机性能有 ...

  8. 2011 DB2著作---舞动DB2系列之设计优化篇隆重问世!

    舞动DB2系列丛书简介: 舞动DB2系列丛书是王飞鹏等人编写的数据库系列著作,包括: 设计优化篇---<DB2设计与性能优化---原理.方法与实践> 应用开发篇---<从Oracle ...

  9. java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择

    JAVA虚拟机JVM优化重要性,昨天JAVA虚拟机JVM参数优化(1)文章中已经描述,今天我们来讨论JAVA虚拟机在不同性能要求下如何选择三种垃圾收集算法. JVM内部结构如下图所示: 串行收集用于单 ...

最新文章

  1. qt获取当前系统音量值_Qt编写自定义控件50-迷你仪表盘
  2. 2020大部分知名公司Java面试题(一)
  3. 管理距离 路由与交换_动态路由选择原理(距离矢量路由协议RIP)
  4. 利用 squid 反向代理提高网站性能
  5. XCTF WEB backup
  6. 华容道游戏开发--android小组
  7. python二维列表做参数_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
  8. MongoDB基本应用操作整理
  9. Mariadb升级到mysql_mariadb的版本升级方法
  10. LeetCode(121)——买卖股票的最佳时机(JavaScript)
  11. 基于matlab的16QAM调制解调仿真
  12. 原子结构示意图全部_原子结构示意图大全
  13. C#窗体-个人简历生成(自己设计并编写一个 Windows 应用程序,要求用到TextBox、GroupBox、RadioButton )
  14. 含泪整理最优质美食壁纸素材,你想要的这里都有
  15. 数据结构与算法学习(第九天)(系列结束)
  16. JAVA spring定时任务
  17. 单片机如何烧录程序?单片机的下载方式讲解
  18. 宇视NVR录像机,录像下载过程中,查询录像搜索列别里面为空
  19. springboot配置文件不生效的原因
  20. Lua 打印table、ngx.say table

热门文章

  1. php实现无限级树型菜单(函数递归算法)
  2. 一个真实的案例———HPUX调整LUN大小识别更改
  3. Eclipse最新插件的下载地址大全[收集整理] zt
  4. C语言文件指针的基本函数介绍包含了fpoen、fclose、fgetc、fputc、fscanf、fprintf、fgets、fputs、fread、fwrite函数以及文件定位函数.
  5. 谷歌pay服务端文档_Google pay 服务器验证
  6. Jetty 与 Tomcat
  7. 收获,不止SQL优化——抓住SQL的本质--第三章
  8. PHP重建索引数组的键值
  9. 基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群
  10. 看面试题感觉生疏的知识点