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もトレースしているにもかかわらず)全然ありませんでした。
------------------------------------------ |
この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 |
|
||||
|
連載 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カーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|