调度器的配置参数
/proc/sys/kernel/sched_min_granularity_ns(4000000ns):
sysctl_sched_min_granularity,表示进程最少运行时间,防止频繁的切换,对于交互系统(如桌面),该值可以设置得较小,这样可以保证交互得到更快的响应(见周期调度器的check_preempt_tick过程)
/proc/sys/kernel/sched_latency_ns(20000000ns):
sysctl_sched_latency,表示一个运行队列所有进程运行一次的周期,当前这个与运行队列的进程数有关,如果进程数超过sched_nr_latency(这个变量不能通过/proc设置,它是由(sysctl_sched_latency+ sysctl_sched_min_granularity-1)/sysctl_sched_min_granularity确定的),那么调度周期就是sched_min_granularity_ns*运行队列里的进程数,与sysctl_sched_latency无关;否则队列进程数小于sched_nr_latency,运行周期就是sysctl_sched_latency。显然这个数越小,一个运行队列支持的sched_nr_latency越少,而且当sysctl_sched_min_granularity越小时能支持的sched_nr_latency越多,那么每个进程在这个周期内能执行的时间也就越少,这也与上面sysctl_sched_min_granularity变量的讨论一致。其实sched_nr_latency也可以当做我们cpu load的基准值,如果cpu的load大于这个值,那么说明cpu不够使用了
/proc/sys/kernel/sched_features(3183d=110001101111b):
sysctl_sched_features,该变量表示调度器支持的特性,如GENTLE_FAIR_SLEEPERS(平滑的补偿睡眠进程),START_DEBIT(新进程尽量的早调度),WAKEUP_PREEMPT(是否wakeup的进程可以去抢占当前运行的进程)等,所有的features见内核sech_features.h文件的定义
/proc/sys/kernel/sched_wakeup_granularity_ns(4000000ns):
sysctl_sched_wakeup_granularity,该变量表示进程被唤醒后至少应该运行的时间的基数,它只是用来判断某个进程是否应该抢占当前进程,并不代表它能够执行的最小时间(sysctl_sched_min_granularity),如果这个数值越小,那么发生抢占的概率也就越高(见wakeup_gran、wakeup_preempt_entity函数)
/proc/sys/kernel/sched_child_runs_first(0):
sysctl_sched_child_runs_first,该变量表示在创建子进程的时候是否让子进程抢占父进程,即使父进程的vruntime小于子进程,这个会减少公平性,但是可以降低write_on_copy,具体要根据系统的应用情况来考量使用哪种方式(见task_fork_fair过程)
/proc/sys/kernel/sched_cfs_bandwidth_slice_us(5000us):
sysctl_sched_cfs_bandwidth_slice
/proc/sys/kernel/sched_rt_period_us(1000000us):
sysctl_sched_rt_period,该参数与下面的sysctl_sched_rt_runtime一起决定了实时进程在以sysctl_sched_rt_period为周期的时间内,实时进程最多能够运行的总的时间不能超过sysctl_sched_rt_runtime(代码见sched_rt_global_constraints)
/proc/sys/kernel/sched_rt_runtime_us(950000us):
sysctl_sched_rt_runtime,见上sysctl_sched_rt_period变量的解释
/proc/sys/kernel/sched_compat_yield(0):
sysctl_sched_compat_yield,该参数可以让sched_yield()系统调用更加有效,让它使用更少的cpu,对于那些依赖sched_yield来获得更好性能的应用可以考虑设置它为1
/proc/sys/kernel/sched_migration_cost(500000ns):
sysctl_sched_migration_cost该变量用来判断一个进程是否还是hot,如果进程的运行时间(now - p->se.exec_start)小于它,那么内核认为它的code还在cache里,所以该进程还是hot,那么在迁移的时候就不会考虑它
/proc/sys/kernel/sched_nr_migrate(32):
sysctl_sched_nr_migrate,在多CPU情况下进行负载均衡时,一次最多移动多少个进程到另一个CPU上
/proc/sys/kernel/sched_tunable_scaling(1):
sysctl_sched_tunable_scaling,当内核试图调整sched_min_granularity,sched_latency和sched_wakeup_granularity这三个值的时候所使用的更新方法,0为不调整,1为按照cpu个数以2为底的对数值进行调整,2为按照cpu的个数进行线性比例的调整