以下を使用して、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モジュールのバージョンの問題ですか?
挨拶、
答え2
デフォルトでは、 ftrace は "sched_clock()" コードで使用するすべてを使用します。ただし、/sys/kernel/tracing/trace_clock ファイルで ftrace クロックを変更できます。 x86には次のものがあります。
# cat /sys/kernel/tracing/trace_clock
[local] global counter uptime perf mono mono_raw boot x86-tsc
「ローカル」クロックは sched_clock() と同じです。しかし、エコーで別の時計を選択することができます。 x86-tscを時計として使用するには、次の手順を実行します。
# echo x86-tsc > /sys/kernel/tracing/trace_clock
アーキテクチャコードは、ARCH_TRACE_CLOCKSを定義して新しい時計を追加できます。 Arch/x86/include/asm/trace_clock.h にある x86-tsc の生成方法をご覧ください。