文章目录

  • KVM-QEMU的vCPU调度算法与Xen Credit算法对比分析
    • 1 vCPU的概念
    • 2 Linux内核的进程调度器
      • 2.1 CFS调度算法
        • CFS的数据结构
        • CFS组的概念
      • 2.2 Xen Credit算法简介
        • Credit调度算法思想
        • 一次Credit流程
    • 3 Xen Credit调度算法与CFS调度对比
      • 3.1 从数据结构的角度
      • 3.2 从调度函数选择的角度
      • 3.3 从实时性的角度
      • 3.4 SMP的支持角度

KVM-QEMU的vCPU调度算法与Xen Credit算法对比分析

1 vCPU的概念

QEMU/KVM为Guest OS提供了完整的硬件系统环境,Guest OS所占有的CPU实际上是vCPU。在KVM环境中,每个客户机是一个linux进程(qemu进程),而每一个vcpu在宿主机中是QEMU进程派生的普通线程。

而Guest应用线程调度到Guest VCPU的过程由Guest OS负责,全虚拟化的情况下,Guest OS的调度和在物理机下没有区别。

在系统底层CPU硬件中需要有硬件辅助虚拟化技术的支持,比如Intel VT 或者AMD-V。宿主机就运行在硬件之上,KVM内核部分是作为可动态加载内核模块运行在宿主机中的。其中一个模块是和硬件平台无关的实现虚拟化核心基础架构的kvm模块,另一个是硬件平台相关的kvm_intel模块。

KVM中的一个客户机是作为一个用户空间进程(qemu-kvm)运行。和其他普通的用户空间进程一样,由内核调度。多个客户机就是宿主机中的多个QEMU进程,而一个客户机的多个vCPU就是一个QEMU进程中的多个线程。

2 Linux内核的进程调度器

因为vCPU实际上是宿主机上的一个线程,所以vCPU的调度是依赖宿主机Linux内核中的CPU调度算法。Linux调度算法有三个比较著名:

  1. O(1) scheduler
  2. Comletely Fair Scheduler(CFS)
  3. BF Scheduler(BFS)

其中O(1)调度器使用基于优先级的多级调度队列,随着运行不断改变进程优先级,并优先调度优先级高的进程。
而BFS使用单一队列。

而CFS是Linux的默认调度算法,所以我将主要对CFS进行阐述。

2.1 CFS调度算法

Linux内所有任务由task_struct来表示,也就是平时所说的PCB(Process Control Block)。但进程也有很多状态,只有处于就绪态的任务才会参与调度。task_struct中有sched_entity来表示一个可调度的任务。在sched_entity中,包含vruntime数据结构。其组织结构如图所示。

to do https://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html

CFS是完全公平的调度算法。在CFS中,每个进程的运行时间由vruntime来追踪。这样就能准确的度量每个进程应该获得的运行时间。

CFS的调度策略如下,每次找到进程中vruntime最小的进程(也就是执行时间最少的)。CFS算法尽量保证公平。当某个任务的运行时间过长,会剥夺其处理器资源,并将资源分配给执行时间最少的。

CFS的数据结构

CFS的任务存储在以vruntime为顺序的红黑树(由sched_entity对象表示),根据红黑树的性质,vruntime小的会存储在树的左侧,而vruntime大的会存储在树的右侧。调度器在需要调度时,从红黑树最左侧取出节点来保证公平性。运行完之后,更新其vruntime的值,如果还处于就绪态,则插回到树中。

CFS组的概念

组调度概念是在Linux 2.6.24内核中引入,Linux中可以使用cgroups来管理CPU资源。在一台机器上运行多个可能消耗大量资源的进程时,我们不希望某个进程占据所有的资源,导饥饿现象。这时使用cgroups控制进程的资源占用。

cgroups中,可以使用cpu.cfs_quota_uscpu.cfs_period_us来限制该组中所有进程在单位时间里可以使用的cpu时间。

  • cpu.cfs_period_us就是时间周期,默认为100000(单位微秒),即百毫秒。
  • cpu.cfs_quota_us 就是在一个时间周期内,总共可以使用的运行时间(单位微秒),默认 -1,即无限制。

