Linux
shell
gzip

tarの圧縮は速いほうがいいよね

「tarでバックアップ取る運用はやめろよ」という愚痴はおいといて、tarは速い方がいいですよね。


Environment


  • CentOS Linux release 7.3.1611 (Core)


tarのzオプション

tarの zオプションは内部でgzipを呼んでいるだけだよね。

$ strace -f -e execve tar czf hoge.tgz ./apache-tomcat-9.0.14

execve("/bin/tar", ["tar", "czf", "hoge.tgz", "./apache-tomcat-9.0.14"], [/* 22 vars */]) = 0
Process 5717 attached
[pid 5717] execve("/usr/local/bin/gzip", ["gzip"], [/* 22 vars */]) = -1 ENOENT (No such file or directory)
[pid 5717] execve("/bin/gzip", ["gzip"], [/* 22 vars */]) = 0
[pid 5717] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=5717, si_status=0, si_utime=67, si_stime=2} ---
+++ exited with 0 +++


gzipの圧縮オプション

個人的な価値観では--bestより--fastがいいです。

gzipのmanページによると、GZIP環境変数があるらしい。

This  option can be set in the GZIP environment variable as in:

for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
for csh: (setenv GZIP -q; tar -xfz --block-compr /dev/rst0

tarにはgzipやbzip2の圧縮レベルオプションはないけど、この環境変数を使えばtarのzオプションで圧縮レベルを設定できるということですね。

$ time  tar czf hoge1.tgz ./apache-tomcat-9.0.14

real 0m0.662s
user 0m0.647s
sys 0m0.043s

$ export GZIP=-1
$ time tar czf hoge2.tgz ./apache-tomcat-9.0.14

real 0m0.549s
user 0m0.536s
sys 0m0.031s

$ du -sh apache-tomcat-9.0.14 hoge1.tgz hoge2.tgz
16M apache-tomcat-9.0.14
10M hoge1.tgz
11M hoge2.tgz

アーカイブ作成時間は速くなっています。やりぃ。

圧縮率が少々ぬるいのはトレードオプなので仕方がないですね。


もっと速くしたい

もっと速くアーカイブを作りたいなら、gzipよりlzopですよね。

lzopのmanをみるとLZOPというオプションがあるようだ。

The environment variable LZOP can hold a set of default options for lzop. These options are interpreted first

and can be overwritten by explicit command line parameters. For example:

for sh/ksh/zsh: LZOP="-1v --name"; export LZOP
for csh/tcsh: setenv LZOP "-1v --name"
for DOS/Windows: set LZOP=-1v --name

CentOS7のtarのmanページはないけど、--use-compress-programというオプションがあるようだ。

LZOP環境変数を設定して、lzopにてフィルタ圧縮をしてみる。

$ export LZOP="-1 --name"

$ time tar --use-compress-program=lzop -cf hoge-lzop.tar.lzo ./apache-tomcat-9.0.14

real 0m0.050s
user 0m0.028s
sys 0m0.024s

これは圧倒的な速さだ。

じゃあ、lz4でもいけるのかな、と思ったのだけど、lz4にはオプション設定する環境変数は見つからない。

とりあえずデフォルトモードで実行してみる。

$ time tar --use-compress-program=lz4 -cf hoge-lzop.tar.lz4 ./apache-tomcat-9.0.14

real 0m0.055s
user 0m0.037s
sys 0m0.019s

これも圧倒的な速さだ。

いろいろコマンドを組み合わせれるのは良いですね。