●高速圧縮アルゴリズム、圧縮キャッシュ

2年の開発期間を経て、FreeBSDの次期メジャーアップグレードバージョンとなる「FreeBSD 10.0-RELEASE」が間もなく登場する。


ほかのオペレーティングシステムでは実現されていない革新的な機能が取り込まれているほか、動作の粘り強さや適用シーンの幅の広さなどに定評があるFreeBSD。その最新版となるFreeBSD 10.0-RELEASEは、新機能や改善点がかなりの数に上り、ユーザから大きな期待が寄せられている。


本稿ではFreeBSD 10.0-RELEASEで実現される新機能の中から、特にユーザから見て注目となる11のポイントに絞って解説する。新版を活用するきっかけにしてもらえればと思う。


○ZFS機能強化とSSD対応


日本のエンタープライズやコンシューマではFreeBSDはエッジサーバに採用されることが多いが、世界のエンタープライズ市場ではFreeBSDはストレージアプライアンスやストレージシステムのオペレーティングシステムとしても広く活用されている。国内でもFreeBSDとZFSをベースにしたNASソリューションを提供している企業は少なくない。高速で堅牢に動作するUFS2+Softupdates、大規模で多機能なストレージを構築できるZFS、的確に動作するネットワークスタック、高負荷になっても粘り強く動き続けるカーネル、そしてBSDライセンスで提供されているという特徴が、NASアプライアンスやNASシステムを構築するのに適したものとなっている。


FreeBSDプロジェクトではOpenZFSやIllumos主体で開発されているZFSの機能を随時FreeBSD ZFSへバックポートしているほか、FreeBSDとしての機能追加なども実施している。FreeBSD 10.0で登場することになる主なFreeBSD ZFSの注目ポイントをいくつか紹介する。 


高速圧縮アルゴリズム LZ4

リビジョン246586のコミットではZFSに対してLZ4圧縮アルゴリズムの実装が追加された。 Illumosプロジェクトからのバックポートとなる。これはBSDライセンスで開発されたハイスピード圧縮アルゴリズムの実装で、それまでZFSが使用してきたLZJBと比較して圧縮で50%以上、展開で80%以上高速に動作するとされており、圧縮されていないデータの圧縮処理でだいたい3倍ほど従来よりも高速に動作するとされている。さらに圧縮率もLZJBよりも優れているという。


データセットを圧縮機能とともに使用している場合には処理速度の高速化と容量効率のよいストレージ活用が期待できる。


圧縮キャッシュで高速化 L2ARC Compression

ZFSはその仕組み上、安定的にまた高速に動作するのに大量のメモリを必要とする。FreeBSD ZFSであればZFS向けに使われるキャッシュ(L2ARC)はスワップ不可能なWiredなメモリ領域として確保され、ZFSストレージシステムにおける大半のメモリをここで消費することになる。


Illumosではこのキャッシュ(L2ARC)をより効率よく利用するために「L2ARC Compression」という機能を実装。251478のコミットでこの機能がFreeBSD ZFSにもバックポートされた。L2ARCの領域を圧縮して利用することで確保したメモリ領域にさらに多くのキャッシュデータを保持することで高速化を狙うという仕組みになっている。


ディスクのアクセス速度を考えると、ディスクへの入出力は極力減らした方がよい。また、最近のプロセッサのパワーを考えると圧縮・展開処理をしても、まだお釣りがくる。結果的に圧縮した方が動作が高速になる。この圧縮・展開処理には先ほど紹介した高速圧縮アルゴリズムLZ4が使われている。


上書き削除で高圧縮 NOP Writeオプティマイゼーション

FreeBSD 10 ZFSにはIllumosで開発された「NOP Write」と呼ばれる最適化機能も取り込まれている。これはデータを書き込む際に、ディスクに書き込まれているデータのチェックサムを比較して、データが同一である場合には処理をスキップしてディスクI/Oを発生させないようにするという機能。これは特にスナップショットを活用している場合にディスクスペースを節約する効果が期待できる。


