云计算之路:2009年Xen一个补丁背后那不为人知的故事
仔细阅读了http://www.cnblogs.com/cmt/p/3729386.html这篇关于xen的博文,这篇博文写的挺赞的,分析的也很细致,涉及到4年前的一个patch的故事。在讲这个故事之前,先说明下,阿里云官方的xen已经包含了博文中提到的xen的cpu idle潜在问题的修复版本(commit见:
http://xenbits.xen.org/gitweb/?p=xen.git;a=commit;h=964fae8ac2fa6732856179a2532b0914dba5e4bb),请童鞋们放心。
下面进入故事环节:先说patch的V1
版。当时是Xen Power Management开发的高峰时期,又正快到Xen3.4的代码冻结时间,代码冻结后就不会再接受新的feature patch,但bugfix patch还是可以提交进入upstream。
当时有一系列Xen cpuidle/cpufreq的patch已经进了Xen3.4 upstream-upstable,所以希望让这个feature patch先上车,然后补票(追加一个bugfix patch)。这是基于两点:一是这个patch的开发者Ke Ke同学是调bug的高手,有把握在代码冻结期间搞定这个bug;二是这个bug波及不到普通用户,所以放到patch里一般不会有什么负面影响。博主博客中提到的‘普通用户’其实就是指HVM
domain,原因是在Xen3.4时期VCPUOP_set_singleshot_timer仅属于PV domain的一个hypercall(不像现在扩展到对HVM domain提供支持),所以对HVM domain没影响。但Keir同学还是没同意,所以Ke Ke同学只好苦哈哈地加班调bug去了 :)
这个bug其实比较诡异,如同博主博文中对V2 patch分析的那样,根源是V1 patch的出现导致IPI唤醒处于deep Cx的处理器失败。这里我只是补充一点问题产生的背景:Xen为什么要用IPI唤醒deep Cx处理器?V1 patch为什么导致IPI中断唤醒失败?
其实这一问题产生于某些老处理器硬件上存在的缺陷。通常中断的发生都会导致处于deep
Cx的处理器被唤醒,所以理论上大可不必大费周章地由一个处理器发IPI唤醒另一个睡眠中处理器。但凡事总有例外 -- 处理器的设计一般是希望CPU进入deep
Cx时,关闭尽可能多的部件以节省更多能耗 -- 但有些老处理器设计时把诸如APIC Timer部件的电源也顺手关了。这使得CPU进入deep Cx时产生不了APIC Timer中断。为了防止这种有问题的处理器进入深度睡眠时,无法产生APIC Timer中断而导致的Timer到期无法醒来的问题,Xen采用了比较保守的方法来处理,即由另一处理器在HPET Timer 发生时通过IPI来唤醒处于深度睡眠的处理器。HPET部件位于南桥,不受CPU状态的影响,工作可靠,精度开销都还可以接受,于是皆大欢喜…
但Ke Ke同学的V1 patch又踩了什么坑,导致IPI无法唤醒处于深度睡眠的处理器?原来Xen hypervisor的wakeup IPI的逻辑是,先检查对方是否有pending的softirq。如果有,则不必发IPI以节省开销,其原因是处理器进入深度睡眠之前都要检查并处理自己当前pending的softirq,所以如果对方有pending softirq则肯定没睡,那就没必要发IPI了。V1 patch正好踩了这个坑:在CPU进入睡眠前处理完pending softirq后,新增的sched_tick_suspend()会在某些情况下设置TIMER_SOFTIRQ,于是别的处理器发wakeup IPI就‘被节省’了,再后来就是博主所说的那样,处于深度睡眠的处理器悲催了…
云计算之路:2009年Xen一个补丁背后那不为人知的故事的更多相关文章
- 云计算之路-阿里云上:“黑色1秒”问题与2009年Xen一个补丁的故事
在之前对“黑色1秒”问题的分析博文中,我们将最大嫌疑对象锁定在了Xen,在这篇博文我们将从Xen的角度进行分析.也许有人会问,为什么不知道天多高地多厚地去研究不属于自己范围的问题?只因我们对一个问题的 ...
- 云计算之路-阿里云上:对“黑色n秒”问题的最终猜想——CPU C-states引起的
如果说2013年云计算之路的主题是“踩坑”,那么2014年我们希望云计算之路的主题变成“填坑”——当然填坑是阿里云来完成的,我们只是见证曾经的坑坑洼洼变成平坦大道. 15号(周四)晚上我们发现了SLB ...
- 云计算之路-阿里云上:SLB会话保持的一个坑
冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...
- 云计算之路-出海记:建一个免费仓库 Amazon RDS for SQL Server
上周由于园子后院起火,不得不调兵回去救火,出海记暂时停更,这周继续更新,"出海记"记录的是我们在 AWS 上建设博客园海外站的历程. 在这一记中记录的是我们基于 AWS 免费套餐( ...
- 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况
在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...
- 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析
在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...
- 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...
- 云计算之路-试用Azure:上不了高速的跑车,无法跨Cloud Service的DNS服务器
从阿里云的踩坑大师,到Azure的抹黑大师,我们似乎成了云计算负面用户的典型,可是我们还是忍不住想表达自己真实的使用感受.如果有错误的地方,欢迎大家批评! 在Azure上建好虚拟网(Vitual Ne ...
- 云计算之路-试用Azure:制作虚拟机自定义镜像
虚拟机自定义镜像(Image)是一个很有用的功能,可以在一台虚拟机上配置好基本的系统环境,然后做个镜像,以后创建虚拟机直接从这个镜像创建,会省掉很多重复的配置工作. 阿里云与UCloud都有这个功能, ...
随机推荐
- java 解析webservice 中的soapheader
//从MessageContet中获取头域中的值 public HeaderBean getBeanFromRequest(org.apache.axis2.context.MessageContex ...
- 【VBA研究】利用DateAdd函数取上月或上年同期的日期
作者:iamlaosong DateAdd函数返回一个日期.这一日期加上了一个时间间隔.通过这个函数能够计算非常多我们须要的日期,比方上月上年同期日期等. 语法 DateAdd(interval, n ...
- Mongodb更新数组$sort操作符
db.students.update( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: ...
- Apollo配置中心转
尊重原创,本文转自:https://www.cnblogs.com/FlyAway2013/p/8811385.html 前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比 ...
- java 容器结构
先来看下层次关系. 如图所示:图中,实线边框的是实现类,折线边框的是抽象类,而点线边框的是接口 Collection(接口)├──List(接口)│ ├──LinkedList(实现类)│ ├ ...
- HashMap 内部原理
HashMap 内部实现 通过名字便可知道的是,HashMap 的原理就是散列.HashMap内部维护一个 Buckets 数组.每一个 Bucket 封装为一个 Entry<K, V> ...
- pair + map 函数结合使用
题目链接:codeforces 44A5birch yellowmaple redbirch yellowmaple yellowmaple green 4 3oak yellowoak yellow ...
- JS面试题目
哪些地方会出现css阻塞,哪些地方会出现js阻塞? js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下 ...
- linux c log 日志接口
#define SIZE_16M 16777216 //1024*1024*16 #define LOG_FILE_PATH "./mylog.txt" ...
- uboot中断功能实现
uboot中实现irq中断(uboot version2015.04)1.实验目的:实现GPIO_2的外部中断 2.实验步骤:a.GPIO_2(GPIO1_IO02)为中断源, 首先需要设置这个pad ...