目前很多应用场景中,出于各种考虑,使用了 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
阅读(1186) | 评论(0) | 转发(0) |