如果说2013年云计算之路的主题是“踩坑”,那么2014年我们希望云计算之路的主题变成“填坑”——当然填坑是阿里云来完成的,我们只是见证曾经的坑坑洼洼变成平坦大道。

15号(周四)晚上我们发现了SLB会话保持的坑,16号晚上阿里云成功定位并进行修复,这两天正式发布后会填平这个坑。这次从踩坑到填坑的过程是最痛快的一次。

接下来我们的目标锁定在“黑色n秒”(刚发现一个英文说法:stuck for x seconds)这个坑我们最多、最神秘、最诡异的坑。

受“云计算之路:2009年Xen一个补丁背后那不为人知的故事”一文的启发,在这篇博文中,我们要对“黑色n秒”的原因做出一个最大胆的猜想,也希望是最终猜想!我们的猜想是——我们遇到的“黑色n秒”问题,不管是黑色10秒30秒1秒、5秒还是这两天刚刚发现的0.5秒,都是背后同一个原因在不同触发条件下的不同表现。

那这个背后的原因是什么呢?如果用最简单的话来表达,就是CPU睡过头了。如果哆嗦一点,就是CPU的某个核因为空闲进入睡眠状态(C-states),后来需要它工作时,Xen想借助另一个CPU核来唤醒它,结果由于某种未知因素造成睡眠中的CPU核没被唤醒或者负责唤醒的CPU核偷懒了。此时此刻,黑色n秒就开始了,只至睡眠中的CPU核被外部中断唤醒。

从这个猜想中可以看出,如果所有的CPU核都在忙碌,就不会触发这个问题。是的,当我们得到这个猜想时,有点哭笑不得——之前由于遭遇CPU跑高、CPU波动问题,本来4核就够了。我们特地买了8核,通常有4个核都闲着,从而更容易触发这个问题。

那换成4个核是不是会解决问题呢?不会,只是发生的频率会低一些,因为网站访问有高低峰,在低峰时也会有CPU核闲下来。

那有没有办法从根本上避开这个问题?有!目前为止我们发现一个唯一的解决方法,就是——坚决不让CPU进入睡眠状态,即使没活干,也要呆着随时待命。要实现这个,需要进入物理机的BIOS关闭CPU的C-states。而为此要付出的代价是支持电力事业的发展。

你也许会问这个最终猜想及解决方法究竟靠不靠谱呢?请看下面3个在网上发现的案例。

第一个案例:Citrix论坛上的一个帖子——Xenserver 6.2 intermittent ping response delays

用的是DELL R820+XenServer 6.2,遇到的问题是:ping虚拟机有时会出现响应时间高达500ms左右的异常情况(在时间点上与我们遇到的“黑色0.5秒”对应)。

Intermittently we see a large response time and followed by the normal response time <1ms, this gradually decreases from 500ms back to 1ms then jumps to 500ms and starts decreasing again.

后来是通过进入这台机器的BIOS禁用C1E和C States解决的:

Manged to resolve this by making the following changes on the R820 BIOS:
System BIOS Settings -> System Profile Settings
Changed C1E to Disabled
Change C States to Disabled.

这个案例中最值得关注的地方是所用的物理服务器是DELL R820,CPU是Xeon E5-4600;而我们用的阿里云云服务器的物理机的CPU是Xeon E5-2630。虽然型号有差异,但都是Ivy Bridge架构,更关键的是电源管理功能是一样的,用的都是Intel Turbo 2.0(详见这里)。所以我们推测,如果E5-4600在电源管理上存在缺陷,那么E5-2630也同样存在,该案例中所用的禁用C1E和C States的方法也可能也适用于我们的场景。

第二案例:Citrix支持中心的一篇文章——Hosts Become Unresponsive with XenServer 5.6 and above on Nehalem and Westmere CPUs

用的是Nehalem与Westmere架构CPU+Xen Server 5.6,遇到的问题是虚拟机随机死锁,问题通常发生在CPU长时间处于空闲状态(空闲的结果自然是进入睡眠状态)之后:

Hosts that are experiencing this issue will often have been largely idle for a period leading prior to the lockup.

也是通过在BIOS中禁用C-states(同时也禁用了Turbo Mode/Turbo Boost option)解决的。

To resolve the issue, complete the following procedure:

  1. In the BIOS menu, set the value for the C-states option to Disabled.
  2. In the BIOS menu, set the value for the Turbo Mode/Turbo Boost option to Disabled.
  3. If the server BIOS has power management options that leave power management to the BIOS rather than the operating system, such as Dell's Active Power Controller or HP’s Power Regulator, also disable this by setting the power management option to OS Control.

这个案例中,最值得关注的是文章中的Problem Cause部分,文中说Nehalem与Westmere CPU架构引入了新C-states特性,但存在缺陷,文中所遇到的问题就是这个缺陷引起的。

但我们所用的Xeon E5-2630不是这两个CPU架构,不受这个缺陷影响。但从中可以知道物理CPU在电源管理上的缺陷是会引起虚拟机死锁问题(黑色n秒也可以说成是死锁)。

第三个案例:stackexchange上的一个问答——BUG: soft lockup - CPU# stuck for x seconds

用的是亚马逊AWS EC2(也是Xen)+CentOS,遇到的问题是某个进程会卡住10秒或者更长时间,与我们遇到的黑色10秒很相似。

