核心tracepoint
- sched_switch
- sched_wakeup
- sched_waking
- sched_migrate_task
Stat类型
该类型的tracepoint额外带有delay的时间
- sched_stat_blocked
- sched_stat_iowait
- sched_stat_runtime
- sched_stat_sleep
- sched_stat_wait
其他
- sched_kthread_stop, sched_kthread_stop_ret. 在kthread_stop时产生, 一般不是scheduler性能调试的重点
- sched_move_numa, sched_swap_numa, sched_stick_numa. NUMA相关, 从性能分析角度上看, 它们必须在我们的checklist中, 一定程度可以把它们当作是异常(USE)
- sched_pi_setprio. 用于实现rt_mutex的优先级继承, 比如用在futex上.
- sched_process_exec, sched_process_exit, sched_process_fork, sched_process_free. 进程相关的主要事件
- sched_process_hang. 进程hang
- sched_process_wait. 等子进程的状态变化
- sched_wait_task. 等待其他任务unschedule, 比如用于ptrace.
- sched_wake_idle_without_ipi. 如果target cpu上的任务设置了TIF_POLLING_NRFLAG标记 (只有idle进程会设置), 这样idle进程自己去poll TIF_NEED_RESCHED, 这样就不用发ipi中断去通知了
- sched_wakeup_new. 同sched_wakeup, 但针对的是新创建的任务
核心Tracepoint
sched_switch
当调度器决定schedule另一个task运行的时候, 也就是任务切换的时候, 会触发该tracepoint
sched_wakeup / sched_waking
内核会通过try_to_wake_up把任务唤醒, 这会涉及到这sched_wakeup和sched_waking两个tracepoint
上面需要关注的点:
- 可以唤醒current task
- 唤醒on_rq的task比较直接, 在sched_waking和sched_wakeup之间的时间非常短
- 当需要迁移到其他cpu时会有2种方案
- 通过ipi给target cpu发送中断, 在中断处理函数中完成wakeup的后面部分
- 直接在当前cpu上操作target cpu, 所以需要先执行rq_lock操作, 可能会有锁冲突
从上面可以看出, sched_waking和sched_wakeup在wakeup task过程中肯定都会发生, sched_waking事件在ttwu开始的时候触发, 而sched_wakeup在ttwu结束的时候触发. 一般情况下, 这2个tracepoint触发的时间非常靠近, 但是不排除中间会有较大gap.
sched_migrate_task
从资源的角度看, 只有系统中存在多个同类资源(这里是cpu), 为了最大化资源利用率, 就会涉及到migration. 从性能角度看, 这个的影响是比较大的, 也是性能调试的时候必须关注的, migration有没有及时, migration会不会太多 (locality).
Stat类型Tracepoint
stat_iowait / stat_sleep / stat_blocked
- stat_sleep用于记录TASK_INTERRUPTIBLE的时间
- stat_blocked用于记录TASK_UNINTERRUPTIBLE的时间
- stat_iowait用于iowait的场景, 这种情况下stat_iowait和stat_blocked值是一样的
stat_wait
stat_wait和上面的stat不一样的地方在于, stat_wait更反映调度器本身的执行情况.
- wait的起始时间wait_start. 任务状态切到runnable, 但是不能马上在cpu上执行
- task被抢占了, 那么wait_start就是抢占点. put_prev_entity并且prev->on_rq成立
- task唤醒的时候, 从enqueue_entity进入
- wait的结束时间
- 任务马上要在cpu上执行了, set_next_entity
- 任务enqueue后压根没能在该cpu上执行就被dequeue了, update_stats_dequeue
stat_runtime
记录任务的执行时间, 包括runtime, vruntime