使用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更快的数据传输的更多相关文章

  1. 使用tar+pigz+ssh实现大数据的高效传输

    以前我们跨主机拷贝大数据的时候,比如要拷贝超过100GB的mysql原始数据,我们通常的做法如下: 在源端打包压缩为tar.gz文件 采用scp或者rsync等方式拷贝到目标主机 在目标主机解压文件 ...

  2. tar+pigz+ssh实现大数据压缩传输

    磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘 |->tar     |->gzip      |-&g ...

  3. lz4,pigz,gzip 3者比较

    一.压缩(1.1)使用gzip进行打包:# time tar -zcf tar1.tar binlog*real 0m48.497suser 0m38.371ssys 0m2.571s (1.2)使用 ...

  4. php提供更快的文件下载

    在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...

  5. 快速传输大数据(tar+lz4+pv)

    快速传输大数据(tar+lz4+pv)   如果用传统SCP远程拷贝,速度是比较慢的.现在采用lz4压缩传输.LZ4是一个非常快的无损压缩算法,压缩速度在单核300MB/S,可扩展支持多核CPU.它还 ...

  6. 扯扯淡,写个更快的memcpy

    写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: copying data ...

  7. 更快的memcpy

    更快的memcpy 写代码有时候和笃信宗教一样,一旦信仰崩溃,是最难受的事情.早年我读过云风的一篇<VC 对 memcpy 的优化>,以及<Efficiency geek 2: co ...

  8. 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)

    本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...

  9. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

随机推荐

  1. vc2005(visual studio)使用习惯记录

    来源:http://blog.csdn.net/zdl1016/article/details/6184549 前言:sourceinsight不支持显示utf-8的文件, 实在是一大遗憾!vim现在 ...

  2. [转]create a basic sql server 2005 trigger to send email alerts

    本文转自:http://blog.netnerds.net/2008/02/create-a-basic-sql-server-2005-trigger-to-send-e-mail-alerts/ ...

  3. linux之fork()函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  4. LeetCode56:Jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  5. 关于http协议session和cookie的理解

    http是无状态协议,不能够记录访问者的身份, 为了解决这一问题服务器端设置了session 浏览器端设置了cookie 这种机制 当浏览器第一次访问服务器的时候,服务器会判断是否有cookie的存在 ...

  6. vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。

    错误 MSB3721 命令 ”已退出,返回代码为 1. 解决办法:去掉yasm复选框,改为masm vs2017 自定义生成规则-编译汇编代码 VC++调用yasm编译汇编代码有三种方法:Custom ...

  7. MYSQL存储过程及事件

    关于mysql下的存储过程以及事件的创建 以下这个存储过程主要实现的功能就是查询表里面半年前的数据,假设有就存到文件.然后将数据删除. CREATE DEFINER = `root`@`localho ...

  8. 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...

  9. [IOS A] - 一些开源类库

    因 为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程 中用到的一些比较有用Objective- ...

  10. 剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数 ...