目前很多应用场景中,出于各种考虑,使用了 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
rsync 加快传输速度配置 rsync性能优化
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
数据同步--rsync
使用rsync进行两台或多台主机直接的数据同步
rsync数据同步