这位提问者最终没有说是如何解决这个问题的,但回复中有人说

Disabling c-states worked for me. –  Andrew

我们猜测这位回复者遇到了类似问题,并通过禁用C-States解决了。

从这个案例,我们进行了这样一个推测: stackexchange上的这个问题是在2013年5月27日提出的,亚马逊AWS EC2的虚拟机环境与阿里云ECS的虚拟机环境很接近,EC2上出现的这个问题在ECS上重演的可能性很大,而我们遇到的黑色n秒问题可能就是一种重演。既然有人通过禁用C-states解决了问题,我们为什么不尝试一下呢?

【我们的尝试】

我们的尝试是在虚拟机中在Windows层面禁用CPU C-states,但前提条件是物理机在BIOS中设置了将CPU电源管理控制权交给操作系统。想想这个可能性太小了,因为一台物理机中跑着多台虚拟机,如果控制权交给了操作系统,假如这台虚拟机禁用了C-states,那台虚拟机没有禁用,CPU该听谁的。

虽然可能性微乎其微,我们还是要试试。我们通过在Windows注册表中添加一个针对CPU的Capabilities项禁用了C-states(来自superuser):

reg add HKLM\System\CurrentControlSet\Control\Processor /v Capabilities /t REG_DWORD /d 0x0007e066

但测试结果显示,黑色n秒问题依旧。于是,只剩下唯一的希望。

【唯一的希望】

现在唯一能验证我们的最终猜想、唯一能解决“黑色n秒”问题的希望就是——进入物理机的BIOS,禁用CPU C-states。

【更新】

从阿里云得到的最新消息,物理机的BIOS是关闭C-states的,我们的最终猜想失败。

接下来唯一的希望就寄托于阿里云对这个问题的继续研究。

云计算之路-阿里云上:对“黑色n秒”问题的最终猜想——CPU C-states引起的的更多相关文章

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

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

  2. 云计算之路-阿里云上:“黑色1秒”最新线索——w3tp与w3dt

    向大家分享一下最近排查“黑色1秒”问题的进展,“黑色1秒”的问题表现详见什么是黑色1秒. 1. 发生在w3wp进程内 判断依据:“黑色1秒”期间,http.sys的HTTP Service Reque ...

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

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

  4. 云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题

    今天下午访问高峰的时候,主站的Web服务器出现奇怪的问题,开始是2台8核8G的云服务器(ECS),后来又加了1台8核8G的云服务器,问题依旧. 而且3台服务器特地使用了不同的配置:1台是禁用了虚拟内存 ...

  5. 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时

    在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...

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

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

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

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

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

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

  9. 云计算之路-阿里云上:启用Windows虚拟内存引发的CPU 100%故障

    今天上午11:35~11:40左右,由于负载均衡中的两台云服务器CPU占用突然飚至100%,造成网站5分钟左右不能正常访问,请大家带来了麻烦,请谅解! (上图中红色曲线表示CPU占用) 经过分析,我们 ...

  10. 云计算之路-阿里云上:禁用Windows虚拟内存引发的重启

    昨天(2013年8月6日)下午,承载www.cnblogs.com主站的两台云服务器分别自动重启了1次,由于这两台云服务器使用了负载均衡(SLB),重启并未影响网站的正常访问. 与这次重启相关的Win ...

随机推荐

  1. Redis(十五):哨兵Sentinel

    Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...

  2. How To run OAI eNB (No S1) with USRP X310(1)

    How To run OAI eNB (No S1) with USRP X310 1.Things need to be done 1.1 Install Ubuntu 14.04 1.1.1 In ...

  3. Ubuntu打开core dump

    输入ulimit -a 如果core file size为0,那就说明没有打开core dump,尽管你的程序crash的时候会显示core dumped,但实际上不会生成core file 输入ul ...

  4. 代码审计之Finecms任意文件下载漏洞

    PS:该漏洞已被公布,只是学习.故自己跟着大佬的步伐审计. 文件地址:\controllers\ApiController.php Line 57 public function downAction ...

  5. lua文件读写

    lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file])  设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为 ...

  6. Linux 新增一个用户命令 adduser

    这几天新增用户老是会用 useradd , 这条命令比较复杂,记录 adduser 这条超级简单的命令. Full name 最后和用户差不多,不然登录的时候不好辨别 附: 新增用户无法 sudo 请 ...

  7. sama5d36 OUT0-OUT3 对应关系 带光模块的系统

    ARM-IO9      PA8     OUT0 ARM-IO10    PA1     OUT1 ARM-IO11    PA3     OUT2 ARM-IO12    PA9     OUT3

  8. TVS二极管的主要参数与选型

    TVS二极管的主要参数--转载 处理瞬时脉冲对器件损害的最好办法是将瞬时电流从敏感器件引开.TVS二极管在线路板上与被保护线路并联,当瞬时电压超过电路正常工作电压后,TVS二极管便发生雪崩,提供给瞬时 ...

  9. python 人脸识别

    """Performs face alignment and calculates L2 distance between the embeddings of image ...

  10. Thinkphp整合各个功能

    thinkphp整合Auth权限管理.支付宝.微信支付.阿里oss.友盟推送.融云即时通讯.云通讯短信.Email.Excel.PDF等等: 基于thinkphp扩展了大量的功能:而不改动thinkp ...