ZFS compression algorithm lzjb, gzip, gzip-[0-9], zle, lz4 compare

1 minute read

背景

zfs提供几种压缩算法,   
lzjb, gzip, gzip-[0-9], zle, lz4  
其中默认的压缩算法为lzjb, 这个是ZFS的作者Jeff Bonwick提供的, gzip默认的压缩级别为6, 或者指定压缩级别.  
这里主要测试一下压缩时间和压缩比.  
注意, 压缩选项默认是关闭的, 压缩选项针对dataset来设置, 同一个pool中不同的dataset可以设置不同的压缩算法, 也可以开关混用. 对于未使用压缩的dataset, 如果已经存在数据的话, 开启压缩后, 之后的数据会压缩, 但是之前存储的数据不会变动.   
首先测试的是lzjb.  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# zfs set compression=lzjb zp/test  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:00:45  
2014-05-1916:01:00  15秒  
[root@spark01 digoal]# zfs get all zp/test|grep compress  
zp/test  compressratio         1.49x                  -  
zp/test  compression           lzjb                   local  
zp/test  refcompressratio      1.49x                  -  
测试gzip  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# zfs set compression=gzip zp/test  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:01:47  
2014-05-1916:02:02  15秒  
[root@spark01 digoal]# zfs get all zp/test|grep compress  
zp/test  compressratio         1.77x                  -  
zp/test  compression           gzip                   local  
zp/test  refcompressratio      1.77x                  -  
测试gzip-9  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# zfs set compression=gzip-9 zp/test  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:03:01  
2014-05-1916:03:18  17秒  
[root@spark01 digoal]# zfs get all zp/test|grep compress  
zp/test  compressratio         1.59x                  -  
zp/test  compression           gzip-9                 local  
zp/test  refcompressratio      1.59x                  -  
测试zle  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# zfs set compression=zle zp/test  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:03:47  
2014-05-1916:04:04  17秒  
[root@spark01 digoal]# zfs get all zp/test|grep compress  
zp/test  compressratio         1.09x                  -  
zp/test  compression           zle                    local  
zp/test  refcompressratio      1.09x                  -  
测试lz4  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# zfs set compression=lz4 zp/test  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:04:25  
2014-05-1916:04:39  14秒  
[root@spark01 digoal]# zfs get all zp/test|grep compress  
zp/test  compressratio         1.43x                  -  
zp/test  compression           lz4                    local  
zp/test  refcompressratio      1.43x                  -  
不压缩的情况测试 :   
[root@spark01 digoal]# zfs set compression=off zp/test  
[root@spark01 digoal]# rm -rf /zp/test/*  
[root@spark01 digoal]# date +%F%T; cp -r hadoop-2.4.0* spl-0.6.2* zfs-0.6.2* /zp/test/ ; date +%F%T;  
2014-05-1916:09:19  
2014-05-1916:09:38  19秒  
  
从测试结果来看, gzip6的压缩比最高, 同时时间也比较折中, 推荐使用.  
另外作者的算法lzjb也是被大多数人推荐使用的.  
建议所有的dataset都开启压缩, 从测试数据来看, 显然CPU不是问题, IO是大问题. 因为未开启压缩的情况下, 耗时是最长的.  

参考

1. https://pthree.org/2012/12/18/zfs-administration-part-xi-compression-and-deduplication/

Flag Counter

digoal’s 大量PostgreSQL文章入口