3.9. レイテンシーをトレースするための ftrace ユーティリティーの使用
Red Hat Enterprise Linux for Real Time カーネルに提供されている診断機能の 1 つに ftrace があります。これは、開発者がユーザー空間外で発生する遅延やパフォーマンスの問題を分析およびデバッグするために使用されます。ftrace ユーティリティーにはさまざまなオプションがあり、さまざまな方法でユーティリティーを使用できます。これは、コンテキストスイッチの追跡、優先順位の高いタスクでのウェイクアップにかかる時間の測定、割り込みが無効になっている期間の測定、特定の期間中に実行されたカーネル関数のリストの表示に使用できます。
関数トレーサーなどの一部のトレーサーは、大量のデータ量を生成し、トレースログ分析を時間の消費タスクに切り替えます。ただし、トレーサーに対し、アプリケーションが重要なコードパスに到達した場合にのみ開始および終了するように指示することが可能です。
Red Hat Enterprise Linux for Real Time カーネルの トレース バリアントをインストールして使用すると、ftrace ユーティリティーを設定できます。
手順3.3 ftrace ユーティリティーの使用
/sys/kernel/debug/tracing/ディレクトリーには、available_tracersという名前のファイルがあります。このファイルには、ftrace で使用可能なすべてのトレーサーが含まれています。利用可能なトレーサーのリストを表示するには、cat コマンドを使用してファイルの内容を表示します。~]# cat /sys/kernel/debug/tracing/available_tracers function_graph wakeup_rt wakeup preemptirqsoff preemptoff irqsoff function nopftrace のユーザーインターフェイスは、debugfs 内の一連のファイルです。ftrace ファイルも/sys/kernel/debug/tracing/ディレクトリーにあります。以下を入力します。~]# cd /sys/kernel/debug/tracingトレースを有効にするとシステムのパフォーマンスに影響する可能性があるため、このディレクトリー内のファイルはrootユーザーのみが変更できます。ftrace ファイル
このディレクトリー内のメインファイルは、以下のとおりです。
- trace
- ftrace トレースの出力を表示するファイル。これは、このファイルが読み込まれ、イベント読み取りを消費しないため、トレースを停止するため、実際にはトレースのスナップショットです。これは、ユーザーがトレースを無効にしてこのファイルを読み取ると、読み取り時に毎回同じ内容を報告します。
- トレースパイプ
- trace と似ていますが、トレースをライブで読み込むために使用されます。プロデューサー/コンシューマートレースで、各読み取りが読み取られるイベントを消費します。ただし、これにより、トレースが読み取られることなく、アクティブなトレースを確認することができます。
- available_tracers
- カーネルにコンパイルされた ftrace トレーサーのリスト。
- current_tracer
- ftrace トレーサーを有効または無効にします。
- events
- トレースするイベントが含まれ、イベントを有効または無効にするのに使用できるディレクトリーと、イベントのフィルターの設定を行うことができます。
- tracing_on
- ftrace バッファーへの録画を無効および有効にします。
tracing_onファイルを介してトレースを無効にしても、カーネル内で行われている実際のトレースは無効になりません。バッファーへの書き込みのみを無効にします。トレースを実行する作業は継続されますが、データはどこにも移動しません。
トレーサー
カーネルの設定方法によっては、指定のカーネルですべてのトレーサーが利用できるとは限りません。Red Hat Enterprise Linux for Real Time カーネルの場合、トレースカーネルとデバッグカーネルは、実稼働用のカーネルとは異なるトレーサーを持ちます。これは、トレーサーの一部にトレーサーがカーネルに設定され、アクティブではない場合に大きなオーバーヘッドが発生するためです。このトレーサーは、トレースおよびデバッグカーネルに対してのみ有効になります。
- function
- 最も広く適用されるトレーサーの 1 つ。カーネル内の関数呼び出しを追跡します。トレースされた関数の数によっては、認識可能なオーバーヘッドが発生する可能性があります。アクティブでない場合にオーバーヘッドがほとんど作成されます。
- function_graph
- function_graph トレーサーは、結果をより視覚的に魅力的な形式で表示するように設計されています。このトレーサーは、関数の終了を追跡し、カーネル内の関数呼び出しのフローを表示します。このトレーサーは、有効な場合は 関数 トレーサーよりもオーバーヘッドが大きくなりますが、無効な場合は同様に低いオーバーヘッドになることに注意してください。
- wakeup
- すべての CPU でアクティビティーが発生することを報告する完全な CPU トレーサー。リアルタイムタスクであるかに関わらず、システム内で最も優先度の高いタスクを起動するのにかかる時間を記録します。非リアルタイムタスクを起動するのにかかる最大時間の記録では、リアルタイムタスクを起動するのにかかる時間が非表示になります。
- wakeup_rt
- すべての CPU でアクティビティーが発生することを報告する完全な CPU トレーサー。現在の最も高い優先度タスクから、ウェイクアップ時間まで経過時間を記録します。リアルタイムタスクの時間を記録します。
- preemptirqsoff
- プリエンプションまたは割り込みを無効にするエリアを追跡し、プリエンプションまたは割り込みが無効となった最大時間を記録します。
- preemptoff
- preemptirqsoff トレーサーに似ていますが、プリエンプションが無効にされた最大間隔のみをトレースします。
- irqsoff
- preemptirqsoff トレーサーに似ていますが、割り込みが無効にされた最大間隔のみをトレースします。
- nop
- デフォルトのトレーサー。トレース機能自体は提供しませんが、イベントがトレーサーにインターリーブする可能性があるため、nop トレーサーは、イベントのトレースに特に関心がある場合に使用されます。
- トレースセッションを手動で開始するには、まず
available_tracersの一覧から使用するトレーサーを選択し、echo コマンドを使用してトレーサーの名前を/sys/kernel/debug/tracing/current_tracerに挿入します。~]# echo preemptoff > /sys/kernel/debug/tracing/current_tracer - function および function_graph トレースが有効になっているかどうかを確認するには、cat コマンドを使用して
/sys/kernel/debug/tracing/options/function-traceファイルを表示します。値が1の場合は有効になっていることを示し、値が 0 の場合は無効になっていることを示します。~]# cat /sys/kernel/debug/tracing/options/function-trace 1デフォルトでは、function および function_graph トレースは有効になっています。この機能をオンまたはオフにするには、適切な値を/sys/kernel/debug/tracing/options/function-traceファイルに エコーします。~]# echo 0 > /sys/kernel/debug/tracing/options/function-trace ~]# echo 1 > /sys/kernel/debug/tracing/options/function-trace重要echo コマンドを使用する場合は、値と > 文字の間に空白文字を配置するようにしてください。シェルプロンプトでは、0>、1>、2> (スペース文字なし) を使用すると、標準入力、標準出力、標準エラーを参照します。誤ってそれらを使用すると、トレースが予期せぬ出力になる可能性があります。function-trace オプションは、waitup_rt、preemptirqsoff などを使用してレイテンシーをトレースすると関数トレースが自動的に有効になり、オーバーヘッドが誇張される可能性があるため便利です。 /debugfs/tracing/ディレクトリー内のさまざまなファイルの値を変更して、トレーサーの詳細とパラメーターを調整します。たとえば、irqsoff、preemptoff、preempirqsoff、および wakeup トレーサーは、レイテンシーを継続的に監視します。tracing_max_latencyに記録されたレイテンシーよりも大きなレイテンシーを記録すると、そのレイテンシーのトレースが記録され、tracing_max_latency は新しい最大時間に更新されます。この方法では、tracing_max_latency は、最後にリセットされてから記録された最高のレイテンシーを常に表示します。最大レイテンシーをリセットするには、tracing_max_latencyファイルに0 をエコーします。設定された量を超えるレイテンシーのみを表示するには、その量をマイクロ秒単位で echo します。~]# echo 0 > /sys/kernel/debug/tracing/tracing_max_latencyトレースのしきい値を設定すると、最大レイテンシー設定が上書きされます。しきい値より大きいレイテンシーが記録されると、最大レイテンシーに関係なく記録されます。トレースファイルを確認すると、最後に記録されたレイテンシーのみが表示されます。しきい値を設定するには、それを超えるとレイテンシーを記録する必要があるマイクロ秒数 を指定します。~]# echo 200 > /sys/kernel/debug/tracing/tracing_thresh- トレースログを表示します。
~]# cat /sys/kernel/debug/tracing/trace - トレースログを保存するには、別のファイルにコピーします。
~]# cat /sys/kernel/debug/tracing/trace > /tmp/lat_trace_log - 関数のトレースは
、/sys/kernel/debug/tracing/set_ftrace_filterファイルの設定を変更することでフィルタリングできます。ファイルにフィルターが指定されていない場合、すべての関数がトレースされます。現在のフィルターを表示するには、cat を使用します。~]# cat /sys/kernel/debug/tracing/set_ftrace_filter - フィルターを変更するには、トレースする関数の名前 を echo します。フィルターでは、検索語の先頭または末尾に * ワイルドカードを使用できます。* ワイルドカードは、単語の先頭 と 末尾の両方で使用することもできます。たとえば、*irq* は 名前に irq が含まれるすべての関数を選択します。ただし、ワイルドカードは単語内で使用できません。検索用語とワイルドカード文字を二重引用符で囲むと、シェルが検索を現在の作業ディレクトリーに拡張しないようにします。フィルターの例を以下に示します。
スケジュール機能のみをトレースします。~]# echo schedule > /sys/kernel/debug/tracing/set_ftrace_filterlockで終わるすべての関数をトレースします。~]# echo "*lock" > /sys/kernel/debug/tracing/set_ftrace_filterspin_で始まるすべての関数をトレースします。~]# echo "spin_*" > /sys/kernel/debug/tracing/set_ftrace_filter- 名前に
cpuが含まれるすべての関数をトレースします。~]# echo "*cpu*" > /sys/kernel/debug/tracing/set_ftrace_filter
注記echo コマンドで単一の > を使用すると、ファイル内の既存の値がすべて上書きされます。ファイルに値を追加する場合は、代わりに >> を使用します。