最近在写一个linux备份的脚本,由于文件较大,导致压缩时间过长。于是简单了解了下几个压缩工具

   tar ,bzip2,gzip等都是常用的压缩工具,但是这些命令都只能工作在一个cpu下,即使服务器是多核cpu也无法同时工作在多个cpu上,然而pbzip2 正好解决了这个问题。

下面简单介绍下这个工具


  1. pbzip2 要求 bzip2 的版本在 1.0.5以上,所以在此之前先检查下机器上的bzip2的版本用  bzip2 -V 即可,如果低于这个版本那么需要先升级bzip2,从官方下载即可

http://www.bzip.org/

我下载的是最新版,1.0.6

tar zxf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make install PREFIX=/usr  (由于,原来的bzip就安装在/usr/bin 因此我直接覆盖)
bzip2 -V  (如果显示版本为1.0.6表示升级成功)
安装pbzip2,可以rpm安装,这里我选择源码安装
  1. 先去下载一个源码包 http://compression.ca/pbzip2/

  2. 我下载最新的 tar zxf pbzip2-1.1.8.tar.gz

tar zxf pbzip2-1.1.8.tar.gz
cd pbzip2-1.1.8
make
make install (没有报错的话基本就安装成功)
测试
  1. 用cat /proc/cpuinfo 先看下cpu核心个数,我这里是4*6=24个核

  2. 生成一个随机的4GB数据

dd if=/dev/urandom of=testdata.dat bs=4M count=1024
然后用pbzip2进行压缩,并用time命令查看时间


time pbzip2 -k testdata.dat
用bzip2进行压缩 用time命令查看时间
time bzip2 testdata.dat
(以下是结果16分5秒)
real    16m5.933s
user    15m54.647s
sys     0m8.081s
查看cpu工作状态(可以看到24个核心都在工作)

Cpu0  : 92.0%us,  4.0%sy,  0.0%ni,  4.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu1  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu2  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu3  : 99.7%us,  0.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu4  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu5  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu6  : 98.7%us,  1.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu7  : 34.4%us,  7.0%sy,  0.0%ni, 20.9%id, 36.8%wa,  0.3%hi,  0.7%si,  0.0%st

Cpu8  : 99.7%us,  0.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu9  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu10 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu11 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu12 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu13 : 96.3%us,  3.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu14 : 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu15 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu16 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu17 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu18 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu19 : 99.7%us,  0.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu20 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu21 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu22 : 99.7%us,  0.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu23 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

对比下时间

同样的文件,bzip2压缩时间是16.5分,pbzip2压缩时间是1.27分,速度有10倍之差

下面介绍下pbzip2的常用方法
  1. 压缩

pbzip2 -k file1 file2
解压缩
pbzip2 -dk file1 file2
tar中调用压缩
tar cf myfile.tar.bz2 -I pbzip2 file1 fileN dir_to_compress/
tar中调用解压缩
tar -xf eclipse.tar.bz2 -I pbzip2
常用选项和命令
  • -d 用于解压缩

  • -k 用于保留源文件

  • -I是–use-compress-prog(指定调用压缩程序)简略写法

  • b#, 块大小,#表示数字,单位是100k(默认900k)

  • -c, 输出到stdout

  • -f, 覆盖已存在的输出文件

  • -h, 输出帮助

  • -l, 最大可用处理器数量

  • -m#, 最大可用内存,单位MB,默认100MB

  • -p#, 处理器数量,默认自动检测,检测失败设置为2

  • -q, 安静模式,不输出处理信息

  • -r, 读取整个输入文件到内存,在各处理器间分开处理

  • -S#, 子线程栈大小

  • -t, 测试压缩文件的完整性

  • -v, 输出详细信息

  • -V, 输出pbzip2版本信息

  • -z, 压缩(默认启用)

  • -1, 设置BWT预处理块大小,单位100k,1压缩速度最快,但是压缩率最低。默认900k

  • –ignore-trailing-garbage=#, 是否忽略文件末尾对齐数据块(1忽略,0禁止)