KVM-QEMU的vCPU调度算法与Xen Credit算法对比分析
文章目录
- 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调度算法有三个比较著名:
- O(1) scheduler
- Comletely Fair Scheduler(CFS)
- 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_us
和cpu.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流程
- 首先获取系统中所有Weight值和Credit值
- 判断Weight值是否>0
- 遍历Xen系统中所有活动Domain,并且计算每一个Domain获得的Credit值
- 遍历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。
- 将不同的vCPU进程交换执行
- 将在物理SMP硬件上同时执行多个vCPU进程。
而在Credit算法中可以用SMP的方式将各个物理CPU分配给务个虚拟CPU,实现负载平衡。
从这个角度上来看,两者差别并不大。
KVM-QEMU的vCPU调度算法与Xen Credit算法对比分析相关推荐
- 深入浅出 kvm qemu libvirt
在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvmkvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备:qemu是模拟IO设备(网卡,磁盘),kvm加上 ...
- FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结
先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...
- 处理机调度算法模拟实验——FCFS算法,SJF调度算法
处理机调度算法模拟实验 一.实验目的 本实验模拟在单处理机情况下的处理机调度算法,用某种编程语言实现先来先服务和最短作业优先调度算法的模拟. 二.实验原理 1.先来先服务调度算法原理: 先来先服务调度 ...
- hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...
当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化. 数组法 最简单的,我们可以把 ...
- 五分钟搞懂Xen、KVM、Qemu间的关系和区别
Aha,忽然发现我也是个标题党,十分钟搞定某某技能这种标题最吸引人了.当然我也不是华而不实,是不是干货,你读了才知道.话说,接触Xen这么久了,现在才花时间搞清楚这个问题,要不是需要给别人解释,还不知 ...
- KVM,QEMU,libvirt入门学习笔记【转】
转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...
- KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比
KVM和Xen是两大虚拟化技术,KVM和Xen又是免费开源的管理程序,新手站长网分享虚拟化技术KVM和Xen的区别优势对比: KVM和Xen的区别 KVM:KVM是轻量级的虚拟化管理程序模块,该模块主 ...
- QEMU:QEMU与KVM基础
文章目录 参考 介绍 QEMU与KVM 关系 架构 QEMU的任务(图中左上) 虚拟机的运行(图中右上) KVM驱动(图中下部) QEMU架构 参考 qemu的详细资料大全(入门必看!!!) unde ...
- kernel 3.10代码分析--KVM相关--虚拟机创建\VCPU创建\虚拟机运行
分三部分:一是KVM虚拟机创建.二是VCPU创建.三是KVM虚拟机运行 第一部分: 1.基本原理 如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREAT ...
- KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从gue ...
最新文章
- 史上最快! 10小时大数据入门实战(五)-分布式计算框架MapReduce
- [python skill]利用python计算T分布下的置信区间
- java 原生数据类型的转换_Java基本数据类型转换分析
- Android开发:操作UI线程4种方法
- 【Python】浅谈 multiprocessing
- 如何区分 B2B、B2C、C2C、C2B、C2C2B、C2B2B、O2O、ABC、B2G、BMC?
- 【XSY2111】Chef and Churus 分块 树状数组
- mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)
- 想要学习UI动效设计?从这些软件入手
- 移动端canvas_web前端开发分享-css,js移动篇
- JDK8新特性(八)之Stream流的map()、sorted()、distinct()、match()方法
- Spring Boot 项目优化和Jvm调优 (楼主亲测,真实有效)
- 计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...
- Mac上的全局翻译利器 : Bob + PopClip
- 标段模板、审批流程模板
- android 定位 指南针,Android 实现指南针效果
- java抖音字符视频_代码生成抖音文字视频
- 蓝桥杯练习题之圆的面积
- 【离散数学】 MIT 6.042J 笔记 - Lecture 1 Introductions and Proofs
- voipdiscount免费拨打全球电话(无需手机注册)
热门文章
- 计算机学拼音打字,拼音打字练习
- Java架构师—PDMan数据库建模工具使用
- 【Linux驱动开发】PS2游戏手柄驱动开发与输入子系统框架
- odb格式Linux,ODB格式文件 如何打开ODB文件 ODB是什么格式的文件 用什么打开 - The X 在线工具...
- 华为荣耀V9手机通过在Fastboot模式写ramdisk.img来获取ROOT权限 | 华为荣耀V9怎么获取ROOT权限 | 华为荣耀V9怎么用面具Magisk做ROOT权限
- 计算机二级等级考试ms office用什么软件练习好?
- 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.
- 什么是操作系统啊 | 战术后仰
- Android app客户端性能测试工具Emmagee 浅析
- Ubuntu 19.04 磁盘加密