仔细阅读了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. 云计算之路-阿里云上:“黑色1秒”问题与2009年Xen一个补丁的故事

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

  2. 云计算之路-阿里云上:对“黑色n秒”问题的最终猜想——CPU C-states引起的

    如果说2013年云计算之路的主题是“踩坑”,那么2014年我们希望云计算之路的主题变成“填坑”——当然填坑是阿里云来完成的,我们只是见证曾经的坑坑洼洼变成平坦大道. 15号(周四)晚上我们发现了SLB ...

  3. 云计算之路-阿里云上:SLB会话保持的一个坑

    冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...

  4. 云计算之路-出海记:建一个免费仓库 Amazon RDS for SQL Server

    上周由于园子后院起火,不得不调兵回去救火,出海记暂时停更,这周继续更新,"出海记"记录的是我们在 AWS 上建设博客园海外站的历程. 在这一记中记录的是我们基于 AWS 免费套餐( ...

  5. 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况

    在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...

  6. 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...

  7. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  8. 云计算之路-试用Azure:上不了高速的跑车,无法跨Cloud Service的DNS服务器

    从阿里云的踩坑大师,到Azure的抹黑大师,我们似乎成了云计算负面用户的典型,可是我们还是忍不住想表达自己真实的使用感受.如果有错误的地方,欢迎大家批评! 在Azure上建好虚拟网(Vitual Ne ...

  9. 云计算之路-试用Azure:制作虚拟机自定义镜像

    虚拟机自定义镜像(Image)是一个很有用的功能,可以在一台虚拟机上配置好基本的系统环境,然后做个镜像,以后创建虚拟机直接从这个镜像创建,会省掉很多重复的配置工作. 阿里云与UCloud都有这个功能, ...

随机推荐

  1. openfireserver和jdk环境删除命令

    一.卸载jdk1.8 终端依次运行以下的命令 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -rf / ...

  2. SQL SERVER 2005中利用XML对字符串拆分的方法

    1.常规方法(可运用于SQL SERVER 2000中) DECLARE @str varchar(1000) DECLARE @idoc int; DECLARE @doc xml;set @str ...

  3. mysql general log 查看mysql 运行历史

    我们有时候须要查看mysql的运行历史,比方我们做sql优化的时候,起码要知道运行的sql是什么.框架通常会帮我们拼装sql,所以在程序中不一定能够打印出sql,这个时候就须要mysql的genera ...

  4. [elk]elasticsearch5.0及head插件安装

    ElasticSearch2.3/2.4升级到ElasticSearch5.0 参考文档(排名不分先后)https://www.elastic.co/guide/en/elasticsearch/re ...

  5. Tomcat 学习进阶历程之Tomcat架构与核心类分析

    前面的http及socket两部分内容,主要是为了后面看Tomcat源代码而学习的一些网络基础.从这章開始.就開始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源代码之前,准备先看一 ...

  6. [转]c++ virtual public的含义和作用

    我在写基于MICO的CORBA程序的时候遇到的,上网查了一下 转自:http://bbs.seu.edu.cn/pc/pccon.php?id=872&nid=16822 Question:父 ...

  7. php中while($row = $results->fetch_row())调用出错

    php中while($row = $results->fetch_row())调用出错 错误处在sql语句上

  8. 如何在uboot上实现从网络下载版本镜像并直接在内存中加载之?

    这是作者近期项目上遇到的一个需求,描述如下: 一块MT7620N的路由器单板,Flash中已存放一个版本并可以通过uboot正常加载并启动.现在需要:在uboot上电启动过程中,通过外部按键触发干涉, ...

  9. IP代理软件

    IP代理软件 IP代理软件就是通过第三方网络协议传输数据的一种加密软件:跟VPN,代理服务器原理一样,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通 过这个服务与另一个网络终端(一般为服务器 ...

  10. 微信小程序2 - 扩展Page参数

    官方默认的Page初始代码为 var option = { /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 * */ onLoad: function ...