aarch64 linux4.9
最近遇到问题需要trace某个rt线程调度情况
trace event filter:
echo 1 > sched/sched_switch/enable echo "next_comm == xxx" > sched/sched_switch/filter (filter 格式可以cat format 同目录下获得)
echo 1 > sched/sched_wakeup/enable echo "next_comm == xxx" > sched/sched_wakeup/filter
echo 1 > sched/sched_migrate/enable echo "next_comm == xxx" > sched/sched_migrate/filter
echo 2048 > buffer_size_kb echo 1 > tracing_on
以上的trace event得到的结果可以观察xxx线程的调度状况包括什么时候被调度到,sleep后什么时候被wakeup 已经再smp上的迁移状况,经由本问题,阅读了linux rt调度的相关code flow 探索了下Linux上的RT线程的load balance
sched_entity sched_group sched_domain sched_class
rt_sched_class 即为rt调度器的描述,
const struct sched_class rt_sched_class = {
.next = &fair_sched_class,
.enqueue_task = enqueue_task_rt, //enqueue task to rt_rq
.dequeue_task = dequeue_task_rt, //dequeue task from rt_rq
.yield_task = yield_task_rt,
.check_preempt_curr = check_preempt_curr_rt,
.pick_next_task = pick_next_task_rt, //pick a task to rt_rq
.put_prev_task = put_prev_task_rt, //put task to right palce to rt_rq when current task sched out
#ifdef CONFIG_SMP
.select_task_rq = select_task_rq_rt, //select cpu for task
.set_cpus_allowed = set_cpus_allowed_common,
.rq_online = rq_online_rt,
.rq_offline = rq_offline_rt,
.task_woken = task_woken_rt,
.switched_from = switched_from_rt,
#endif
.set_curr_task = set_curr_task_rt,
.task_tick = task_tick_rt,
.get_rr_interval = get_rr_interval_rt, //get the SCHED_RR interval for the named process
.prio_changed = prio_changed_rt,
.switched_to = switched_to_rt,
.update_curr = update_curr_rt,
};