ftraceの精度をマイクロ秒単位で向上させるには?

ftraceの精度をマイクロ秒単位で向上させるには?

以下を使用して、Android環境でFTraceファイルを生成しようとしています。

root@adroid:# echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
root@adroid:# echo 1 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# cat /sys/kernel/debug/tracing/trace > mytracefile.txt
root@adroid:# echo 0 > /sys/kernel/debug/tracing/tracing_on
root@adroid:# echo 0 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable

問題は、mytracefile.txtタイムスタンプの精度がミリ秒単位であることです。

          <idle>-0     [000] d.h7 14186.690000: sched_wakeup: comm=tfm_b6bcf800 pid=1714 prio=35 success=1 target_cpu=000
          <idle>-0     [000] d..3 14186.690000: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=tfm_b6bcf800 next_pid=1714 next_prio=35
    tfm_b6bcf800-1714  [000] d..3 14186.690000: sched_switch: prev_comm=tfm_b6bcf800 prev_pid=1714 prev_prio=35 prev_state=D|W ==> next_comm=swapper/0 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
 Player Aud Mixe-146   [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=D ==> next_comm=swapper/1 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.690000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.690000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35
 Player Aud Mixe-146   [001] d..3 14186.690000: sched_switch: prev_comm=Player Aud Mixe prev_pid=146 prev_prio=35 prev_state=S ==> next_comm=swapper/1 next_pid=0 next_prio=120
          <idle>-0     [001] d.h3 14186.700000: sched_wakeup: comm=Player Aud Mixe pid=146 prio=35 success=1 target_cpu=001
          <idle>-0     [001] d..3 14186.700000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Player Aud Mixe next_pid=146 next_prio=35

通常、14186.690000ではなく、14186.691234などのマイクロ秒単位でなければなりません。

私が持っている他のすべてのオプション(ローカル、グローバル、カウンタ)をテストしましたが、trace_clock結果は常に同じでした。このパラメータを変更しても、出力ファイルでは何も変わりません。

慎重に従った。FTraceドキュメントしかし、設定で何を変更する必要があるのか​​わかりません。

インターネット検索でこのバグレポートのみが見つかりましたが、回避策はありません。http://lists.linaro.org/pipermail/linaro-dev/2011-February/002720.html

どんな提案がありますか?

カーネルにインストールする必要がある他のモジュールはありますか?

  • Androidバージョン:4.2.2
  • Linuxカーネルバージョン:3.4.7

dmesg出力にはミリ秒の精度も表示されます。

<4>[   38.130000] oom_adj 0 => oom_score_adj 0
<4>[   38.130000] oom_adj 1 => oom_score_adj 58
<4>[   38.140000] oom_adj 2 => oom_score_adj 117
<4>[   38.140000] oom_adj 4 => oom_score_adj 235
<4>[   38.150000] oom_adj 9 => oom_score_adj 529
<4>[   38.150000] oom_adj 15 => oom_score_adj 1000

修正する:

私たちはAndroid ftraceファイル(含む)のためのグラフパーサーを構築しています。アトラス追跡する)。そのため、可能な限り最高の精度を持つことが重要です。

同じ機器と他のソフトウェアツールを使用して、マイクロ秒の精度を正常に達成できます。

これで編集する予定です。ftrace.cタイムスタンプの生成方法を次のソースコードに変更します。

static inline uint64_t my_custom_jiffies(void)
{
         struct timeval tv;
         gettimeofday(&tv, NULL);
         return tv.tv_sec*1000000 + tv.tv_usec;
}

個人的には、これはソースコードを変更せずに可能でなければならないので、これは非常に良いソリューション/アーキテクチャ/実装であるとは思わない。しかし、これが現在私たちが持っている唯一のアイデアです。

どう思いますか?

ベストアンサー1

明らかに、この問題はAndroidとは関係ありません。カスタムLinuxビルドでテストしましたが、まだ同じ問題があります。FTraceミリ秒精度を生成しますが、他のツールはマイクロ秒精度を生成できます。たぶん、FTraceモジュールのバージョンの問題ですか?

挨拶、

おすすめ記事