【问题标题】:Is there a way to output function durations with trace-cmd that is exclusive of nested function durations?有没有办法使用不包含嵌套函数持续时间的 trace-cmd 输出函数持续时间?
【发布时间】:2017-12-01 01:13:06
【问题描述】:

我正在使用 trace-cmd 跟踪负载生成器。这是我的 trace-cmd 报告的输出 sn-p:

     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)。我无法在 the manpage 中找到此问题的答案。

【问题讨论】:

    标签: linux linux-kernel trace ftrace


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2018-12-11
      • 2016-09-27
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2016-09-22
      • 2019-12-25
      相关资源
      最近更新 更多