KVM的vCPU算法和Xen的Credit算法对比

KVM的vCPU调度算法的原理

KVM的vCPU的整个生命周期都在Qemu线程的上下文中,在Kernel(root模式)、User(root模式)、Guest(non-root模式)下互相切换。其中每个vCPU对应一个Qemu线程,直接使用内核中的调度器进行调度,有以下三种调度器:

  • O(N)调度器
  • O(1)调度器
  • CFS调度器
O(N)调度器

O(N)调度器的思想是每个进程创建时都会初始化改进程的可执行时间片数counter,每次时钟中断counter–,当counter为0时就会换出CPU,然后重新遍历runqueue(存储当前所有的running进程),取出动态优先级最高且有时间片的进程进行调度。由于采用轮询的方式,所以复杂度为O(N),因此也叫O(N)调度器。但存在性能和扩展性低、特殊情况等待时间长、不支持实时进程等缺点。

O(1)调度器

O(1)调度器利用了两个队列,Active和Expired,Active用于活动任务(存放有时间片的进程),Expired用于过期任务(存放时间片用完的),每个队列有140个槽位,对应0-139优先级。对应静态优先级的进程加入对应的槽位,再加上每个队列配一个bitmap,就可以通过O(1)找到当前数据中优先级最高的进程。但是O(1)调度器在交互式程序的时候出现了很多卡顿,其根本原因可能是用归类的方法去分析线性分布的事物。

CFS调度器

CFS调度器(Comletely Fair Scheduler)主要思想是维护为进程提供处理器时间方面的平衡。每个进程有自己的虚拟时间,其增长速度与进程权重成反比,进程权重对应于进程的优先级。也就说低优先级任务具有更高的衰减系数,高优先级任务具有较低的衰减系数。这意味着与高优先级任务相比,低优先级任务执行的时间消耗地更快。这就避免了维护按优先级调度的运行队列。与之前的linux调度器不同,CFS调度器没有将进程维护在运行队列中,而是维护一个以时间为顺序的红黑树。CFS调度器为每个CPU分配一个按虚拟时间从小到大排序的红黑树的结构。红黑树最左边的节点的虚拟时间最小,最右边的虚拟时间越大。每次调度,从左侧将虚拟时间最小的进程来运行,运行完之后,如果还处于就绪态,则插回树中。

CFS调度器还有组调度的概念。这是为了处理产生很多其他进程的进程的情况,而引入的一种调度公平的方法。产生进程的进程在整个组中共享它们的虚拟运行时间,而单个进程维持其独立的虚拟运行时间。这样单个任务会受到与组大致相同的调度时间。

Xen Credit算法的原理

Xen的vCPU调度算法有BVT(Borrowed Virtual Time)算法、SEDF(Simple Earliest Deadline First)、Credit算法。其中Credit算法是其默认的调度算法。

Credit调度算法是一种按比例公平共享的非抢占式调度算法,类似记账的情景。Credit算法为每一个Domain U设置了两个参数:

  • weight : 表示Domain的权重,即能占用物理CPU的时间比例。
  • CAP:表示Domain可占用的最多物理CPU的比例。、

算法的流程:

  1. 根据物理CPU个数计算总信用值
  2. 根据Domain的权重和vCPU个数计算应获得的信用值,取信用值和cap中较小的作为Domain的信用值
  3. 再将Domain的信用值平均分到这个Domain里的vCPU去
  4. 映射到每个物理CPU的vCPU会加入该物理CPU的运行队列按优先级进行调度

其中物理CPU的队列中的优先级分为四个(课堂只说了3个,这里补充一个),按优先级从低到高排序如下:

  • IDLE:仅空闲时占位
  • OVER:消耗完Credit值,并且无法被调度
  • UNDER:按照队列中的先后顺序周期性地被调度
  • BOOST:最高优先级的临时状态,最多持续10ms
  1. 当一个运行队列空闲时,会从其他运行队列寻找非IDLE的vCPU迁移调度

CFS算法与Credit算法比较

算法实现

CFS算法是将进程存在红黑树的每个节点中,利用红黑树这个数据结构本身的特性来实现进程调度。同时引入了虚拟时间这个概念,将进程的优先级以线性分布来表示。

Credit算法中,每个物理CPU上都有一个调度队列。队列中是各个Domain的vCPU,根据信用值具有四种不同的状态来表示其优先级。

虚拟机兼容性

CFS算法在与计算型负载虚拟机共存的环境下,会导致 I/O 型负载虚拟机的I/O 性能受损。因为红黑树根据虚拟时间排序,而运行I/O 负载的进程被唤醒时所获得的虚拟时间往往不足以抢占当前运行的进程。另外,多处理器虚拟机可能引发锁占用的问题,由于vCPU 是否正在持有锁对调度器是不可见的,如果一个正在持有自旋锁的vCPU 进入休眠,正在等待这个自旋锁的其他vCPU,则会因此需要等待更长的时间。

Credit算法全局管理多个物理CPU,从而将CPU时间公平高效地分配给各个虚拟CPU。另外可以通过调节guest操作系统的cap参数很好地实现Non-working-Conserving(NWC)调度模式,使得管理员可以很容易控制物理CPU的分配情况。

个人理解这是因为CFS算法设计之初就是为了在原生linux内核中运行,KVM直接使用内核的调度器会存在一定的兼容性不好的问题是很正常的。因为原生linux和KVM在架构上还是差别比较大。而Credit算法是基于虚拟化的目的设计出来的,在虚拟机上会比CFS算法更稳定一些。

实时性

CFS算法使用虚拟时间进行排序,避免了维护优先级的运行队列,从而也避免了某类本不应该是高优先级的进程长期占据物理CPU的情况。因此,长期得不到运行的进程就会在红黑树的最左侧节点,从而下次被系统用来调度运行。

Credit算法不能保证实时性,响应速度要求较高的应用中,事件响应延迟与其所处的队列位置密切相关,响应延迟 普遍较长且波动明显。具体来说,当系统运行响应敏感类应用时,I/O事件如网络、磁盘IO的任务会使得进程处于Boost状态,如果允许重新调度,则该进程会被马上调度。但如果出现多个处于Boost状态的进程,就无法体现Boost状态优先级高的优势,等待处理的事件仍然长时间得不到响应。因此,Credit算法不擅长处理I/O密集型应用。

参考资料

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值