调度器59—CONFIG_SCHED_DEBUG 的作用
一、使能 CONFIG_SCHED_DEBUG 提供的文件
1. /proc/pid/sched 文件
cat显示统计数据,echo清0,无论echo的是啥。
2. /proc/sys/kernel 下的
sched_min_granularity_ns
sched_latency_ns
sched_sync_hint_enable
sched_cstate_aware
sched_wakeup_granularity_ns
sched_tunable_scaling
sched_migration_cost_ns
sched_nr_migrate
sched_time_avg_ms
sched_schedstats
//若使能 CONFIG_IO_SCHED_OPTIMIZE 还有:
io_sched_optimize
//若使能 CONFIG_NUMA_BALANCING 还有:
numa_balancing_scan_delay_ms
numa_balancing_scan_period_min_ms
numa_balancing_scan_period_max_ms
numa_balancing_scan_size_mb
numa_balancing
3. /proc/sched_debug 文件
二、提供启动参数 sched_debug
1. 作用
static int __init sched_debug_setup(char *str) //topology.c { sched_debug_enabled = true; return 0; } early_param("sched_debug", sched_debug_setup); //topology.c sched_init_domains //topology.c partition_sched_domains //topology.c build_sched_domains cpu_attach_domain //sched/topology.c sched_domain_debug //sched/topology.c if (sched_debug_enabled) { printk(KERN_DEBUG "CPU%d attaching sched-domain(s):\n", cpu); for (;;) { if (sched_domain_debug_one(sd, cpu, level, sched_domains_tmpmask)) break; level++; sd = sd->parent; if (!sd) break; } }
三、Feature使能与关闭
1. 对于 default y 的,需要使用"CONFIG_XX is not set" 来关闭
/lib/Kconfig.debug config SCHED_DEBUG bool "Collect scheduler debugging info" depends on DEBUG_KERNEL && PROC_FS default y //user-perf_defconfig # CONFIG_SCHED_DEBUG is not set
四、代码分析
1. 使能后编译住sched/debug.c
msm-4.14/kernel/sched$ cat Makefile
obj-$(CONFIG_SCHED_DEBUG) += debug.o //代码编译上会编译住debug.c
2. deadlne.c中的使用
/proc/sched_debug sched_debug_show //sched/debug.c print_cpu //sched/debug.c print_dl_stats(*m, cpu) //deadline.c print_dl_rq(*m, cpu, *dl_rq)//sched/debug.c
3. sched/core.c 中的使用
sysrq_sched_debug_show() //sched/core.c //调用路径: echo t > /proc/sysrq-trigger sysrq_showstate_op.handler //"show-task-states(t)" 对应的handler回调 sysrq_handle_showstate //sysrq.c fn_show_state //tty/vt/keyboard.c show_state() //sched/debug.h 传参0 sysrq_handle_showstate_blocked //sysrq.c 传参 TASK_UNINTERRUPTIBLE=2,无效 show_state_filter(ustate_filter) //sched/core.c 参数为0才执行 sysrq_sched_debug_show //sched/debug.c 使能 CONFIG_SCHED_DEBUG 才存在 for_each_online_cpu(cpu) print_cpu(NULL, cpu);
echo t > /proc/sysrq-trigger 会触发打印每一个进程的内核栈,如下:
[ 565.347148] (7)[7110:sh]fxp.monlolo S 0 838 1073 4078 623 0x00000000 [ 565.347155] (7)[7110:sh]Call trace: [ 565.347159] (7)[7110:sh] __switch_to+0x118/0x134 [ 565.347161] (7)[7110:sh] __schedule+0x7c0/0xa78 [ 565.347167] (7)[7110:sh] schedule+0x70/0x90 [ 565.347172] (7)[7110:sh] schedule_hrtimeout_range_clock+0xc0/0xe8 [ 565.347174] (7)[7110:sh] schedule_hrtimeout_range+0x10/0x18 [ 565.347180] (7)[7110:sh] SyS_epoll_wait+0x2ac/0x3c4 [ 565.347184] (7)[7110:sh] SyS_epoll_pwait+0x108/0x168 [ 565.347186] (7)[7110:sh] el0_svc_naked+0x34/0x38
若正在运行,会多打印出"running task",打印如下:
[ 565.299661] (4)[7110:sh]UnityMain R running task 0 32556 28 3430 623 0x00000000 [ 565.299664] (4)[7110:sh]Call trace: [ 565.299667] (4)[7110:sh] __switch_to+0x118/0x134 [ 565.299670] (4)[7110:sh] __schedule+0x7c0/0xa78 [ 565.299672] (4)[7110:sh] schedule+0x70/0x90 [ 565.299675] (4)[7110:sh] futex_wait_queue_me+0xbc/0x108 [ 565.299678] (4)[7110:sh] futex_wait+0x104/0x2d0 [ 565.299681] (4)[7110:sh] do_futex+0x114/0x18e4 [ 565.299684] (4)[7110:sh] SyS_futex+0x140/0x1ac [ 565.299687] (4)[7110:sh] el0_svc_naked+0x34/0x38
第一行各字段分别为:p->comm, task_state_to_char(p), "running task"(正在runing的有,sleep的无),0, p->nvcsw, p->nivcsw, p->pid, p->real_parent->pid, task_thread_info(p)->flags
# ps -e| grep fxp.monlolo USER PID PPID VSZ RSS WCHAN ADDR S NAME system 4078 623 7980716 237860 SyS_epoll_wait 0 S com.fxp.monlolo
3. rt.c中的使用
print_rt_stats //rt.c //调用路径: print_cpu //sched/debug.c 同上 print_rt_stats(*m, cpu) //rt.c
五、补充
1. 上面说到了打印内核栈,这里增量两个打印每CPU调用栈和进程用户栈的方法
# echo l > /proc/sysrq-trigger 打印每个CPU当前调用栈
thaw-filesystems(j) show-backtrace-all-active-cpus(l) show-task-states(t) show-blocked-tasks(w)
# debuggerd -b <pid> 打印pid进程所有线程的用户栈
posted on 2023-09-22 22:32 Hello-World3 阅读(487) 评论(0) 编辑 收藏 举报