3月版 トレーサ関連に大きな進展、ftraceがデファクトに?


小崎資広
2009/4/8

 お久しぶりです。先月はThe Linux Foundation Japan Symposiumの発表や何やらで急きょ休んでしまいました。関係各位に迷惑を掛けてしまい、若干肩身が狭い筆者です。

 さて、最近の一大ニュースといえば、Linuxの起動ロゴがTuxからTuz(1月のlinux.conf.auのマスコット)に変更されたことでしょう。何げなく最新カーネルをビルドしようとして、ロゴ変更にビックリした人も多いんじゃないでしょうか? どんなロゴか興味がある人は、Linusのブログから見ることができます。

 執筆時点ではあと数日もしたら2.6.29がリリースされそうな雰囲気なのですが、残念ながら締め切りに間に合いそうにないので、今月は通常のKernel Watchでお送りします。それでは、どうぞ。

編注:米国時間の3月23日に2.6.29がリリースされました。brtfsなど新しいファイルシステムのサポート、WiMAXのサポート、ドライバ追加などの変更が加わっています。詳細は次号にてお伝えする予定です。

Linuxのデファクトトレーサに躍り出るftrace

 2.6.27のリリース時に軽く紹介したftraceですが、いま、LKMLで最も熱いトピックの1つとなっています。今年に入ってからだけでも1万行以上のコードがtipツリー(注1)にコミットされ、急速に機能を拡大しています。

 まず、使い勝手の改良に最も貢献したFrederic Weisbeckerのfunction graph tracerを紹介したいと思います。従来のfunction tracerでも全関数のトレースができましたが、出力は、関数名が素っ気なく表示されるだけでした。これは、ツールがパースする分にはいいのですが、人間が見るには可視性に難がありました。

 function graph tracerは以下のように、C言語ライクに関数をインデントして表示してくれます。この結果出力が非常に見やすく、また関数の入り口と出口の差分(つまり経過時間)を自動的に計算してくれるので、遅い関数を非常に簡単に特定することができるのです。

 従来よく使われていたOprofileのようなサンプリング型の分析ツールとは異なり、全関数の入り口と出口をチェックしているので、子関数も含めた累積の時間が分かるのが強みです。また、非常に高度なチューニングがなされており、筆者が評価したときは、体感できるような速度劣化は(スケジューラやirq handlerもトレースしているにもかかわらず)全然ありませんでした。

------------------------------------------
| 2) make-19003 => kjournald-2219
------------------------------------------

2)               | blk_unplug() {
2)               |   dm_unplug_all() {
2)               |     dm_get_table() {
2)      1.381 us |       _read_lock();
2)      0.911 us |       dm_table_get();
2)      1. 76 us |       _read_unlock();
2) +   12.912 us |     }
2)               |     dm_table_unplug_all() {
2)               |       blk_unplug() {
2)      0.778 us |         generic_unplug_device();
2)      2.409 us |       }
2)      5.992 us |     }
2)      0.813 us |     dm_table_put();
2) +   29. 90 us |   }
2) +   34.532 us | }

 このfunction graph tracerはそれ自体が使いやすく、多くのデベロッパーの賞賛を集めるとともに、ftraceのプラグイン開発のしやすさをLKMLに広めることになりました。

 そのため、省電力支援トレーサ、mmioドライバ開発支援トレーサ、スタックトレーサ、boot時間分析支援トレーサなど、新しいトレーサが次々と実装されました。また、従来より存在していたblktrace、kmemtraceなどのトレース機能もftrace pluginとして再実装されていきました。

 この流れを決定的にしたのは、Tom Zanussiのzedtraceパッチに触発され、Steven Rostedtにより開発されたftrace event tracerと呼ばれる静的プローブ型汎用トレーサです。これは、カーネルコード中に直接トレース呼び出しを記述する(=静的にコードにプローブを埋め込む)ことによる高速汎用トレース機能です。

 これは従来、LTTngのマージによって実現されるだろうといわれていた機能です。LTTngは昨年のカーネルサミットでも取り上げられるなど、静的トレーサの重要性は広く認知されていたにもかかわらず、実装方法について合意が得られず、なかなかマージされない状況が続いていました。

 それが、コミュニティで合意が得られる形で実現したのですから、期待はいやが応にも高まります。これを機に、Andrew Mortonをはじめとする有力デベロッパーの何人かがftraceの開発・レビューに合流。これで流れは決定的になり、LTTngをはじめとするほかのトレース提案を過去のものとします。

 その後も、内部event formatのテキスト形式からバイナリへの移行、およびbinary printkの実装により、トレースバッファの完全バイナリ化に成功。さらに、極限まで性能を高めるとともに、Googleのクラスタトレースに必要な、ユーザー空間にテキスト変換をバイパスしてデータ読み出しを行う高速トレースデータ読み出しモードもサポートし、効率に対する批判を沈黙させることに成功しました。大筋の議論は、ほぼ結論が出たといってもよいでしょう。

 現在の大きなトピックとして、Hiramatsu Masami氏により開発されたkprobe-based event tracerの議論が始まっています。近日中にtipツリーにマージされる見込みです。

 最終的には、これら3種類のトレース方式は、以下のように目的に合わせて柔軟に組み合わせられるようになると見込まれています。

  function (graph) tracer event tracer kprobe-based event
実現方式 gccの-pgオプションにより全関数の先頭にトレース関数呼び出しを挿入 ソースコード中に明示的にトレース呼び出しを使ってブレークポイント命令を埋め込む 指定個所にkprobeを記述。自己命令書き換えでON/OFF
カーネルソースコードへの変更 不要 不要
メリット あらゆる関数がトレース可能。OFF時はNOP命令になるので性能劣化0 トレースを埋め込むときに一番必要な情報を明示的に出力対象に指定できるので(関数先頭に限定されない)OFF時は性能劣化0 あらゆる命令がトレース可能で、一番きめ細かい制御が可能。引数情報が取得可能
デメリット 引数情報が取れない ソースコードへの変更が必要 ブレークポイント命令を使うのでON時の劣化が多少大きい

 現在のftrace最大の問題点は、ドキュメントが貧弱なことです。Documentation/ftrace.txtにしばしば古い間違った情報が書かれていることもあり、利用者を混乱させています。これについてはIngoも気にしているようで、早急な是正が呼び掛けられています。

注1:Ingo Molnarの管理する開発ツリー。彼がメンテナを務めるscheduler、x86関連の最新パッチのほか、多くのキワモノパッチを収録していることでも名高い

1/2

Index
Linux Kernel Watch 3月版
 トレーサ関連に大きな進展、ftraceがデファクトに?
Page 1
 Linuxのデファクトトレーサに躍り出るftrace
  Page 2
 機能・速度ともに大幅に改善されたmemory cgroup
 -stableの進ちょく

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間