「NOP Write」の実際の動作とその効果についてはリビジョン243523 zio_impl.hのコミットで追加されたコメントがわかりやすい。その特性上、重複排除(dedup)機能とは相性がよくないため、「NOP Write」機能は重複排除の機能が無効で、かつ、圧縮機能が有効になっているようなデータセットで機能する設定になっている。


ZFS TRIMのサポート

リビジョン240868のコミットでZFSにTRIMサポートが追加された。SSDのみで構成されたプールを使っている場合などに効果が期待できるとされている。TRIMサポートはUFSにはすでに追加されている。この機能はmultiplay.co.ukのスポンサーシップのもとで実施されたほか、zfsonlinuxプロジェクトの成果物からいくつか改善を取り込んでいると説明がある。


●新しいiSCSIスタック、UFSの動的拡張

○新しいiSCSIスタックの導入


FreeBSD 10にはカーネルで動作する新しいiSCSIターゲット/イニシエータの実装が追加された点も注目される。iSCSIターゲットとしてもiSCSIイニシエータとしても動作可能で、カーレベルレベルでネイティブに動作する。FreeBSDはストレージでの利用要求が高いので、そうした要望に応える形での実装になっている。FreeBSD Foundationの支援のもとで開発された成果物。


データの共有が必要であればFreeBSDにはすでにNFSが存在するが、iSCSIはそこよりも低レベルでのデータ共有を可能にする。NFSはファイルシステムレベルでのデータの共有になるが、iSCSIはブロックデバイスレベルでのデータの共有となる。iSCSIターゲットとして動作する場合にはストレージを提供する側になるし、iSCSIイニシエータとして動作する場合にはiSCSIターゲットからディスクを持ってきて利用することになる。接続したディスクは/dev/da0といった形で使えるようになり、USB HDDを接続したような感覚で使用できる。


設定ファイルの書き方や利用方法などはFreeBSDハンドブックの\28.13. iSCSI Initiator and Target Configurationにまとまっている。ZFS、iSCSI、NFS4、各種アプリケーションなどFreeBSD 10はストレージシステムのオペレーティングシステムに必要になる多くの機能がそろっている。


○UFSのオンライン growfs(8)


これまで要望が多かったUFSの動的な拡張もリビジョン243246のコミットで実施できるようになった。これまで静的にUFSファイルシステムの領域を拡張することはできたが、FreeBSD 10からは読み書き可能な状態でマウントされたUFSであっても動的にサイズを広げることが可能になる。


この機能はUFSに新しく追加された書込のサスペンド機能を使って実装されている。growfs(8)が領域を拡大し終わるまで書込処理がサスペンドされる。こうした機能は特に仮想環境での使用が想定されている。仮想ディスクイメージは固定されたサイズで提供されており、後から領域を広げたいことがある。FreeBSD 10からはgrowfs(8)を使うことでこれを実現できるようになる。


動作の高速さや消費するメモリ量の少なさなどから、仮想環境で動作する場合にはファイルシステムとしてはZFSよりもUFSの方が活用されるケースが多い予想される。オンラインでgrowfs(8)が利用できるようになることで、特にこれまでUFSで弱いとされてきた機能が補われることになる。


●BINDの排除とUnbound/LDNSの導入

○BINDの排除とUnbound/LDNSの導入


FreeBSD 10からはベースシステムからBINDが取り除かれる点に注意が必要。BINDはよくセキュリティ脆弱性が発見されるソフトウェアのひとつだが、BINDのリリースエンジニアリングとFreeBSDの相性の問題で今回ベースシステムからは外れることになった。置き換えというわけにはいかないが、これを補うことになるソフトウェアとしてUnboundとLDNSの一部がベースシステムにマージされている。


dig(1)はBINDに含まれていたツールであるため、dig(1)もベースシステムから削除されている。同じくBIND由来のhost(1)やnslookup(1)もベースシステムから取り除かれている。この代替としてはLDNSベースのdrill(1)とhost(1)が追加されている。


host(1)はDNSルックアップを実施するための簡易ユーティリティ。ちょっとした名前引きなどに利用される。


drill(1)はdig(1)をより強力にしたようなツールで、DNSおよびDNSSECのすべての情報にアクセスできる設計になっている。FreeBSD 10以降は基本的にはdrill(1)を使えばよい。


