マルチコア時代の圧縮・解凍

圧縮解凍を行うときに、シングルスレッドじゃもったいないよね!
ということで、複数のCPUを使用して同時に圧縮・解凍を行う方法。

  • 対象が複数ある場合は、対象を分割して、普通のzipとかに投げる
  1. findで対象リスト化
  2. duやlsでサイズを取得
  3. サイズでsortする
  4. sortしたリストを、プロセッサー数に応じて分割(偶数奇数とかで同じサイズになるように分割)
  5. 分割したリストをgzipとかbzip2とかに投げる
  • pbzip2のようなコマンドを使う

pbzip2について
標準ではインストールされていないが、rpmパッケージはその辺にごろごろしています。
バージョン1.0.5以降でパイプからのデータ受けに対応。

tarと組み合わせて使うと、bzip2の高圧縮率で且つ比較的短時間でバックアップできたりします。(もちろん、CPU占有率が上がりますからほかの作業との兼ね合いに注意が必要ですけど)

たとえば、2CPUに絞って圧縮させた場合のCPUのグラフです。

見事なまでにきっかり使ってますねえ。



たとえばこんな使い方。

#tar -g home.snar -C / -c home |pbzip2 -c > /tar-bz2-backup/$(date '+%F_%H_%M_%S').tar.bz2

homeのバックアップ用です。

  • "-g"を使うことで、増分対応にして、homeをバックアップ。
  • 圧縮は、pbzip2に実行させることで、複数のCPUを稼働させる。
  • 日付、時刻でファイル名を決定

といった感じです。

Tasks: 142 total, 2 running, 140 sleeping, 0 stopped, 0 zombie
Cpu0 : 48.8%us, 2.6%sy, 0.0%ni, 48.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 52.5%us, 2.3%sy, 0.0%ni, 44.9%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 98.7%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st

                                                                                                                                      • -

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18356 root 16 0 96888 34m 876 S 303.3 1.7 12:39.96 pbzip2


もっとも、上記のままではCPUを目一杯使ってしまうので、オプションでCPU数を制限すると良いですね。