第27章 ftrace を使用したレイテンシーのトレース

ftrace ユーティリティーは、RHEL for Real Time Kernel で提供される診断機能の 1 つです。ftrace は、開発者がユーザー空間外で発生するレイテンシーおよびパフォーマンスの問題を分析およびデバッグするのに使用できます。ftrace ユーティリティーには、さまざまな方法でユーティリティーを使用できるさまざまなオプションがあります。これは、コンテキストスイッチの追跡、優先順位の高いタスクでのウェイクアップにかかる時間の測定、割り込みが無効になっている期間の測定、特定の期間中に実行されたカーネル関数のリストの表示に使用できます。

ftrace トレーサーなどの一部のトレーサーは、大量のデータ量を生成し、トレースログ分析を時間の消費タスクに切り替えます。ただし、トレーサーに対し、アプリケーションが重要なコードパスに到達した場合にのみ開始および終了するように指示することが可能です。

前提条件

  • 管理者権限がある。

27.1. ftrace ユーティリティーを使用したレイテンシーの追跡

ftrace ユーティリティーを使用して、レイテンシーを追跡できます。

手順

  1. システムで利用可能なトレーサーを表示します。

    # cat /sys/kernel/debug/tracing/available_tracers
    function_graph wakeup_rt wakeup preemptirqsoff preemptoff irqsoff function nop

    ftrace のユーザーインターフェイスは、debugfs 内の一連のファイルです。

    ftrace ファイルは、/sys/kernel/debug/tracing/ ディレクトリーにあります。

  2. /sys/kernel/debug/tracing/ ディレクトリーに移動します。

    # cd /sys/kernel/debug/tracing

    トレースを有効にするとシステムのパフォーマンスに影響を及ぼす可能性があるため、このディレクトリーのファイルを変更することができるのは root ユーザーのみです。

  3. トレースセッションを開始するには、以下を行います。

    1. /sys/kernel/debug/tracing/available_tracers で利用可能なトレーサーのリストから、使用するトレーサーを選択します。
    2. セレクターの名前を /sys/kernel/debug/tracing/current_tracer に挿入します。

      # echo preemptoff > /sys/kernel/debug/tracing/current_tracer
      注記

      echo コマンドと > 1 つを合わせて使用する場合は、ファイル内の既存の値が上書きされます。ファイルに値を追記する場合は、代わりに '>>' を使用します。

  4. function-trace オプションは、wakeup_rtpreemptirqsoff などを使用してレイテンシーをトレースすると、関数のトレースが自動的に有効になり、オーバーヘッドが誇張される可能性があるため便利です。

    function および function_graph のトレースが有効になっているかどうかを確認します。

    # cat /sys/kernel/debug/tracing/options/function-trace
    1
    • 値を 1 に設定すると、functionfunction_graph のトレースが有効になります。
    • 値が 0 の場合は、function および function_graph のトレースが無効になっていることを示します。
  5. デフォルトでは、function および function_graph トレースは有効になっています。function および function_graph のトレースのオン/オフを切り替えるには、/sys/kernel/debug/tracing/options/function-trace に適切な値を echo で追加します。

    # echo 0 > /sys/kernel/debug/tracing/options/function-trace
    # echo 1 > /sys/kernel/debug/tracing/options/function-trace
    重要

    echo コマンドを使用する場合は、値と > 文字の間に空白文字を配置するようにしてください。0>1>、および 2> (空白文字なし) を使用するシェルプロンプトでは、標準入力、標準出力、および標準エラーを参照します。誤ってそれらを使用すると、トレースが予期せぬ出力になる可能性があります。

  6. /debugfs/tracing/ ディレクトリー内のさまざまなファイルの値を変更して、トレーサーの詳細とパラメーターを調整します。

    以下に例を示します。

    irqsoffpreemptoffpreempirqsoff、および wakeup トレーサーは、レイテンシーを継続的に監視します。tracing_max_latency に記録されたレイテンシーよりも大きいレイテンシーを記録すると、そのレイテンシーのトレースが記録され、tracing_max_latency が新しい最大時間に更新されます。これにより、tracing_max_latency は、最後にリセットされてから記録された最大のレイテンシーを常に表示します。

    • 最大レイテンシーをリセットするには、0tracing_max_latency ファイルに echo で追加します。

      # echo 0 > /sys/kernel/debug/tracing/tracing_max_latency
    • 設定された量よりも大きいレイテンシーのみを表示するには、マイクロ秒単位で量を echo で出力します。

      # echo 200 > /sys/kernel/debug/tracing/tracing_max_latency

      トレースのしきい値を設定すると、最大レイテンシー設定が上書きされます。しきい値より大きいレイテンシーが記録されると、最大レイテンシーに関係なく記録されます。トレースファイルを確認すると、最後に記録されたレイテンシーのみが表示されます。

    • しきい値を設定するには、それを超えるとレイテンシーを記録する必要があるマイクロ秒数を echo で出力します。

      # echo 200 > /sys/kernel/debug/tracing/tracing_thresh
  7. トレースログを表示します。

    # cat /sys/kernel/debug/tracing/trace
  8. トレースログを保存するには、別のファイルにコピーします。

    # cat /sys/kernel/debug/tracing/trace > /tmp/lat_trace_log
  9. トレースされている関数を表示します。

    # cat /sys/kernel/debug/tracing/set_ftrace_filter
  10. /sys/kernel/debug/tracing/set_ftrace_filter で設定を編集して、トレースしている関数をフィルターにかけます。ファイルにフィルターが指定されていない場合、すべての関数がトレースされます。
  11. フィルター設定を変更するには、トレースする関数名を echo で追記します。このフィルターでは、検索用語の先頭または末尾に * ワイルドカードを使用できます。

    例は ftrace の例 を参照してください。