BLOG

Record, summarize, and improve.

tracepoint_sched

核心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