最近在研究xen的vcpu 调度和cpu qos策略,现在默认的scheduler是credit, 对应的代码是sched_credit.c

xen支持好几种控制策略,效果最好的当选pin, 灵活性最好的是weight, 控制和灵活兼备的就是cap,据说人家amazon在06年推ecu的时候就是用了类似的技术。

pin的实现比较好了解,也就是set affinity,个人对cap,weight的实现比较感兴趣,这两者应该是类似,好了,开始聊下代码

xen里面首先有个总的调度函数schedule(),这是SCHEDULE_SOFTIRQ的中断处理函数,主动触发调度的方式就是raise_softirq,每个pcpu有个timer,里面就是定期raise_softirq。

schedule里面主要的事情就是调用具体实现sched_credit里面的do_schedule来挑选下一个next任务,之后对prev和next的vcpu state进行更新,prev根据当前的状态,更新成blocked,runnable,offline, next更新成running, 再调用context_switch函数来完成真正一些寄存器的保存和切换

sched_credit的do_schedule是由csched_schedule实现的,这里面会先去取当前cpu 的runq的下一个任务,取出来之后判断下当前的pri,如果是over,那表示它的credit已经用完了,不能被run了,需要重新挑一个出来,如果大于over,表示可以run, 就会从runq里面摘出来。

每个pcpu还有一个timer,csched_tick, 它会计算当前vcpu使用了多少credit之类的accounting, 并把每个runq重新排序

当然还少不了一个主timer csched_acct, 定期去计算当前活动dom的活动vcpu里面的credit值,根据一定的策略如weight和cap来决定每个vcpu最后分到的credit值,如果当前credit小于0,那么表示credit不够了,优先级要降低,prio设置成over,如果有设置cap,那么会pause住,等到后面有credit再唤醒。如果credit > 0那么,优先级就提高了,prio设置为under, 如果之前因为cap而被pause的,这个时候可以unpause起来,最后通知说,我需要runq重新排序

中间weight和cap对于credit计算的影响如下:

首先有个CSCHED_CREDITS_PER_ACCT表示这次调度里面每个pcpu能够分配的credit绝对值

credit_total=n core * CSCHED_CREDITS_PER_ACCT

然后有个当前credit_fair会根据你的weight所占的比例来决定你的credit

credit_peak表示你的活动cpu数 * CSCHED_CREDITS_PER_ACCT,这就是你的vcpu能够达到的上限,也就是独占物理cpu

credit_cap根据你的cap来决定你拥有多少物理cpu的能力,cap * CSCHED_CREDITS_PER_ACCT

如果有cap, 那么creadit_cap < credit_peak时,credit_peak=credit_cap,也就是说你的上线由你的credit_cap决定

最后在credit_peak和credit_fair里面取最小的那个值作为整个domain的credit

再把domain的credit除以当前domain活动的cpu数,就变成domain的vcpu的credit

至此xen credit scheduler的基本原理就差不多说完了,后续一些细节点慢慢再补充

xen credit scheduler and policy的更多相关文章

  1. 云计算之路-阿里云上:“黑色1秒”问题与2009年Xen一个补丁的故事

    在之前对“黑色1秒”问题的分析博文中,我们将最大嫌疑对象锁定在了Xen,在这篇博文我们将从Xen的角度进行分析.也许有人会问,为什么不知道天多高地多厚地去研究不属于自己范围的问题?只因我们对一个问题的 ...

  2. 【转】Kubernetes scheduler学习笔记

    简介 Kubernetes是一个强大的编排工具,可以用来很方便的管理许多台机器,为了使机器的资源利用率提高,同时也尽可能的把压力分摊到各个机器上,这个职责就是由scheduler来完成的. Kuber ...

  3. Openvswitch手册(6): QoS

    这一节我们看QoS,Qos的设置往往是和flow中的policy一起使用的 Open vSwitch QoS capabilities 1 Interface rate limiting 2 Port ...

  4. 《k8s-1.13版本源码分析》-调度器初始化

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  5. Scoring and Modeling—— Underwriting and Loan Approval Process

    https://www.fdic.gov/regulations/examinations/credit_card/ch8.html Types of Scoring FICO Scores    V ...

  6. kube-scheduler源码分析

    kubernetes集群三步安装 kube-scheduler源码分析 关于源码编译 我嫌弃官方提供的编译脚本太麻烦,所以用了更简单粗暴的方式编译k8s代码,当然官方脚本在编译所有项目或者夸平台编译以 ...

  7. kube-scheduler源码分析(1)-初始化与启动分析

    kube-scheduler源码分析(1)-初始化与启动分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...

  8. AndroidStudio3.0无法打开Android Device Monitor的解决办法(An error has occurred on Android Device Monitor)

    ---恢复内容开始--- 打开monitor时出现 An error has occurred. See the log file... ------------------------------- ...

  9. Hypervisor scheduler

    Techniques for configuring a hypervisor scheduler to make use of cache topology of processors and ph ...

随机推荐

  1. Java面向对象程序设计--接口和内部类

    1.接口的定义: In the Java programming language, an interface is not a class but          staff[0] =       ...

  2. PHP临时文件session的分级存储与定期删除

    在Windows上PHP默认的Session服务端文件存放在C:\WINDOWS\Temp下,如果说并发访问很大或者 session建立太多,目录下就会存在大量类似sess_xxxxxx的sessio ...

  3. 上传图片预览 支持IE8+,FF,Chrome ,保留原图片比例

    代码及效果:链接

  4. frameset标签代码实现网站跳转

    js代码1: document.writeln("<frameset rows=\"0, *\">"); document.writeln(&quo ...

  5. Discuz论坛下载与安装

    Part1 Discuz下载 百度“discuz下载” 2. 找到下图这里 3. 选择你需要的版本,这里我选了X3.1版 4. 选择UTF-8简体下载 这是我下载好的文件 Part2 Discuz安装 ...

  6. 学习Swift -- 协议(上)

    协议(上) 协议是Swift非常重要的部分,协议规定了用来实现某一特定工作或者功能所必需的方法和属性.类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能够满足协议要求 ...

  7. golang开发android环境搭建_window

    golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go:  go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...

  8. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  9. Contest 20140708 testB dp 组合数

    testB 输入文件: testB.in  输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足 ...

  10. [BZOJ 3888] [Usaco2015 Jan] Stampede 【线段树】

    题目链接:BZOJ - 3888 题目分析 首先,计算出每个线段在 x 坐标 0 处出现的时间开始点和结束点,就转成了时间轴上的线段. 然后就是看每条线段是否被 y 比它小的线段完全覆盖了.注意求出的 ...