虚拟机(xen)中credit调度算法分析(一)
1.每个物理CPU下面都有一个虚拟CPU的运行队列2.每个运行队列中的VCPU都有一个credit值3. credit表示VCPU的priority的价值4.CPU调度的是最先入队的处于under状态下的VCPU5.每10msec 为一个时间片,相应一次中断。如果被调度的VCPU的credit处于OVER状态那么它将不再被继续调度,重新计算credit值,调度后面的
1.每个物理CPU下面都有一个虚拟CPU的运行队列
2.每个运行队列中的VCPU都有一个credit值
3. credit表示VCPU的priority的价值
4.CPU调度的是最先入队的处于under状态下的VCPU
5.每10msec 为一个时间片,相应一次中断。如果被调度的VCPU的credit处于OVER状态那么它将不再被继续调度,重新计算credit值,调度后面的处于under状态下的第一个VCPU
6.如果进行了3个时间片也就是30msec时,原先的VCPU还是没有处于OVER状态,那么这个VCPU也将不被继续调度,credit值的重计算,同5后面的步骤
7.代码中的计算公式VCPU的credit = credit –CSCHED_CREDITS_PER_TICK (100)+30msec/n(VCPU的数)
8.处于OVER状态的VCPU credit的值不被增加
概念:Credit, Weight, Cap
想彻底搞清楚这三个词的概念,我想最重要的是把这个函数读懂:sched_credit.c/csched_acct()
Credit: 这是针对Scheduler而言的,而不是针对Domain.
csched_priv.credit = CSCHED_CREDITS_PER_ACCT * #_of_PCPU. (for example: 300 * 4 = 1200)
Weight: 这个是针对Domain而言的,Scheduler根据各个domain的Weight,来分配credit。是一个“相对”的概念
比如说:256:256和512:512是一样的,彼此各占一半。但有什么区别呢?
512:512相对于256:256,控制的精度更高。
/*
* A domain's fair share is computed using its weight in competition
* with that of all other active domains.
*
* At most, a domain can use credits to run all its active VCPUs
* for one full accounting period. We allow a domain to earn more
* only when the system-wide credit balance is negative.
*/
Cap: 这也是针对Domain而言的,是一个“绝对”概念。100代表一整颗PCPU的Cycles。50代表最多可以运行半个PCPU的Cycles.
在csched_acct这个函数中:
(1) 根据各个domain的weight情况,把total_credit分配到各个domain中
credit_fair = ( ( credit_total * sdom->weight) + (weight_total - 1)) / weight_total;
(2) 再把domain的Credit平均分配到domain的各个VCPU中
credit_fair = ( credit_fair + ( sdom->active_vcpu_count - 1 )) / sdom->active_vcpu_count;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snailhit/archive/2010/12/30/6107279.aspx
虚拟机(xen)中credit调度算法分析
宋伟 联想研究院
调度简介
在虚拟机xen中主要有两中调度算法,一种是credit算法,另一种是sedf算法。Credit算法就是让每一个vcpu(虚拟cpu)都可以公平的使用物理cpu的资源。Sedf算法可以根据每个vcpu负载的大小动态的调整vcpu的优先级。
在虚拟机xen中关于调度的代码是这样的:
void __init scheduler_init(void)
{
int i;
open_softirq(SCHEDULE_SOFTIRQ, schedule); //打开/注册schedule这个软中断
for_each_cpu ( i )
{ //为每个cpu定一个定时器。在时间到后就调用回调函数s_time_fn, 并且在回调函数中调用产生软中断(设置bit),在cpu 发送vmexit后会检查软中断的mask位,如果发现某些位被置上后就会调用其中断回调函数。
spin_lock_init(&per_cpu(schedule_data, i).schedule_lock);
init_timer(&per_cpu(schedule_data, i).s_timer, s_timer_fn, NULL, i);
}
for ( i = 0; schedulers[i] != NULL; i++ )
{
ops = *schedulers[i];
if ( strcmp(ops.opt_name, opt_sched) == 0 )
break;
}
if ( schedulers[i] == NULL )
printk("Could not find scheduler: %s/n", opt_sched);
printk("Using scheduler: %s (%s)/n", ops.name, ops.opt_name);
SCHED_OP(init);
}
在schedule.c中其实是对调度的抽象层,具体的实现在sched_credit.c or sched_sedf.c中。至于要使用sedf或者credit算法。可以由宏定义来指明。
Credit算法
Credit算法:
每个物理cpu都有一个runq,这个runq是一个以每个vcpu的priority的大小来排序的。Priority有over(above fair share) and down(below fair share)
图(一)调度队列整体结构
图(二)Credit scheduler调度队列具体实现
图(三)内核启动调度器流程
图(四)调度器初始化流程
图(五)Credit 调度的优先级计算方法
我们可以看到bsp对其他的ap的runq队列按照计算的优先级进行排序。
图(六) Credit算法偷取任务流程图
更多推荐
所有评论(0)