こうした新しいコマンドではなく従来のコマンドを使いたいという場合にはbind-tools(dns/bind-tools)をインストールするという方法がある。bind-tools(dns/bind-tools)をインストールするとBINDベースのdig(1)、host(1)、nslookup(1)が利用できるようになる。


Unboundはローカルキャッシュリゾルバとして導入されている。たとえば/etc/rc.confに次の設定を追加することで利用できるようになる。


次のようにUnboundを起動すると、一番最初の起動時には現在のシステムの設定から新しくUnboundの設定ファイルを生成するとともに、/etc/resolv.confファイルをunbound(8)を利用するように書き換えが行われる。ネームサーバとして127.0.0.1が指定されるようになっていればunbound(8)を利用するようになる。


実際に名前解決を測ってみるとその効果がよくわかる。たとえば次の例では、ローカルキャッシュ効果が出る前の段階ではクエリに394ミリ秒かかっている。


しかし、1度実行した後は、実行時間が1ミリ秒へ短縮していることがわかる。


Unboundでは正引きや逆引きの設定を簡単に設定することができ(/var/unbound/unbound.conf)、/etc/hostsの替わりに利用することもできる。


●次世代ハイパーバイザ/仮想環境基盤 BHyVe

○次世代ハイパーバイザ/仮想環境基盤 BHyVe


FreeBSD 10からはBSDハイパーバイザと呼ばれる機能が取り込まれている。この機能は「BHyVe」と呼ばれており、機能としてはXenやKVMに近いものになっている。XenやKVMはプロセッサが仮想化支援機能を実装する前から存在してきたためソースコードが複雑になっているが、BHyVeはプロセッサの仮想化支援機能を使うことを前提にすることで、そのあたりのソースコードがすっきりしているという特徴がある。


\10.0-RELEASEではFreeBSD 10.0-RELEASE以降のFreeBSDをBHyVeで実行することができる。現在LinuxやWindowsなどほかのオペレーティングシステムを動作させるための開発が進められており、将来的にはFreeBSD以外のオペレーティングシステムも利用できるようになる見通し。この機能ももともとストレージベンダが実装を進めていた機能だ。


たとえば次のように利用する。まず、BHyVeを実行するために必要になるカーネルモジュールの読込と、トンネルインタフェースの作成を行う。


BHyVeを直接コマンドから起動するのはオプションが多くて煩雑なので、ラッパースクリプトを利用する。次のようにNeel Natu氏が提供しているスクリプトをダウンロードしてくるとともに、FreeBSDのインストーライメージ(ISO)をダウンロードしてきて特定の名前に変換しておく。なお、2014年1月以降ならダウンロードしてくるISOファイルはRC3ではなくリリースバージョンの方がよいだろう。


ここまで準備したら、あとはラッパースクリプトに仮想マシンの名前を指定して実行すればよい。


次のようにBHyVe上でFreeBSDインストーラが起動してくる。


実行中に先ほど作成したタップインタフェースを調べると、特定のプロセス(ここではプロセス番号1162のプロセス)によってオープンされているというメッセージが確認できる。


表示されるプロセス番号を調べると、hhybe(8)というコマンドが実行されていることを確認できる。これがユーザから見えるBHyVeの本体だ。


途中で端末の種類を聞かれるのでvt100を選択しておく。


インストール作業は通常のインストール作業と同様に進めればよい。


ディスクやネットワークインタフェースはVirtIOベースのものが表示されるので、これを使用する。


インストールが完了したあとはLiveCDモードに移行して、インストールした先の/etc/ttysに次の設定を追加する。


もしここで編集せずに終了してしまった場合でも、同じディレクトリに作成される「diskdev」というファイルが仮想ディスクファイルになっているので、このファイルを直接mdconfig(8)でマウントして編集することで同じことができる。たとえば次のように作業すればよい。


再起動またはもう一度ラッパースクリプトを使ってBHyVeを実行するとディスクイメージからFreeBSDが起動してくる。


ホストから見るとBHyVeで動作しているゲストは次のようにただのプロセスに見える。確保しているメモリ領域がゲストが使用するメモリのサイズとほぼ同じになっていることも確認できる。


