FreeBSD 8の注目機能「DTrace」

FreeBSD 8-CURRENTにおけるDTraceマージ/ビルドプロセス追加が着々と進んでいる。今後はシステムの動作統計をとるにあたって、従来のようにソースコードに変更を加えたり、sysctrl(8)値に統計情報を書き出したりといった処理を加えなくても、動的にオンザフライでシステムの統計情報が取得できるようになる。アプリケーションのソースコードに手を加える必要がなく、商用アプリケーションであっても計測とパフォーマンスボトルネックの解析ができる。FreeBSD 8の目玉機能のひとつとなるだろう。

FreeBSDではOpenSolarisやそれに類する技術が公開されてから、特にZFSとDTraceのFreeBSDへの移植が続けられてきた。5月6日(米国時間)から4日間にわたってJavaOne2008が実施されたわけだが、米Sun MicrosystemsはさらにOSS化を推進する姿勢を崩しておらず、現在CDDLのもとで提供されているZFSとDTraceは、場合によってはGPLのもとでの配布に変更される可能性がある。時期は明言されていないが、GPLに変更されてからはFreeBSDのみならずLinuxへの移植も進められるとみられる。

DTrace、D Languageで柔軟にダイナミックトレース

DTraceはもともとSolaris向けに開発されてきたダイナミックトレーシングフレームワーク。Solaris以外ではOpenSolarisに導入されているほか、Mac OS Xにも実装されている。Mac OS Xで実装されたDTraceがフラグを有効にするだけで特定のアプリケーション(たとえばiTunesなど)をトレース対象から外す機能を実装したため、DTrace本来の意義に反するとして反感意見を買ったのは記憶に新しいところだ。

DTraceではD Languageと呼ばれるスクリプト言語を組むことでシステムの情報をダイナミックにトレースできるようになっている。ここでのD LanguageとはDigital Marsによって開発されているD言語ではなく、DTrace向けに開発された専用のスクリプト言語のことをさす。C言語によく似たスクリプトで、C言語にawkやperlの機能を取り入れたような作りになっている。D LanguageはDTraceをもっとも特徴づける機能だ。

BSDCan2008 John Birrell氏の発表資料より抜粋 BSDCan2008 John Birrell氏の発表資料より抜粋

D Languageで記述する内容はイベント駆動形式になっている。計測したいイベントを指定し、そのイベントに対して何を実施するかを記述する。指定するイベントは、システムコールやプロセス情報などだ。D Languageは実行時にDIF形式で変換され、変換されたDIFデータがdtrace(8)によって解釈され実行される仕組みになっている。ソースに手を加えることなくシステムコールをフックして情報を取得できるというのはかなり強力な機能と言える。

FreeBSDにおけるDTrace - libdtrace、dtrace(8)、dtrace(9)、/dev/dtrace/dtraceX

DTraceは、OpenSolarisが公開される段階でほかのOSからも利用できるように公開されたものだ。ライセンスにはCDDL(COMMON DEVELOPMENT AND DISTRIBUTION LICENSE)を採用している。FreeBSDで使う場合には、カーネルモジュールを読み込んでDTraceを有効にしてからdtrace(8)コマンドを使ってトレーシングを実施する。dtrace(8)には直接命令を指定するか、D Languageで記述されたファイルを指定してトレーシングを実施する。

BSDCan2008 John Birrell氏の発表資料より抜粋

FreeBSDではlibdtrace(DTrace API)を叩くことでユーザランドアプリケーションからDTraceの機能が使えるようになっている。libtraceはデバイスioctlsを経由して排他的にdtrace(9)を使う仕組みになっている。デバイススペシャルファイルは/dev/dtrace/dtraceXだ。/dev/dtrace/dtraceXはDTraceクライアントごとに生成される。用意されているDTrace ioctrlsはPROVIDER、ENABLE、CONF、STATUS、GO、STOP、FORMATなど16ほどある。

豊富なドキュメントが開発を支援

DTraceの強力性はもちろんだが、特に注目すべきはすでに米Sun Microsytemsによって豊富なドキュメントが用意されている点にある。D Languageを使えば、ダイナミックトレースをスクリプト言語という形でノウハウとしてまとめておける。これまでに公開されているドキュメントやスクリプトサンプルは、今後DTraceを使ったFreeBSD開発やアプリケーション開発に大いに貢献することになるだろう。

DTraceは、デバッガではないし、自動的に何かをする機能でもない。指定したカーネル内イベントをトレースするための機能だ。特にパフォーマンスチューニングやボトルネックの解析に力を発揮することになるとみられる。FreeBSDデベロッパにおけるDTraceの活用も今後徐々に広がっていくことになるだろう。FreeBSDデベロッパは今後はデバッガ以外にもDTraceの活用を検討していきたい。