officeba > 单独文章


虚拟机中虚拟双核同步调度的尝试

摘要 在真实环境下多核物理存在,每个核都能够做到随时在线(活跃)。而在虚拟环境下VMM需要为每个运行的Guest OS都模拟出各自使用的虚拟核(一个或多个),这些虚拟核在真实核上按照时间片方式运行(类似于Native OS环境下的进程)。如果Guest OS需要支持多核,那么VMM就需要为Guest OS模拟出多个虚拟核。本文就讲述Guest Os看到的虚拟多核是否需要同步运行,以及尝试如何同步运行多虚拟核。
背景介绍
我们的研究对象是Xen架构下的虚拟多核同步,虚拟核(VCPU)可以看作是真实CPU的调度对象,这点和操作系统内的进程调度很相似。虚拟核对象(和进程描述符一样是一个管理结构)其中包含了:1 CPU信息,诸如寄存器,GDT地址等;2 调度信息,权重等;3运行信息, 所处的物理CPU,所属domain信息等 4 运行状态信息。
目前Xen的调度方法是以虚拟核为单位独立调度,而并非按照domain(即,Guest OS)为单位进行调度。也就是说任何一个VCPU作为任务都可在任何一个真实CPU上运行(Guest OS 只要看到有活跃的VCPU就可以运行)。这样以VCPU为单位调度的好处是整个虚拟系统的吞吐量大,因为每个VCPU可以根据真实CPU的忙闲选择其上运行,可以让系统利用率最高。而如果以domain为单位调度,那么多虚拟核需要同步调度,这样必须找到同样多的真实核让其同时运行虚拟核才可能完成。显然这种情况会需要为同步付出很大代价。
 
 
可能潜在的问题
对于多数Guest OS来说,虚拟多核没必要同步。因为目前多数操作系统和应用程序都不关心是否两个核都同时可用。但是虚拟多核不同步也的确会给我们带来一些意想不到的问题。
第一个可能的问题是Timeout问题。因为xen只将时钟中断发向VBSP核(原因见虚拟机中GUEST OS时钟(TIMEKEEP)问题的探讨续 中关于 SMP同步一节),所以如果VAP核调度与VBSP核不同步,那么会出现当VAP核调入运行时,发现自己的时间等待队列上的有些定时器已经超时。原因在于当VAP核调出时,VBSP核已经接收了足够多的时钟中断使得系统计时前进了不少,在VAP核看来计时跳跃了一大段,因此VAP核上的定时器超时就不可避免(尤其在时钟中断补偿机制下,更容易出现这个问题)。运行vista做Guest OS有时出现0x00000101蓝屏幕,其提示说第二个核在规定时间内没有收到时钟中断而超时的现象有可能就是因此而引起(当然这只是其中一个原因)。
 
第二个可能问题时并发程序执行性能问题。对于并发程序(如科学计算等)而言,多个线程(或进程)并发执行,又需要相互同步。比如一个线程需要等待另一个线程的结果才能继续执行,这种情况就需要另一个线程能尽快执行得到结果;而多个线程会在不同的CPU上执行以达到并发。这种应用如果在虚拟多核不同步的虚拟机上运行,就会发生因另一个核未及时运行而带来的其它核空等的现象。显然这将造成并发程序执行性能下降。
 
实现方法
那么如何能将虚拟核同步调度呢。从目前xen架构上修改,最直接的方式如下:
1 保证Guest OS对应的虚拟核各自只在不同的物理CPU上才能运行,因此需要禁止目前credit调度算法中的负载均衡,不让物理CPU从别人的调度队列上偷取VCPU运行。
¨         去掉csched_load_balance函数,该函数用于进行vcpu的负载均衡
2 当VBSP被在物理CPU上被选择调度时,发送IPI中断给其它物理核通知其它核将VBSP对应的VAP插入到任务队列头,进行调度(对于双核,默认情况下VBSP运行与AP核,而VAP运行与BSP核)。
        在schedule函数中调用smp_call_cuntion 发送IPI给其它核,让其执行sync_vap_on_bsp
¨         实现IPI中断回调函数,sync_vap_on_bsp,作用是将对应vap插入到对应物理CPU的调度队列头.sync_vap_on_bsp在BSP核上找到对应的vap ,并将vap 插入到BSP核的任务队列头
¨         对vap核不在进行定期的credit更新,而是每次更新时直接等于vbsp核的credit.
¨         发送调度软中断通知BSP核进行调度
 
Schedule 中的插入代码片
    if((next->domain->domain_id ==1)&&(next->vcpu_id==0))
    {
       
        if((per_cpu(schedule_data,0).curr)->domain->domain_id != 1)
        {
               smp_call_function(sync_vap_on_ap, NULL, 0, 0);
        }
注意上述代码片莫要插入到插入到spin_unlock_irq前,因为sm在p_call_function调用要求在非关中断情况下使用,否则会出现死锁.
 
sync_vap_on_bsp中的主要片段
list_for_each( iter, runq )
   {
            svc = __runq_elem(iter);
            if(svc->vcpu->domain->domain_id==1) //这里假定给domain 1进行双核同步调度
             {
              list_del(&svc->runq_elem);
              svc->pri = CSCHED_PRI_TS_UNDER;
              list_add(&svc->runq_elem,runq);
              raise_softirq(SCHEDULE_SOFTIRQ);    //发送软中断,引起调度
              break;
             }
        }
    }
 
思考
1 这种通过IPI的同步调度性能不佳,显然是由于过多中断造成的overhead,如何在同步调度中提高性能是个值得研究的问题.
2 当打开VT中hlt命令准许掉下的开关后(CPU_BASED_HLT_EXITING),由于Xen对该指令的处理是将vcpu堵塞,从而该vcpu不在队列中,因此sync_vap_on_bsp常常找不到对应的vap,因而影响同步效果; 当你禁止hlt指令掉下来后,会发现sync_vap_on_bsp命中率提高了很多.(当vcpu处于block态或者正在执行时,则不能找到vap). 如何解决该问题值得思考.

声明:欢迎各大网站转载本站文章,还请保留一条能直接指向本站的超级链接,谢谢!

时间:2007-11-28 11:13:37,点击:65824


【OfficeBa论坛】:阅读本文时遇到了什么问题,可以到论坛进行交流!Excel专家邮件:342327115@qq.com(大家在Excel使用中遇到什么问题,可以咨询此邮箱)。

【声明】:以上文章或资料除注明为Office自创或编辑整理外,均为各方收集或网友推荐所得。其中摘录的内容以共享、研究为目的,不存在任何商业考虑。如有任何异议,请与本站联系,本站确认后将立即撤下。谢谢您的支持与理解!


相关评论

我要评论

评论内容