ゲストとして動作するFreeBSDはvirtio_pci、vtnet、vtblkのようにVirtIOを経由してデバイスにアクセスしていることがわかる。


FreeBSD 10にはVirtIO関連のデバイスドライバがデフォルトで採用されている点もポイントとなっている。このためBHyVeに限らずVirtIOがあれば動作する数々の仮想環境で実行できるようになっている。


BHyVeのひとつの活用シーンとして、ホストのFreeBSDカーネルには変更を加えずにFreeBSD Updateおよびpkg(8)による自動アップデートを実施し、カーネルの書き換えやオプションを指定してのアプリケーションが必要になるケースではBHyVe上にカスタマイズしたカーネルやソフトウェアを用意して利用するといった使い方が考えられる。ベースシステムの安定性とカスタマイズの利便性の双方を実現する方法として興味深い。


●Amazon EC2対応、Hyper-V対応、FW強化

○Amazon EC2対応


FreeBSD 10からはAmazon EC2のインスタンスが正式提供されている。Xen対応やVirtIO開発が進んだことやもあり、デフォルトカーネルの状態でAmazon EC2で動作するようになった。これはAmazon EC2上でFreeBSD UpdateベースでFreeBSDサーバを運用したり、Amazon EC2上でカーネルをカスタマイズして実行したりが簡単にできるようになったことを意味している。


リリースのタイミングでいえばFreeBSDの正式アナウンスが開始されるよりも前の段階でインスタンスは登録されており、いち早く最新版を使うことができる。Amazon EC2を利用するとハードウェアの調達などのコストをかけることなくFreeBSDインスタンスを利用することができる。これまでAmazon EC2におけるFreeBSDの利用はさほど普及していなかったが、デフォルトで利用できるようになったことで採用が進むものとみられる。


Amazon EC2ではリソースの少ないマイクロインスタンスからリソースを豊富に備えたインスタンスまで多種多様なコンピュータリソースが提供されており、一定期間だけECサイトを展開したいとか広告を出したい、動画配信をしたい、HPCを実施したいなどの用途に柔軟に対応できる。


○Hyper-V仮想化プラットフォーム


仮想化プラットフォームへの対応という点でみると、MicrosoftのHyper-V対応がデフォルトで追加された点もFreeBSD 10の特徴になっている。MicrosoftとCitrix、NetAppが共同で作業を進めた結果、FreeBSD向けのHyper-Vインテグレーションサービスの実装がオープンソースで公開されることになり、この成果物がマージされた。


FreeBSD 10.0は次のようにHyper-Vとのサービス統合が実現されている。


・Hyper-Vコンソールからのシャットダウンの実施

・Hyper-VホストとFreeBSDゲストの間での時刻同期の実施

・Hyper-V特有のIDEストレージデバイスおよびSCSIストレージデバイスに対応

・Hyper-V特有のネットワークアダプタに対応

・特定のIPアドレスを使わなくともライブマイグレーションを実現


Hyper-VでFreeBSDを運用する場合はFreeBSD and Microsoft Windows Server Hyper-V supportのページに情報がまとまっているので参考にしておきたい。


○ファイアウォールipfw(8)機能強化とpf(4)マルチコア対応


FreeBSD 10のファイアウォールであるipfw(8)にはIPヘッダのDSCP(DiffServコードポイント)に対する設定または一致の機能が追加された。IPv4およびIPv6の双方に対応。DSCPの値は名前ベースでも数値ベースでも指定でき、一度に複数のクラスを指定できる。


FreeBSDにおいてもっとも開発が進んでいるファイアウォールがipfw(8)だ。FreeBSDでファイアウォールを使う場合はipfw(8)を選択するものだと考えておいて問題ない。ipfw(8)はマルチコア/メニーコアにおいて性能が発揮できるようによく開発が進められており、動作も軽快。


一方、OpenBSDで開発されたpf(4)もFreeBSDでは人気がある。pf(4)はフィルタルールの記述がわかりやすく強力な指定を記述できる。FreeBSD 10のpf(4)はさらにマルチコアへの対応も進められ、従来のバージョンよりも性能が発揮できるようになっている。