2.2 Xen Credit算法简介

Credit调度算法思想

在每个物理CPU上维持一个VCPU调度队列。队列中的VCPU有三个优先级。

分别为

  • OVER

Credit<0则为OVER

  • UNDER

Credit>0则为UNDER

  • BOOST

当一个VCPU因为等待IO陷入Block状态后,被唤醒的时候,为了降低响应时间,会被设置成BOOST。并且插入到相应优先级的尾部。BOOST是一个特殊的状态,最多保持10ms。

首先是Credit的计算,Credit是调度算法(scheduler)根据每个Guest OS的Weight值计算的。

每隔10ms,Credit减去100。每隔30ms,调用csched_acct()函数重新计算Credit的值。

一次Credit流程
  1. 首先获取系统中所有Weight值和Credit值
  2. 判断Weight值是否>0
  3. 遍历Xen系统中所有活动Domain,并且计算每一个Domain获得的Credit值
  4. 遍历Domain中的VCPU,将Credit值平均分。并设置对应的优先级

3 Xen Credit调度算法与CFS调度对比

3.1 从数据结构的角度

在CFS中,任务存储在一颗以vruntime为key的红黑树中。而Credit算法则是在每一个物理CPU上都维护一个VCPU的调度队列。

3.2 从调度函数选择的角度

在Credit算法中,一个调度算法称为调度器,通过结构体schedule表示,用户可以通过对opt_sched变量赋值来选择某个调度算法。而在QEMU/KVM下,因为调度算法是由宿主机OS提供,所以需要修改/sys/block/sda/queue/scheduler来临时改变调度程序,或者通过修改内核引导参数来永久改变调度程序。

3.3 从实时性的角度

在Credit算法中,为了降低响应时间,引入了BOOST级别。但当出现大量的IO操作时,比如读写磁盘和网络数据传输,某些物理CPU中就会有多个VCPU同时在进行IO操作,这些VCPU可以可能属于一个Guest OS,也可能属于不同的Guest OS,这些VCPU都会频繁的进入BOOST级别,在物理CPU的运行队列中排队,并等待获得CPU资源。在这10ms中,是不能被任何VCPU抢占的。因此,队列中的BOOST级别VCPU必须等待之前的VCPU释放资源,而UNDER和OVER级别则需要等待更久。影响了uest OS对IO事件的响应。并且,因为BOOST级VCPU随机分布在系统的物理CPU上,有的物理CPU运行队列中有更多BOOST级VCPU,而有的物理CPU中则有较少的BOOST级VCPU。

而在QEMU/KVM中,CFS 不直接使用优先级而是vruntime为key的红黑树,这样可以避免维护按优先级调度的运行队列。在Credit中,可能会出现VCPU长时间等待物理CPU的状态。而在QEMU/KVM中,因为CFS算法的公平性,如果VCPU长时间得不到运行,vruntime的值就会越小,就会位于红黑树的更左端,也就更有机会得到运行。

也就是说,如果出现大量IO任务时,CFS算法能比Credit算法保证更好的实时性,降低IO任务的响应时间。

3.4 SMP的支持角度

SMP(Symmetric Multi-Processor,对称多处理器系统)指的是多个进程可以做到真正的并行执行,并且单个进程的多个线程也能做到并行执行。QEMU在给客户机模拟CPU时,也能充分利用物理硬件的SMP并行处理优势。有两种方式来实现客户机的SMP。

  1. 将不同的vCPU进程交换执行
  2. 将在物理SMP硬件上同时执行多个vCPU进程。

而在Credit算法中可以用SMP的方式将各个物理CPU分配给务个虚拟CPU,实现负载平衡。

从这个角度上来看,两者差别并不大。

