目前很多应用场景中,出于各种考虑,使用了 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