tar cvzf xxx.tgz が遅い。
ボトルネックがgzipであれば、gzip を変えればいい。pigzというちょうどいいコマンドがある。
tar コマンドとパイプを見直して、gzip の箇所をpigzに置き換えていきたい。
2通りの方法
選択肢は2つある。
- パイプを使う場合
- パイプを使わない場合 (tar オプションで解決する)
最初はパイプを見ていく。よく使われるtar とパイプの組み合わせ tar xxx | commpression
次に、tar オプションで、 --use-compress-program="pigz -9"
を使ってパイプを使わない方法を見ておく。
よく使われるtar
最初にtar のコマンドを確認しておく
むかしから使われるtar コマンドは、次のとおりだと思う。
私が初心者の頃からよく見かけたtarコマンドが次の通り。
通常のtar (gzip コマンド)
mnt フォルダをファイルに保存。
tar cvzf out.tar.gz ./mnt
パイプつきの通常のtar
tar cvzf - ./mnt | cat - > out.tar.gz
圧縮有・無圧縮
tar cvzf out.tar.gz ./mnt tar cvf out.tar ./mnt
パイプで圧縮
tar cvf - ./mnt | gzip - | cat - > out.tar.gz
pigz で圧縮を高速に
pigz がマルチプロセスで動作するので少し早い。gzipをpigzに変えてあげればいい
tar cvf - ./mnt | pigz - | cat - > out.tar.gz
verboseも外す
verboseすると、ファイル一覧が出力されて描画と一覧の転送である。SSH経由でSSHが遅いと、ファイル出力が終わっているのに表示終了を待って次のコマンドに移れない。
tar cf - ./mnt | pigz - | cat - > out.tar.gz
代わりにpv しておけば、残り容量がわかる。
# フォルダ使用量を確認 du -cksh ./mnt # pv しながら状況を見ておく tar cf - ./mnt| pv | pigz - | cat - > out.tar.gz
最終手段
面倒を考えるのが辛くなったら、 /usr/bin/gzip
自体を書き換えてしまえばいい。
mv /usr/bin/gzip /usr/bin/gzip.orig ln -s /usr/bin/pigz /usr/bin/gzip
これは、最終手段です。普段遣いLinuxデスクトップでやるには最速・最強の最終手段だと思います。
設定を忘れてパニックにならないように。自分だけの環境に留めておけば最速で単純で良いと思います。
最終手段もパイプも使わないで済むオプション
例えば次のようにすることで、パイプを使わずに済む
sudo tar -cvf out.tar.gz \ --use-compress-program="pigz -9" --one-file-system \ /var/www/html
--use-compress-program="pigz -9"
で pigz を指定する。
--one-file-system
はマウントを無視する
2024-08-27
use-compress-program のオプションについて言及。
ポエム
世の中すべてがpigz になればいいのに。。。
圧縮処理は「効率」を考えて使いますが、「効率」とはなんですか。
「効率」とは「ディスク消費量」のことだけではなく、「作業時間効率」でもあり、「CPU使用率」のこともあると思います。無人で圧縮するのならともかく、ディスクのバックアップなどダウンタイムを極力少なくしたいときには、「時間効率」もまた重要な要因だと思います。
人間の時間がいちばん高コストであり、一番貴重なのです。ある程度の圧縮率でCPUマルチスレッドを使い切って時間効率を追い求めてもいいのではないでしょうか。
use-compress-program は bzipが登場したあたり、2007年以降にサポートされて、2010 年頃にはすべてのディストリビューションのGNU tarコマンドで使えるようになったと思う。しかし、パイプで解決するのとgzipで事足りるのと、書籍やサンプルなどで紹介されてなかったりする。なのでgzipをpigzを書き換えてしまうのもありだと思う次第です。