如何将 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.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 文件构建一个图形解析器(包括阿特拉斯痕迹)。这就是为什么拥有尽可能高的精度非常重要。

使用相同的设备和其他软件工具,我们可以成功地达到微秒精度。

所以,现在我们计划编辑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 来添加新时钟。查看 x86-tsc 是如何创建的,位于 arch/x86/include/asm/trace_clock.h。

相关内容