使用tar+lz4/pigz+ssh更快的数据传输
使用tar+lz4/pigz+ssh更快的数据传输
-- | :41分类:Linux,MySQL |
前面一篇介绍了如何最大限度的榨取SCP的传输速度,有了这个基础,就可以进一步的使用压缩来加速传输速度了。只使用scp,传输速率最快约90MB,本文通过压缩将把最快传输速率提升到约250MB/s(包括解压的过程)。 目录 [hide]
. 结论
. 关于lz4
. 性能环境说明
3.1 磁盘读取和落盘
3.2 打包、拆包
3.3 压缩、解压缩
3.4 传输
3.5 整体流程
. 实验测试
4.1 分析
. lz4参数测试
. 为什么不用nc
. 还能不能更快
附录
参考阅读
. 结论
使用tar+lz4+ssh的方式能够获得最大的传输性能: time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 \
-o"MACs umac-64@openssh.com" .xxx.xxx. "lz4 -d |tar -xC /u01/backup_supu"
.91GiB :: [ 249MiB/s] real 0m16.067s
user 0m15.553s
sys 0m16.821s
249MB/s,妥妥的。是最原始scp(40MB/s)的6倍,原来400GB传输需要约3小时,现在只需要27分钟了。 注1:lz4在解压方面的优异表现,使得他在本案例中非常重要。如果无需解压的传输,则可以考虑使用pigz/pbiz2 注2:使用pv观察,网络流量约80MB,所以使用nc替换ssh并不会有明显的性能提升 注3:lz4压缩使用-B4(64KB块大小),解压使用-B7(4MB块大小),是本案例的测试最优值 . 关于lz4
lz4是一个让"人见人爱、花见花开"的压缩算法,能够在多核上很好的扩展,压缩速度和压缩比并没有太大优势(pigz),但是他的解压速度非常惊人,本案例测试lz4的解压是gunzip的3倍(更多的对比测试)。因为压缩时高效的多核利用,再加上惊艳的解压,lz4已经在非常多重要场合使用了:Linux3.11内核实现了LZ4,并可以使用其压缩和解压kernel image HBase:Add an LZ4 compression option to HFile等等(参考)。 对于需要频繁压缩、实时快速解压的场景来说,lz4非常适合。 . 性能环境说明
这里使用同上一篇文章相同的两台主机环境:ping获得RTT是17ms;使用iperf测试带宽是115MB(参考附录); 整个过程有几个阶段:磁盘读取-->打包(tar)-->压缩-->传输-->解压缩-->拆包-->落盘 对应了的速度测试: 3.1 磁盘读取和落盘
磁盘读取(有page cache),能到3GB/s;磁盘写入约428MB: # dd if=./sendlog.tar of=/dev/null bs= count=
+ records in
+ records out
bytes (4.2 GB) copied, 1.33946 s, 3.1 GB/s # dd if=/dev/zero of=./x.zero.file bs= count=
+ records in
+ records out
bytes (4.3 GB) copied, 10.0306 s, MB/s
3.2 打包、拆包
打包和拆包速度都大于350MB/s: # time tar -cf sendlog.tar ./sendlog/
real 0m10.996s
# time tar -xf sendlog.tar
real 0m11.564s
3.3 压缩、解压缩
关于各个压缩工具的性能(压缩、解压、压缩率)已经有很多人做了比较,本文不做详细讨论,这里选择gzip/pigz lz4 bzip做本测试的比较: | input speed | output speed | rate | speed of decoder
pigz -p | .0MB/s | .2MB/s | 17.5% | MB/s
lz4 | .0MB/s | .2MB/s | 27.5% | MB/s
bzip2 | .9MB/s | .65MB/s | 13.1% | .6MB /s
压缩工具的比较测试参考:Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO 可以看到,lz4在压缩率上略微逊色(对比pigz),但是在解压速度上有这惊人的优势。 3.4 传输
前文介绍了scp,约90MB最快的传输速度。 3.5 整体流程
磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘
|->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
这里可以看到,解压是最大的瓶颈,使用在解压方面最有优势的压缩工具,能让传输获得最大速度。而lz4正是在解压效率方面有着巨大的优势。 按照上面lz4的测试,传输速度理论值为264MB/s(此时传输速度为264*27.3%=72MB),这也是本次测试的理论上限速度。 . 实验测试
使用lz4压缩传输: # time tar -c sendlog/|lz4|ssh -c arcfour128 \
-o"MACs umac-64@openssh.com" .xxx.xx. "lz4 -d |tar -xC /u01/backup_supu"
real 0m25.646s
real 0m25.911s
real 0m29.019s
测试三次,分别耗时26s、29s、.6s,传输的平均速度为:152MB/s,网络带宽占用约41.9MB/s。 使用pigz的压缩传输: # time tar -c sendlog/|pigz -p |ssh -c arcfour128 \
-o"MACs umac-64@openssh.com" .xxx.xx. "gzip -d|tar -xC /u01/backup_supu"
rreal 0m37.030s
real 0m25.911s
real 0m29.019s
测试三次,分别耗时37s、.2s、.6s,传输的平均速度为:.7MB/s,网络带宽占用约19.4MB/s。 对比发现,在压缩方面pigz与lz4并没有太大区别,但是lz4解压速度非常快,所以在这种需要立刻解压的场景下,lz4轻松胜出(bzip2这种就不需要测试了)。 4.1 分析
按照第二节中的理论分析,传输速度应该能到260MB,但是上面只有152MB/s,这说明,还有调优的空间。继续分析,看看瓶颈在哪儿: 使用pv工具观察到,tar+lz4有约70MB/s的输出: time tar -c sendlog/|lz4|pv > /dev/null
.02GiB :: [.8MiB/s] [ <=>]
比直接lz4输出,要慢了10%左右(lz约79MB/s)。 再加上一次网络ssh: time tar -c sendlog/|lz4|pv|ssh -c arcfour128 -o "MACs umac-64@openssh.com" .xxx.xxx. "cat - >/dev/null"
.02GiB :: [.9MiB/s] [ <=>]
比直接lz4输出,要慢了45%左右(lz约79MB/s);远端再加上解压和拆包,压缩后的传输速度就是41.9MB/s。为什么会下降,还不明了,作者也还没有想到有什么方法能够直接加速这样的管道传输,如果看客有什么建议,不妨分享,看看还能不能优化,继续提升速度。 至此,传输速度就能够到150MB/s。比最原始scp(40MB/s)要快了约4倍,原来400GB需要约3小时,现在只需要45分钟了。 . lz4参数测试
前面试验发现,整个流程中lz4压缩比预期的要慢45%左右,而这里区别仅仅是一个使用管道(pipe)、一个直接读取。这里尝试通过修改lz4块大小对比,是否有性能提升: lz4-with-different-block-size 测试命令: for i in `seq `; do time tar -c ./sendlog/|lz4 -B$i |pv > /dev/null ;done
.07GiB :: [.4MiB/s] [ <=>]
real 0m11.640s
user 0m10.375s
sys 0m4.308s
可以看到块大小为64KB的时候,lz的压缩速度有显著提升(%)。于是,我们在lz4新增参数-B4,看看是否能够提升性能: Bang!确实,传输性能提升到了约249MB/s: time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 \
-o"MACs umac-64@openssh.com" .xxx.xxx. "lz4 -d |tar -xC /u01/backup_supu"
.91GiB :: [ 249MiB/s] real 0m16.067s
user 0m15.553s
sys 0m16.821s
. 为什么不用nc
就不用它!!! * nc不比ssh快;如果压缩后传输,nc比ssh没有优势 * nc在脚本中不好调用,需要在两端执行命令 * nc需要一个额外的网络端口 * nc不加密 . 还能不能更快
本案例中,lz4解压缩的速度是264MB/s,这里能够达到249MB/s,应该还有一点点可以榨取,不过我已经没有招了。 附录
iperf的带宽测试: iperf -c .xxx.xx. -p -t
------------------------------------------------------------
Client connecting to .xxx.xx., TCP port
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ ] local .xx.xx. port connected with .xx.xx. port
[ ID] Interval Transfer Bandwidth
[ ] 0.0-30.0 sec 3.15 GBytes Mbits/sec iperf -s -p -m
------------------------------------------------------------
Server listening on TCP port
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ ] local .xx.xx. port connected with .xx.xx. port
[ ID] Interval Transfer Bandwidth
[ ] 0.0-30.0 sec 3.15 GBytes Mbits/sec
[ ] MSS size bytes (MTU bytes, ethernet)
参考阅读
* lz4@Google code * lz4's details * LZ4 Streaming Format * Quick Benchmark: Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO * lz4: Extremely Fast Compression algorithm 喜欢本文,那就收藏到:
使用tar+lz4/pigz+ssh更快的数据传输的更多相关文章
- 使用tar+pigz+ssh实现大数据的高效传输
以前我们跨主机拷贝大数据的时候,比如要拷贝超过100GB的mysql原始数据,我们通常的做法如下: 在源端打包压缩为tar.gz文件 采用scp或者rsync等方式拷贝到目标主机 在目标主机解压文件 ...
- tar+pigz+ssh实现大数据压缩传输
磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘 |->tar |->gzip |-&g ...
- lz4,pigz,gzip 3者比较
一.压缩(1.1)使用gzip进行打包:# time tar -zcf tar1.tar binlog*real 0m48.497suser 0m38.371ssys 0m2.571s (1.2)使用 ...
- php提供更快的文件下载
在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...
- 快速传输大数据(tar+lz4+pv)
快速传输大数据(tar+lz4+pv) 如果用传统SCP远程拷贝,速度是比较慢的.现在采用lz4压缩传输.LZ4是一个非常快的无损压缩算法,压缩速度在单核300MB/S,可扩展支持多核CPU.它还 ...
- 扯扯淡,写个更快的memcpy
写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: copying data ...
- 更快的memcpy
更快的memcpy 写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: co ...
- 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)
本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...
- 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...
随机推荐
- 深入理解Java中为什么内部类可以访问外部类的成员
内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, ...
- 两款工控控件对比评测:Iocomp和ProEssentials
对于程序员来说,要凭一己之力开发出漂亮逼真的工控仪表和工控图表是非常耗时间和精力的,那么使用专业的第三方控件就是不错的选择,不仅节约开发时间,降低了项目风险,最重要的是第三方控件写的程序更专业,工控图 ...
- vim配置python开发环境(转)
安装 因为许多Unix衍生系统已经预装了Vim,我们首先要确认编辑器是否成功安装: vim --version 如果已经安装了,你应该看到类似下面的文字: VIM - Vi IMproved 7.3 ...
- Java实现文件MD5加密
代码实现: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.s ...
- Android 使用 Gradle 多渠道打包
安卓开发完毕.对于一个开放应用而言,我们须要公布到不同的应用市场,同一时候我们也须要统计不同市场的用户下载量. (通过启动应用后获取不同市场apk中的不同值来区分) 以下用一个详细的实例来说明: 1. ...
- iOS 证书管理.p12文件不能导出
iOS证书不能导出p12文件: 首先要确认证书是从你这个电脑上制作生成的! 钥匙串-->我的证书--->右键,就可以导出了!
- 1、jQuery概述
JQuery基本功能 ① 访问和操作Dom元素 ② 控制页面样式 ③ 对页面事件的处理 ④ 大量插件在页面中的运用 ⑤ 与Ajax技术的完美结合 $(document).ready ...
- Redis源代码解析:13Redis中的事件驱动机制
Redis中.处理网络IO时,採用的是事件驱动机制.但它没有使用libevent或者libev这种库,而是自己实现了一个很easy明了的事件驱动库ae_event,主要代码只400行左右. 没有选择l ...
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- 默认权限umask
什么是umask? 当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,um ...