如何將 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.691234 而不是 14186.690000。
我已經測試了我擁有的所有其他
trace_clock
選項(本地、全域和計數器),但結果始終相同。更改該參數不會更改輸出文件中的任何內容。我仔細閱讀了 FTrace 文件,但我不知道還有哪些配置需要更改。
在網際網路上搜尋我只能找到這個錯誤報告,但沒有解決: http: //lists.linaro.org/pipermail/linaro-dev/2011-February/002720.html
有什麼建議嗎?
我必須安裝核心中的其他模組嗎?
- 安卓版本: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 文件(包括atrace跟踪)建構圖形解析器。這就是為什麼擁有盡可能高的精度非常重要的原因。
使用相同的設備和其他軟體工具,我們可以成功地達到微秒級精度。
所以,現在我們計劃編輯ftrace.c原始碼來修改時間戳的生成方式:
static inline uint64_t my_custom_jiffies(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec*1000000 + tv.tv_usec; }
我個人認為這不是一個很好的解決方案/架構/實現,因為這應該可以在不修改原始碼的情況下實現……但這是我們目前唯一的想法。
你怎麼看 ?
顯然這個問題與安卓無關。我們已經用我們定制的 Linux 版本進行了測試,但我們仍然遇到同樣的問題:FTrace產生毫秒精度,而其他工具能夠產生微秒精度。也許是 FTrace 模組版本問題?
問候,
預設情況下,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 是如何創建的。