有没有一种方法可以使用不包含嵌套函数持续时间的 trace-cmd 输出函数持续时间?

Is there a way to output function durations with trace-cmd that is exclusive of nested function durations?

我正在使用 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 us(总计)。同样,我相信 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.

中找到此问题的答案

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

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

这可以通过几种方式完成,但简单的 class 可能类似于:

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