ただし、FreeBSDのpf(4)を使う場合にはいくつか検討した方がよい点がある。まず、性能の面ではipfw(8)の方が優れていること、ロバスト性の面でもipfw(8)がよいと見られていることだ。仮想環境で動作させた場合もipfw(8)の方が堅牢に動作する傾向がある。pf(4)を採用する場合には高負荷時にpf(4)がちゃんと動作するか検証した上で採用した方がよいといえる。


●デフォルトコンパイラ変更、マルチ/メニーコア対応、高速通信機能

○デフォルトコンパイラをGCCからLLVM Clangへ


FreeBSD 10.0からはデフォルトのコンパイラが従来のGCCからLLVM Clangへ置き換わっている。FreeBSDプロジェクトはGPLv3のソフトウェアをベースシステムにマージしない方針をとっているため、これまではGPLv3にライセンスが変更される以前のGCC 4.2.1を使い続けてきた。古いコンパイラで、さまざまな面で最新の状況への対応が難しくなっていた。


そこでFreeBSDプロジェクトはコンパイラインフラストラクチャとしてLLVM Clangの採用を決定した。LLVM ClangはBSDライセンスで開発されており、開発も活発、LLVM ClangのコミュニティとFreeBSD開発者のコミュニケーションも円滑に進んでいる。さらにGCCと比較してコンパイル時間がとても短いという特徴がある。ビルドを繰り返すソフトウェアのプロジェクトにあってはソフトウェアのビルド時間が短いことは大きなアドバンテージになる。


FreeBSDに限らず、同様の理由でGCCからLLVM Clangへ移行したプロジェクトはいくつもある。Linuxでもコンパイル時間の短さなどを理由にLLVM Clangでビルドできるようにする取り組みが行われている。


LLVM Clangが出力するエラーメッセージはGCCのエラーメッセージと比較して理解しやすいという点も開発者に好まれる一因になっている。GCCのエラーメッセージでは原因が掴みにくいものでも、LLVM Clangでビルドするとエラー部分が理解できることが多い。開発のみならず教育向けのコンパイラとしても利用できる。


○マルチコア/メニーコアで性能向上させる Unmapped VMIOバッファ


FreeBSD 10は従来のバージョンよりも大規模なマルチコア/メニーコアの性能が発揮できるようになっている。これはJeff Roberson氏およびKonstantin Belousov氏が開発した「Unmapped VMIOバッファ」という機能が理由になっている。FreeBSDカーネルは大規模なマルチコア/メニーコアのシステムに対してまだ性能を引き上げる余地があるとされており、「Unmapped VMIOバッファ」はそうした取り組みのひとつ。


VMIOバッファの作成と削除のタイミングですべてのコアに対してTLBの無効化の操作が実施されているが、この部分が性能のひとつのボトルネックになっている。この処理のなかでデータのコピーが発生するもののまったく使われることなく破棄されているものがある。「Unmapped VMIOバッファ」はこうした無駄な処理を実施しないようにする機能。この機能が取り込まれたことでいくつかの作業が高速化している。


○高速ネットワーク通信機能 NetMap


動画配信やビックデータ処理(大量のログデータの処理、遺伝子情報解析、天文台データ処理、統計データ処理など用途はさまざま)、ネットワークの基幹部分の通信などではより高速な通信が求められており、10GbEや40GbEといったより高速なネットワーク通信が求められている。こうした高速通信のデバイスをより効率的に利用するための機能「NetMap」が統合されている点もFreeBSD 10のひとつの特徴といえる。


NetMapの機能は10GbEのみならず1000baseTのNICでも効果が期待できる。ハードウェア的にはNetMapを活用することでネットワームモニタやソフトウェアスイッチなどを開発しやすくなるという特徴がある。ネットワークを流れるパケットを取得して高速に解析する必要があるようなアプライアンスの開発に利用できる。


高速通信という面では費用対効果的にもInfiniBandに人気があるが、InfiniBandはドライバの提供されているオペレーティングシステムが限られており、さまざまな種類のノードが混在するような環境では使いにくい面がある。一方、10GbEや40GbEといったネットワークは利用できるオペレーティングシステムも多く、従来の技術の延長でシステムが構築できるという利点がある。


(後藤大地)