有没有办法用trace-cmd输出函数持续时间,而不包括嵌套函数持续时间?

时间:2017-06-27 20:43:06

标签: linux linux-kernel tracing ftrace

我正在使用trace-cmd跟踪负载生成器。以下是我的trace-cmd报告的输出片段:

     loadgen-2682  [003]   105.979473: funcgraph_entry:                   |              select_task_rq_fair() {
     loadgen-2682  [003]   105.979473: funcgraph_entry:                   |                select_idle_sibling() {
     loadgen-2682  [003]   105.979473: funcgraph_entry:        0.071 us   |                  idle_cpu();
     loadgen-2682  [003]   105.979474: funcgraph_entry:        0.111 us   |                  idle_cpu();
     loadgen-2682  [003]   105.979474: funcgraph_entry:        0.056 us   |                  idle_cpu();
     loadgen-2682  [003]   105.979475: funcgraph_entry:        0.056 us   |                  idle_cpu();
     loadgen-2682  [003]   105.979475: funcgraph_exit:         2.324 us   |                }
     loadgen-2682  [003]   105.979476: funcgraph_exit:         2.940 us   |              }
     loadgen-2682  [003]   105.979476: funcgraph_entry:                   |              set_task_cpu() {
     loadgen-2682  [003]   105.979476: funcgraph_entry:                   |                migrate_task_rq_fair() {
     loadgen-2682  [003]   105.979476: funcgraph_entry:        0.080 us   |                  remove_entity_load_avg();
     loadgen-2682  [003]   105.979477: funcgraph_exit:         0.537 us   |                }
     loadgen-2682  [003]   105.979477: funcgraph_entry:        0.042 us   |                set_task_rq_fair();
     loadgen-2682  [003]   105.979478: funcgraph_exit:         1.463 us   |              }

所有函数的持续时间看起来都很可疑,因为它们包含嵌套函数调用所花费的时间。例如,我认为select_idle_sibling()的持续时间为2.324 us,包括在idle_cpu()次来电中花费的.294美元(总计)。同样,我认为select_task_rq_fair()包含select_idle_sibling()持续时间。

我要问的是,如果trace-cmd中有一种方法可以关闭它,那么select_task_rq_fair()将显示其持续时间,不包括它所调用的任何函数;即select_task_rq_fair()将显示持续时间为0.616 us(2.940 us - 2.324 us)。我无法在the manpage中找到这个问题的答案。

1 个答案:

答案 0 :(得分:0)

在花了一些时间解决这个问题之后,我可以说答案几乎肯定是“不”。如果你想计算一个函数内部花费的时间,不包括在任何嵌套函数中花费的时间,你需要:

  • 一个堆栈,它会推送具有嵌套调用的funcgraph_entries(即funcgraph_entries没有列出的持续时间),并在看到条目的相应funcgraph_exit调用时弹出
  • 一种跟踪嵌套调用持续时间的方法,以便您可以从目标的funcgraph_exit行中列出的持续时间中减去它们的总计持续时间

这可以通过几种方式完成,但简单的类可能看起来像:

class FunctionDuration:
    def __init__(self, function_name):
        name = function_name
        nested_call_duration = 0
        duration = 0