我正在使用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中找到这个问题的答案。
答案 0 :(得分:0)
在花了一些时间解决这个问题之后,我可以说答案几乎肯定是“不”。如果你想计算一个函数内部花费的时间,不包括在任何嵌套函数中花费的时间,你需要:
这可以通过几种方式完成,但简单的类可能看起来像:
class FunctionDuration:
def __init__(self, function_name):
name = function_name
nested_call_duration = 0
duration = 0