KVM-QEMU的vCPU调度算法与Xen Credit算法对比分析相关推荐

  1. 深入浅出 kvm qemu libvirt

    在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvmkvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备:qemu是模拟IO设备(网卡,磁盘),kvm加上 ...

  2. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

  3. 处理机调度算法模拟实验——FCFS算法,SJF调度算法

    处理机调度算法模拟实验 一.实验目的 本实验模拟在单处理机情况下的处理机调度算法,用某种编程语言实现先来先服务和最短作业优先调度算法的模拟. 二.实验原理 1.先来先服务调度算法原理: 先来先服务调度 ...

  4. hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...

    当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化. 数组法 最简单的,我们可以把 ...

  5. 五分钟搞懂Xen、KVM、Qemu间的关系和区别

    Aha,忽然发现我也是个标题党,十分钟搞定某某技能这种标题最吸引人了.当然我也不是华而不实,是不是干货,你读了才知道.话说,接触Xen这么久了,现在才花时间搞清楚这个问题,要不是需要给别人解释,还不知 ...

  6. KVM,QEMU,libvirt入门学习笔记【转】

    转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...

  7. KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比

    KVM和Xen是两大虚拟化技术,KVM和Xen又是免费开源的管理程序,新手站长网分享虚拟化技术KVM和Xen的区别优势对比: KVM和Xen的区别 KVM:KVM是轻量级的虚拟化管理程序模块,该模块主 ...

  8. QEMU:QEMU与KVM基础

    文章目录 参考 介绍 QEMU与KVM 关系 架构 QEMU的任务(图中左上) 虚拟机的运行(图中右上) KVM驱动(图中下部) QEMU架构 参考 qemu的详细资料大全(入门必看!!!) unde ...

  9. kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行

    分三部分:一是KVM虚拟机创建.二是VCPU创建.三是KVM虚拟机运行 第一部分: 1.基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREAT ...

  10. KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

    接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从gue ...

最新文章

  1. 史上最快! 10小时大数据入门实战(五)-分布式计算框架MapReduce
  2. [python skill]利用python计算T分布下的置信区间
  3. java 原生数据类型的转换_Java基本数据类型转换分析
  4. Android开发:操作UI线程4种方法
  5. 【Python】浅谈 multiprocessing
  6. 如何区分 B2B、B2C、C2C、C2B、C2C2B、C2B2B、O2O、ABC、B2G、BMC?
  7. 【XSY2111】Chef and Churus 分块 树状数组
  8. mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)
  9. 想要学习UI动效设计?从这些软件入手
  10. 移动端canvas_web前端开发分享-css,js移动篇
  11. JDK8新特性(八)之Stream流的map()、sorted()、distinct()、match()方法
  12. Spring Boot 项目优化和Jvm调优 (楼主亲测,真实有效)
  13. 计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...
  14. Mac上的全局翻译利器 : Bob + PopClip
  15. 标段模板、审批流程模板
  16. android 定位 指南针,Android 实现指南针效果
  17. java抖音字符视频_代码生成抖音文字视频
  18. 蓝桥杯练习题之圆的面积
  19. 【离散数学】 MIT 6.042J 笔记 - Lecture 1 Introductions and Proofs
  20. voipdiscount免费拨打全球电话(无需手机注册)

热门文章

  1. 计算机学拼音打字,拼音打字练习
  2. Java架构师—PDMan数据库建模工具使用
  3. 【Linux驱动开发】PS2游戏手柄驱动开发与输入子系统框架
  4. odb格式Linux,ODB格式文件 如何打开ODB文件 ODB是什么格式的文件 用什么打开 - The X 在线工具...
  5. 华为荣耀V9手机通过在Fastboot模式写ramdisk.img来获取ROOT权限 | 华为荣耀V9怎么获取ROOT权限 | 华为荣耀V9怎么用面具Magisk做ROOT权限
  6. 计算机二级等级考试ms office用什么软件练习好?
  7. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.
  8. 什么是操作系统啊 | 战术后仰
  9. Android app客户端性能测试工具Emmagee 浅析
  10. Ubuntu 19.04 磁盘加密