BSD界隈四方山話

第52回マルチコア対応のxz(1)で高速圧縮

FreeBSD 10.3-RELEASEには11-CURRENTに導入されたマルチスレッド対応のxz(1)コマンドがマージされています。マルチコア(マルチスレッド)のシステムで利用すると圧縮時間の短縮が期待できます。デフォルトでは有効になっていませんが、オプションを指定することで機能を有効にすることができます。今回はこの機能を紹介します。

マルチスレッド対応xz(1)コマンド

xz(1)はデータ圧縮コマンドのひとつです。現在ではFreeBSDで用意する配布物はxz(1)で圧縮されるようになっています。それはxz(1)コマンドが類似のツールと比較して圧縮率が高く、展開にかかる時間が高速だからです。配布物のようにサイズが小さく展開にかかる時間が短いほどよいというケースにおいて、xz(1)コマンドは適切な選択肢というわけです。

そのかわり、xz(1)コマンドは圧縮に時間がかかります。そこでFreeBSD 10.3-RELEASEに追加されたマルチスレッド機能です。今回導入されたのは圧縮時に複数のスレッド(コア)を利用するための機能で、圧縮時間の短縮化が見込めます。この手の処理はマルチコア/スレッドの高い効果が見込める部分です。

マルチスレッド対応のxz(1)では-Tオプションで利用するスレッドの数を指定します。FreeBSD 10.3-RELEASEではオプションなしで通常の処理、-T 2でスレッド数2個、-T 3でスレッド数3個のように同時に実行するスレッド数を増やすことができ、-T 0でプロセッサの提供している論理コア数(スレッド数)までスレッドを生成して処理を行います。

処理速度と消費メモリ

スレッド(論理コア)が4のマシンを使って処理速度と消費メモリを調べてみます。まず次のように圧縮の対象となるダミーのデータファイルを作成します。

 1GBのダミーデータファイルの作成
% dd if=/dev/random of=data bs=1024x1024 count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 16.157021 secs (66456671 bytes/sec)
% ls -lh data
-rw-r--r--  1 daichi  daichi   1.0G May 16 17:12 data
%

次に、/usr/bin/timeを使ってxz(1)コマンドの実行にかかった実時間と、あとは最大のレジデントセットのサイズを取得します。

 xz(1)コマンドをオプションなしで実行
% /usr/bin/time -lph xz data
real 381.49
user 379.87
sys 1.51
     97664  maximum resident set size
        64  average shared memory size
        24  average unshared data size
       128  average unshared stack size
     23884  page reclaims
         0  page faults
         0  swaps
        10  block input operations
    131079  block output operations
         0  messages sent
         0  messages received
         0  signals received
      2009  voluntary context switches
     20185  involuntary context switches
%
 xz(1) -T 2で実行
% /usr/bin/time -lph xz -T 2 data
real 182.55
user 359.62
sys 1.35
    340928  maximum resident set size
        63  average shared memory size
        23  average unshared data size
       127  average unshared stack size
     84572  page reclaims
         0  page faults
         0  swaps
         6  block input operations
    131079  block output operations
         0  messages sent
         0  messages received
         0  signals received
       673  voluntary context switches
     26670  involuntary context switches
%
 xz(1) -T 3で実行
% /usr/bin/time -lph xz -T 3 data
real 126.49
user 368.35
sys 1.28
    510176  maximum resident set size
        64  average shared memory size
        24  average unshared data size
       128  average unshared stack size
    126799  page reclaims
         0  page faults
         0  swaps
        10  block input operations
    131079  block output operations
         0  messages sent
         0  messages received
         0  signals received
       507  voluntary context switches
     51176  involuntary context switches
%
 xz(1) -T 4で実行
% /usr/bin/time -lph xz -T 4 data
real 100.40
user 385.31
sys 1.62
    679440  maximum resident set size
        63  average shared memory size
        23  average unshared data size
       127  average unshared stack size
    169026  page reclaims
         0  page faults
         0  swaps
      1364  block input operations
    131079  block output operations
         0  messages sent
         0  messages received
         0  signals received
      1263  voluntary context switches
     60359  involuntary context switches
%
 xz(1) -T 0で実行
% /usr/bin/time -lph xz -T 0 data
real 99.84
user 385.33
sys 1.56
    679440  maximum resident set size
        63  average shared memory size
        23  average unshared data size
       127  average unshared stack size
    169026  page reclaims
         0  page faults
         0  swaps
        10  block input operations
    131079  block output operations
         0  messages sent
         0  messages received
         0  signals received
       387  voluntary context switches
     56429  involuntary context switches
%

結果をグラフにまとめると次のようになります。

 realとuser時間の比較
図 realとuser時間の比較
 最大レジデントサイズの比較
図 最大レジデントサイズの比較

実行に利用したマシンは論理コアが4つですので、-T 4と-T 0は同じ意味になります。実際、測定結果もほとんど同じです。

スレッド数を増やすとその分実際の実行時間(real)が短くなり、かつ、メモリの消費量が増えていることを確認できます。処理するデータ量は同じですから、合計した実行時間(user)はほとんど変わっていません。ほとんど想定通りの挙動が得られていることがわかります。

将来的には展開時にもマルチスレッド対応

-T 0の挙動はいずれはデフォルトになるように思いますので、コアの多いマシンほど圧縮処理が高速になるのではないかと思います。圧縮に時間がかかるのはxz(1)の弱いところですので、この部分が高速化するのは好ましいことだといえます。

xz(1)の特徴は高い圧縮率と高速な展開時間にあります。将来的にはこの展開に関してもマルチコア/スレッド対応機能が入るものとみられますので、より高速にデータ展開が可能になるものとみられます。

FreeBSD勉強会 告知

第52回 5月26日(木)19:00~ FreeBSD翻訳に貢献しよう!基本的なツールの使い方

ソースコードが読めないからドライバを書いたりカーネルを書き換えたりできないし、新しくportsを作るのもちょっと難しい……そう思ってはいませんか? プロジェクトに貢献するのはなにもソースコードだけではありません。FreeBSDにはFreeBSD Handbookという優れたドキュメントがあります。このドキュメントを翻訳するだけでも、多くの日本のユーザに貢献することになります。

FreeBSD Docチームは最近POの機能を取り込んだ翻訳システムを構築して活用しています。このシステムを導入する前に比べると自動化できる部分も増えましたし、システマティックに変更部分を判断することもやりやすくなりました。こうした新しい翻訳作業に関してdocチームは各国で開催されるカンファレンスやサミットでチュートリアルを開催するなど、こうした仕組みを広く伝える取り組みをおこなっています。

今回の勉強会では、翻訳するにあたって使われているツールやサービスについて紹介したり、実際にどうやって作業を行っているのかの紹介を実施します。実際に翻訳作業をするわけではなくても、新しいドキュメント管理の方法を学ぶという上でも役に立つのではないかと思います。多くの方のご参加をお待ちしております :)

参加申請はこちらから。

第53回 6月22日(水) 19:00~ ZFSマスターベーシックス

ストレージシステムや仮想化システムのファイルシステムとしてデファクトスタンダードになりつつあるZFS。FreeBSDでネイティブに動作するファイルシステムで、FreeBSDをストレージシステムや仮想化システムのオペレーティングシステムとして採用する強い同期になっています。

ZFSについては聞いたことはあるけど使ったことはない、どんなものか知りたい、使ってみたい、という方向けの勉強会です。ZFSの概要や基本的な使い方などを紹介します。

参加申請はこちらから。

おすすめ記事

記事・ニュース一覧