1.背景
- 需要分析生产环境的调度问题,如线程的调度延迟有多少,在哪些时间点延迟比较明显,影响其调度的主要原因是什么?
- 其次,我们希望可以比较直观的展示调度延迟情况。最好能对接perfetto的UI和后处理,因为perfetto已经用于分析比较多的性能数据,可以和调度数据进行整合.
我们期望最终能做成如下效果:
- 开销要小,能够在生产环境中使用. perfetto本身的ftrace采集数据太多,性能损耗较大
- 可以对指定进程或线程进行分析,可以只对大于某个范围的调度延迟进行统计,减少数据量和性能损耗
2.解决方案分析
我们可以利用ebpf实现调度延迟的监控
2.1 ebpf监控原理
调度延迟是指线程进入runnable状态后,等待其实际获得CPU开始运行之间的时间。
我们可以跟踪线程从放入就绪队列到实际被选中并获得CPU的过程。
其中linux中,线程放入就绪队列是通过以下函数实现的:
2.1.1 sched_wakeup
, sched_wakeup_new
而实际选中并获得cpu是通过以下函数实现的:
2.1.2 sched_switch
因此,我们只需在2.1.1时记录线程的tid和时间,