2012年8月13日星期一

部分cfs调度器的tuning参数

最近看了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上。

没有评论:

发表评论