最近看了rhel6.2内核的cfs进程调度代码,作为学习总结,把相关的部分tuning参数做了下整理,摘录如下。
* sched_child_runs_first
当创建子进程时,保证子进程会在父进程之前运行。在创建子进程时,首先会
将子进程的虚拟运行时间设置为min_vruntime,这个min_vruntime大约等于当
前运行队列中所有进程的虚拟运行时间的最小值,然后,看sched_features中
是否设置了START_DEBIT位,如果这一位被设置了,表示要给新创建的进程的
虚拟运行时间再增加一些,这样会让它的运行时间向后延迟,以防进程通过不
停的fork来不停的获得cpu时间。当设置完子进程的虚拟运行时间之后,会判
断sched_child_runs_first是不是设置为1,如果是的话就比较父进程和子进
程的虚拟运行时间,如果父进程的虚拟运行时间比较小的话,就交换父子进程
的虚拟运行时间,这样子进程就会在父进程之前运行了。
* sched_min_granularity_ns
这个值在两个地方会用到。一个是计算nice值为0的进程运行一次需要的时间。
如果进程的总数大于sched_latency/sched_min_granularity个,就用
sched_min_granularity_ns的值乘以进程的个数,将乘积作为nice值为0的进程
调度一次运行的时间。然后每个进程会以此为基准,按照自己的优先级来计算
自己被调度一次的运行时间。。另一个用途是判断当前进程是否要被调度下
CPU的时候。如果当前进程的执行时间已经超过了它被调度一次所允许的执行时
间(其实也可以说是时间片,尽管cfs声称自己没有时间片),那么必然要被调
度下CPU。但如果它的时间片还没到期,在判断它的运行时间是不是比
sched_min_granularity_ns小。如果是的话,那么就肯定不把它调度下CPU,如
果进程的运行时间比sched_min_granularity_ns大的话,就用当前进程的虚拟
运行时间减去runqueue上虚拟运行时间最小的进程的虚拟运行时间,如果差值
比当前进程的时间片(这个时间片确实不是传统的时间片,总是随当前负载的
状况变化)还大的话,那么当前进程也会被调度下CPU。
* sched_latency_ns
计算nice值为0的进程运行一次所需的时间时用到。。如果进程总数小于等于
sched_latency/sched_min_granularity个,就将sched_latency_ns作为nice
值为0的进程运行一次的时间,否则按照前面介绍sched_min_granularity_ns
时的方法计算。
* sched_wakeup_granularity_ns
判断一个进程是否可以抢占当前进程时用到。如果该进程的虚拟运行时间比当
前进程的虚拟运行时间大,那么肯定不能抢占。如果该进程的虚拟运行时间比
当前进程的虚拟运行时间小的话,就计算出两者之差vdiff。如果vdiff大于一
定的范围的话,就可以抢占,否则不可以抢占。
sched_wakeup_granularity_ns就是用来确定这个范围的。它表示一个nice值
为0的进程要抢占当前进程,它的虚拟运行时间需要被当前进程的虚拟运行时
间小多少,其他优先级的进程以此为基准进行调整,优先级越高的进程,需要
的差值越小。
* sched_tunable_scaling
当内核试图调整sched_min_granularity,sched_latency和
sched_wakeup_granularity这三个值的时候所使用的更新方法,0为不调整,1
为按照cpu个数以2为底的对数值进行调整,2为按照cpu的个数进行线性比例的
调整。
* sched_features
每个bit都表示调度器的一个特性是否打开。在sched_features.h文件中记录
了全部的特性。
* sched_migration_cost
用来判断一个进程是不是cache hot的。如果进程的运行时间小于
sched_migration_cost就认为是cache host的,在多CPU之间进行负载均衡的
时候不会转移cache hot的进程。
* sched_nr_migrate
在多CPU情况下进行负载均衡时,一次最多移动sched_nr_migrate个进程到另
一个CPU上。
* sched_child_runs_first
当创建子进程时,保证子进程会在父进程之前运行。在创建子进程时,首先会
将子进程的虚拟运行时间设置为min_vruntime,这个min_vruntime大约等于当
前运行队列中所有进程的虚拟运行时间的最小值,然后,看sched_features中
是否设置了START_DEBIT位,如果这一位被设置了,表示要给新创建的进程的
虚拟运行时间再增加一些,这样会让它的运行时间向后延迟,以防进程通过不
停的fork来不停的获得cpu时间。当设置完子进程的虚拟运行时间之后,会判
断sched_child_runs_first是不是设置为1,如果是的话就比较父进程和子进
程的虚拟运行时间,如果父进程的虚拟运行时间比较小的话,就交换父子进程
的虚拟运行时间,这样子进程就会在父进程之前运行了。
* sched_min_granularity_ns
这个值在两个地方会用到。一个是计算nice值为0的进程运行一次需要的时间。
如果进程的总数大于sched_latency/sched_min_granularity个,就用
sched_min_granularity_ns的值乘以进程的个数,将乘积作为nice值为0的进程
调度一次运行的时间。然后每个进程会以此为基准,按照自己的优先级来计算
自己被调度一次的运行时间。。另一个用途是判断当前进程是否要被调度下
CPU的时候。如果当前进程的执行时间已经超过了它被调度一次所允许的执行时
间(其实也可以说是时间片,尽管cfs声称自己没有时间片),那么必然要被调
度下CPU。但如果它的时间片还没到期,在判断它的运行时间是不是比
sched_min_granularity_ns小。如果是的话,那么就肯定不把它调度下CPU,如
果进程的运行时间比sched_min_granularity_ns大的话,就用当前进程的虚拟
运行时间减去runqueue上虚拟运行时间最小的进程的虚拟运行时间,如果差值
比当前进程的时间片(这个时间片确实不是传统的时间片,总是随当前负载的
状况变化)还大的话,那么当前进程也会被调度下CPU。
* sched_latency_ns
计算nice值为0的进程运行一次所需的时间时用到。。如果进程总数小于等于
sched_latency/sched_min_granularity个,就将sched_latency_ns作为nice
值为0的进程运行一次的时间,否则按照前面介绍sched_min_granularity_ns
时的方法计算。
* sched_wakeup_granularity_ns
判断一个进程是否可以抢占当前进程时用到。如果该进程的虚拟运行时间比当
前进程的虚拟运行时间大,那么肯定不能抢占。如果该进程的虚拟运行时间比
当前进程的虚拟运行时间小的话,就计算出两者之差vdiff。如果vdiff大于一
定的范围的话,就可以抢占,否则不可以抢占。
sched_wakeup_granularity_ns就是用来确定这个范围的。它表示一个nice值
为0的进程要抢占当前进程,它的虚拟运行时间需要被当前进程的虚拟运行时
间小多少,其他优先级的进程以此为基准进行调整,优先级越高的进程,需要
的差值越小。
* sched_tunable_scaling
当内核试图调整sched_min_granularity,sched_latency和
sched_wakeup_granularity这三个值的时候所使用的更新方法,0为不调整,1
为按照cpu个数以2为底的对数值进行调整,2为按照cpu的个数进行线性比例的
调整。
* sched_features
每个bit都表示调度器的一个特性是否打开。在sched_features.h文件中记录
了全部的特性。
* sched_migration_cost
用来判断一个进程是不是cache hot的。如果进程的运行时间小于
sched_migration_cost就认为是cache host的,在多CPU之间进行负载均衡的
时候不会转移cache hot的进程。
* sched_nr_migrate
在多CPU情况下进行负载均衡时,一次最多移动sched_nr_migrate个进程到另
一个CPU上。