2

我正在使用 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()通话中花费的 0.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)。我无法在手册页中找到此问题的答案。

4

1 回答 1

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
于 2017-10-11T16:56:32.560 回答