|
トレーサとは何ですか? デバッガとの違いは何ですか?
トレーサとは、一般にCPUを止めずに、システム全体で実行した命令とその結果を実行順に出力するツールです。そのためプロセス(スレッド)を実行させながら、システム全体のデータを取得できます。これにより、プロセス(スレッド)の「振る舞い」を見える化し「グラフ」という形で見ることができます。主にシステム全体としてのパフォーマンス向上や、高速化・効率化したい場合、またエラーのあるプログラムの特定などに向いています。
一方、デバッガは、CPUを止めて特定プログラムの状態(メモリ、レジスタ、変数)を調べます。そのため、ブレーク時点などでの詳細な情報を取得できる一方で、他のプロセス(スレッド)間との実行状況の関連などについて、詳細な情報を取得することには向いていません。デバッガは主に、特定プログラムのバグの発見などに向いています。
|
|
ftraceとは何ですか?
ftraceは、Linuxカーネル2.6.27以降標準に装備されているトレーサです。
ftraceは、静的トレーサであるので、動的トレーサに比べて高速に動作します。
ftraceは、アーキテクチャ非依存で、プラグインによって拡張が可能です。
今後の機能拡張が見込まれます。
静的トレーサ:カーネルコード中に直接トレース呼び出しが記述されているトレーサ
動的トレーサ:トレース時に実行するモジュールを動的にカーネルに組み込めるトレーサ
|
|
ftraceを有効にするにはどうすればよいですか?
- カーネルコンフィグレーションより以下の項目を設定し、再コンパイルします。
2.6.27
- Kernel hacking --->
- [*] Trace process context switches
2.6.28 ~ 2.6.29
- Kernel hacking --->
- [*] Tracers --->
- [*] Trace process context switches
2.6.30
- Kernel hacking --->
- [*] Tracers --->
- [*] Trace process context switches
- [*] Trace various events in the kernel
2.6.31 ~
- Kernel hacking --->
- [*] Tracers --->
- [*] Trace process context switches and events
|
|
ftraceのトレースデータを取得するには? New!
|
ftrace のトレースデータを取得するための2つの方法を説明します。
Vzetでは、手動で取得したトレースデータを取り込み「見える化」できます。
|
|
|
|
トレースログは、ftraceが有効化された2.6.27以降のLinux Kernelを搭載していれば、組み込みLinux、PC Linux、Androidなど、どのようなプラットフォームからでも取得できます。
|
ftraceを有効にする手順は こちらを参照下さい。
なお、ターゲットとはトレースするLinux Kernelが動作するハードウェアを意味します。
|
ターゲットのコンソール上でコマンドを実行する
- 例として、2.6.27 ~ 2.6.38までのLinux Kernelをトレースする手順をご紹介します。
- この手順は、どのようなプラットフォームに対しても共通です。rootユーザーで実行ください。
|
|
1. debugfsをマウントします。
ftraceで使用するファイル群は、/sys/kernel/debug/tracing下にマウントされます。
|
|
2. 使用するトレーサを登録します。
sched_switch トレーサはプロセスのタスク切り替えをトレースすることができます。
|
|
3. トレースを開始します。
|
|
4. トレースしたいユーザーアプリケーションを実行します。
|
|
5. トレースを終了します。
|
|
6. 取得したトレースログを保存します。
|
|
7. 4.で実行したユーザーアプリケーションの名前がトレースログに含まれることを確認します。
|
スクリプトを使う
- トレースログを簡単に取得できるスクリプトをご用意しましたので、活用ください。
|
1. こちらからzipファイルをダウンロードし、展開します。
カーネルバージョンにより使用するスクリプトが異なります。
- 2.6.27 ~ 2.6.38までのLinux Kernelをトレースする場合
- 2627_38 ディレクトリ下のスクリプトをご使用ください。
- 2.6.39以降のLinux Kernelをトレースする場合
- 2639 ディレクトリ下のスクリプトをご使用ください。
|
|
2. カーネルバージョンにあったスクリプトをターゲット上にコピーします。
以下、rootユーザーで実行します。
|
|
3. スクリプトに実行属性を与えます。
|
|
4. start-trace.shを実行します。(トレース開始)
|
|
5. トレースしたいユーザーアプリケーションを実行します。
|
|
6. stop-trace.shを実行します。(トレース終了)
|
|
|
プラグインとは何ですか?ftraceのプラグインにはどのようなものがありますか?
プラグインとは、ftraceに追加機能を提供するプログラムです。Linuxカーネル 2.6.28では、次のようなプラグインが提供されています。
| |
function: |
全てのカーネル関数をトレースする(関数の入口のみ)。 |
| |
function_graph: |
全てのカーネル関数をトレースする(関数の入口と出口)。 |
| |
sched_switch: |
タスク間のコンテキストスウィッチとウェイクアップをトレースする。 |
| |
irqsoff: |
割り込み禁止区間をトレースし、最大待ち時間を記録する。 |
| |
preemptoff: |
プリエンプト禁止時間をトレース・記録する。 |
| |
preemptirqsoff: |
割り込み、またはプリエンプト最大禁止時間をトレース・記録する。 |
| |
wakeup: |
最大待ち時間をトレース・記録する。 |
| |
hw-branch-tracer: |
全ての実行されたブランチをトレースする(x86のみ)。 |
|
|
ftraceの処理時間(オーバヘッド)について教えて下さい。
処理時間は、CPUの性能、traceポイントのリングバッファに保存するパラメータの数により変わります。例として、Atomボードの計測結果を示します。計測は、kernelのschedulerでコンテキスト・スイッチの
ログを収集しているtraceポイントで行いました。traceポイント前後の時間から処理時間を計測しています。
Intel® Atom™ CPU 330 @ 1.60Hz
traceポイント実行時間:平均 約2.7μsec(2744nsec)
|

|
|
|
イベントとは何ですか?
イベントとは、カーネルソース中に記述されたトレースポイントが実行されたことを表します。
例えば、割り込みハンドラの開始を表す irq_handler_entry イベントは、kernel/irq/handle.c内の
handle_IRQ_event()というカーネル関数が実行されたことを意味します。
|
|
トレースポイントとは何ですか?
トレースポイントとは、カーネルの特定箇所でデータを記録するための関数です。
トレースポイントは、メンテナーによってカーネルソース中に記述されています。
|
|
独自にトレースポイントを追加するにはどうすればよいですか?
手動でカーネルソース中にトレースポイントを記述し、カーネルを再コンパイルする必要があります。
イベントトレースとして追加することにより、VzetのContext Switchのグラフに重ねて表示することが可能です。 詳細については、下記のカーネルドキュメント、サンプルコードをごらんください。
カーネルドキュメント
- linux-2.6.31/Documentation/trace/events.txt
サンプルコード
- linux-2.6.31/samples/trace_events/trace-events-sample.c
- linux-2.6.31/samples/trace_events/trace-events-sample.h
|
|
イベントトレースするにはどのような環境が必要ですか?
ターゲットシステムのカーネルバージョンが、2.6.30以降である必要があります。
|
|
WakeUpとは何ですか?
WakeUpとは、TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLEなどの待ち状態にあるプロセスを実行状態(TASK_RUNNING)に切り替えることです。
|