試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GNU/Linuxにおける一部の圧縮/伸長ツール群のマルチコアCPU対応状況(2010/11/15現在)

一般的に、マルチコアCPU環境でマルチ(コア)CPU対応のOSを用いると、CPUの速度がネックになっている処理についてマルチスレッドで処理をするとスレッドが増える分だけ複数のコアに処理が振り分けられてCPU資源が効率良く使われ、高い処理性能を出すことができる(ディスクアクセスやネットワークのデータ転送がネックなら性能は上がらない)。
今回、圧縮を行うプログラムの内、GNU/Linuxで動作するものについて幾つかの対応状況を調べてみた。

  1. pbzip2: 複数コア対応
  2. XZ Utils: 将来的に複数コア対応予定?
  3. p7zip: 2コアまで使用?
  4. Squashfsのツール: 複数コア対応
  5. 関連:libx264を用いたH.264のエンコード

pbzip2: 複数コア対応

雑多な圧縮ツールについて(前半)」でも書いたpbzip2はbzip2圧縮をマルチスレッドで行うもので、手元のAthlon II X3 445(3コアCPU)では自動的にコアが3つとも使われて処理が行われた。

XZ Utils: 将来的に複数コア対応予定?

バージョン5.0.0の正式版が出ているのでmanページを見てみたが
[引用]ファイル名: xz-5.0.0/doc/man/txt/xz.txt より

       -T threads, --threads=threads
              Specify the number of worker threads to use.  The actual  number
              of  threads can be less than threads if using more threads would
              exceed the memory usage limit.

              Multithreaded compression and decompression are not  implemented
              yet, so this option has no effect for now.

              As  of  writing  (2010-09-27), it hasn't been decided if threads
              will be used by default on multicore systems  once  support  for
              threading has been implemented.  Comments are welcome.  The com-
              plicating factor is that using many threads  will  increase  the
              memory  usage dramatically.  Note that if multithreading will be
              the default, it will probably be done  so  that  single-threaded
              and  multithreaded modes produce the same output, so compression
              ratio won't be  significantly  affected  if  threading  will  be
              enabled by default.

マルチスレッドによる圧縮/伸長は(オプション自体は用意されているものの)未実装のようで、また、複数スレッドを用いるとメモリ使用量が劇的に増えるとの問題もあり、マルチコアCPUのあるシステム上で標準でマルチスレッドでの処理が行われるようになるかどうかはまだ決まっていないようだ。

p7zip: 2コアまで使用?

p7zip(7zコマンド)は圧縮時にCPU使用率をtopなどで見ると200%(コア2つ分のCPU資源を目一杯使った状態)近くまではCPU使用率が上がるが、それよりも(コア3つ以上)使われることはないようだ。
後述のSquashfsファイルシステムにはLZMAアルゴリズムを用いることができ、ツールで書庫のように展開することが可能なので、多コアを活かすならそちらのほうがいいかもしれない。
なお、データ展開時には1コアのみしか用いないが、ファイルサイズが大きくても(CPUではなくむしろ)ディスクアクセスがネックになることやLZMAアルゴリズムの「圧縮は非常に遅いが伸長は比較的高速」という特性から、大きな問題にはならない。

Squashfsのツール: 複数コア対応

読み込み可能なファイルシステムとしてマウント可能なSquashfsのツール(ファイルシステム作成と中身の展開を行うもの)はバージョン4系の時点ではマルチスレッド実装になっており、3コアのAthlon II X3 445では自動的にコアが3つとも使われて処理が行われた。
LZMAアルゴリズムを用いると、非常に高い圧縮率で、かつCPUコアを最大限活かした高速な圧縮が行え、Linuxではこれを読み込み専用ファイルシステムとしてマウントすることもできる。マウントする使い方をしない場合でも、マルチコア対応の圧縮ツールとしては有用。

$ mksquashfs [圧縮したいファイルやディレクトリ...] [出力ファイル] (オプション...) -comp lzma

もちろん、-comp lzmaオプションを省略してgzip圧縮のファイルシステム作成を行うこともできる。

関連:libx264を用いたH.264エンコード

x264とその機能をまとめたライブラリlibx264を(MEncoderFFmpegから)用いて映像をH.264エンコードする場合、複数のスレッドを用いてエンコードを行って高速に処理することができる。
MEncoderでは-x264encoptsの「threads=[0(自動)から16まで]」指定で自動もしくは手動でスレッド数を指定できる(省略時はコア数に応じて自動でスレッド数が決まる)。FFmpegでは-threads [スレッド数]でスレッド数を指定できる(libx264固有オプションではない・既定では1コアのみ)。
x264コマンドでエンコードをする場合、スレッド数は--threads [スレッド数]オプションで指定できるが省略すると自動でコア数に応じたスレッド数になる。。
3コアのAthlon II X3 445ではMEncoderx264は3コア全てが使われた。

使用したバージョン:

  • pbzip2 1.0.5
  • XZ Utils 4.999.9beta, 5.0.0
  • p7zip 9.04
  • squashfs-tools 4.0