perf stat如何统计上下文切换?与sched_switch事件有何差异?
perf stat上下文切换计数相关问题解答
1. context-switches计数的统计逻辑
perf stat的context-switches统计的是完整的上下文切换动作次数——每发生一次从进程A切换到进程B的操作,计数加1,既不是单独统计调度入,也不是单独统计调度出。
内核kernel/sched/core.c中的__schedule()函数,在prev != next时递增的switch_count计数器,就对应这个完整切换动作。而task_struct里的nvcsw(自愿上下文切换)和nivcsw(非自愿上下文切换)是进程级计数器,统计的是当前进程被调度出去的次数:比如调用阻塞read触发自愿切换时nvcsw加1,时间片耗尽被抢占时nivcsw加1,这和perf stat的全局/进程关联的完整切换计数维度不同。
2. context-switches与sched:sched_switch的计数差异
两者统计范围存在本质区别:
context-switches:默认仅统计与目标应用相关的上下文切换——只有当切换涉及目标进程(要么是目标进程被调度入,要么是被调度出)时,才会被计入。sched:sched_switch:这个tracepoint会捕获系统中所有的上下文切换,包括其他无关进程之间的切换,所以计数远高于context-switches。
如果需要让sched:sched_switch仅统计目标应用相关的切换,可以使用过滤条件:
perf stat -e 'sched:sched_switch.prev_comm=my_application' -e 'sched:sched_switch.next_comm=my_application' -- my_application
此时统计结果会和context-switches接近(可能存在微小误差,源于统计机制的细节差异)。
内容的提问来源于stack exchange,提问作者Bahamas
相关产品推荐
相关产品推荐

