Scp Accelerate scp 传输大文件
当需要在机器之间传输400GB文件的时候,你就会非常在意传输的速度了。默认情况下(约125MB带宽,网络延迟17ms,Intel E5-2430,本文后续讨论默认是指该环境),scp的速度约为40MB,传输400GB则需要170分钟,约3小时,如果可以加速,则可以大大节约工程师的时间,让攻城师们有更多时间去看个电影,陪陪家人。
###性能环境说明
整个过程有几个阶段:磁盘读取–>打包(tar)–>压缩–>传输–>解压缩–>拆包–>落盘 对应了的速度测试:
####磁盘读取和落盘
dd if=./sendlog.tar of=/dev/null bs=4096 count=1048576
dd if=/dev/zero of=./x.zero.file bs=4096 count=1048576
####打包、拆包
time tar -cf sendlog.tar ./sendlog/
time tar -xf sendlog.tar
####压缩、解压缩
压缩工具的比较测试参考:[Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO](http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Compression_time)
可以看到,lz4在压缩率上略微逊色(对比pigz),但是在解压速度上有这惊人的优势。
time tar -c sendlog/|lz4|pv > /dev/null
time tar -c sendlog/|lz4|pv|ssh -c arcfour128 -o "MACs umac-64@openssh.com" 10.xxx.xxx.36 "cat - >/dev/null"
for i in `seq 4 7`; do time tar -c ./sendlog/|lz4 -B$i |pv > /dev/null ;done
time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 -o"MACs umac-64@openssh.com" 10.xxx.xxx.36 "lz4 -d |tar -xC /u01/backup_supu"
####传输
scp####整体流程
磁盘读取—->打包—->压缩——>传输—->解压缩–>拆包—->落盘 |->tar |->gzip |->ssh |->gzip |->tar |->bzip2 |->http |->bzip |-> … |->nc |->… |->lz4 |->lz4
400MB/s >350MB/s 79MB/s 90MB/s 72MB/s >350MB/s >400MB/s
###可能的影响因子
-
改变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" ...
###测试
####加密算法
对比 12 种 ssh 中实现的加密算法传输效率
####压缩
主要是两个因素 压缩算法和压缩比,对比不同的压缩算法和压缩比的传输效率
- 压缩只有在网络传输速度非常慢,以致于压缩后节省的传输时间大于压缩本身的时间,这时才有效果,所以是否启用压缩,需要实际测试
- 压缩比很低的数据,不要再启用压缩(例如已经压缩过的数据、视频等)
- 通常建议,传输前先压缩,而不是使用ssh的压缩;建议使用pigz/lbizp2等并行压缩工具
- 数据中大量重复、空洞,这类适合压缩的数据,可以尝试压缩选项
####混合
对比加密算法和压缩同时使用与前两种的传输效率
time tar -c sendlog/|lz4|ssh -c arcfour128 -o"MACs umac-64@openssh.com" 10.xxx.xx.36 "lz4 -d |tar -xC /u01/backup_supu"
对比发现,在压缩方面pigz与lz4并没有太大区别,但是lz4解压速度非常快,所以在这种需要立刻解压的场景下,lz4轻松胜出(bzip2这种就不需要测试了)。
###总结
####关于lz4
lz4是一个让”人见人爱、花见花开”的压缩算法,能够在多核上很好的扩展,压缩速度和压缩比并没有太大优势(pigz),但是他的解压速度非常惊人,本案例测试lz4的解压是gunzip的3倍(更多的对比测试)。因为压缩时高效的多核利用,再加上惊艳的解压,lz4已经在非常多重要场合使用了:Linux3.11内核实现了LZ4,并可以使用其压缩和解压kernel image HBase:Add an LZ4 compression option to HFile等等(参考)。
对于需要频繁压缩、实时快速解压的场景来说,lz4非常适合。
####结论
time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 -o"MACs umac-64@openssh.com" 10.xxx.xxx.36 "lz4 -d |tar -xC /u01/backup_supu"
####参考
http://www.neuhalfen.name/2009/02/04/scp_performance_gain_by_using_right_algorithm/