在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发到一个新的高度。

  根据我们的实测,在云服务器上创建一个新的TCP连接通常也不过3ms左右。在黑色0.1秒期间,TCP包已经到达网卡,从网卡读到内存中竟然超过100ms,这太不可思议了!后来想想,如果.Net或Windows存在这样的问题,那微软就不是全球第一大软件公司,而是全球第一大忽悠公司,这个可能性真的非常非常小。

  所以,我们觉得“黑色0.1秒”问题最大的怀疑对象依然是阿里云的Xen虚拟机。再加上之前对黑色n秒(n大于1)问题的分析,最大的怀疑对象也是Xen。如果真的是Xen的问题,那就不仅仅是阿里云的问题,这让我们的好奇心更上了一层楼。

  既然“黑色0.1秒”发生在Xen的网络IO层面,那我们还等什么,赶紧去了解Xen的IO虚拟化机制!

  通过Google很快搜索到一篇关于Xen的重要论文——Diagnosing Performance Overheads in the Xen Virtual Machine Environment

  这篇论文的“3.1 Xen”第2段文字专门讲到了Xen的IO模型:

3.1 Xen

The latest version of the Xen architecture introduces a new I/O model, where special privileged virtual machines called driver domains own specific hardware devices and run their I/O device drivers. All other domains (guest domains in Xen terminology) run a simple device driver that communicates via the device channel mechanism with the driver domain to access the real hardware devices. Driver domains directly access hardware devices that they own; however, interrupts from these devices are first handled by the VMM which then notifies the corresponding driver domain through virtual interrupts delivered over the event mechanism. The guest domain exchanges service requests and responses with the driver domain over an I/O descriptor ring in the device channel. An asynchronous inter-domain event mechanism is used to send notification of queued messages. To support high-performance devices, references to page-sized buffers are transferred over the I/O descriptor ring rather than actual I/O data (the latter would require copying). When data is sent by the guest domain, Xen uses a sharing mechanism where the guest domain permits the driver domain to map the page with the data and pin it for DMA by the device. When data is sent by the driver domain to the guest domain, Xen uses a page-remapping mechanism which maps the page with the data into the guest domain in exchange for an unused page provided by the guest domain.

  虚拟机的世界果然不一样。原来在Xen中,每一个物理设备都有一个专门的特权虚拟机(driver domain)在管理,其他虚拟机(guest domain,云服务器就运行于guest domain)访问物理设备都要通过对应的driver domain。driver domain上运行着直接可以访问物理设备的驱动程序;而guest domain中的驱动程序相当于只是一个中介,它通过设备信道机制(device channel mechanism)与driver domain进行通信,来完成物理设备的访问操作(见下图,来自这个PPT——Diagnosing Performance Overheads in the Xen Virtual Machine Environment)。(关键点1:云服务器中的网络IO操作最终是由driver domain完成的

  而来自物理设备的中断(interrupt)首先由VMM(Virtual Machine Monitor)处理,然后基于事件机制,通过相应的虚拟中断通知相应的driver domain(关键点2:当网卡收到包时,中断首先是由VMM处理的,然后发给Driver Domain)。关于这一点,在该论文中的6.1.1节中也提到了:

For each packet received, the network device raises a physical interrupt which is first handled in Xen, and then the appropriate “event” is delivered to the correct driver domain through a virtual interrupt mechanism.

  当driver domain将来自物理设备的数据(比如网卡接收到的网络包)发给guest domain时,Xen会使用page-remapping(内存页重映射)机制。driver domain会先将数据从物理设备读取到内存中,然后将这部分内存页与guest domain中的未使用内存页进行交换,然后guest domain直接读取这部分内存页,有点偷梁换柱的味道(关键点3:当socket读取数据时,会进行driver domain与guest domain的内存页重映射操作)。关于这一点,在该论文的6.1.2节占也提到到了:

For each page of network data received, the page is remapped into the guest domain and the driver domain acquires a replacement page from the guest.

  再来看看“黑色0.1秒”期间的情况。Wireshark的抓包数据显示,当时来自OCS的TCP包已经到达guest domain:

  这说明了什么呢?先看一张更详细的Xen I/O架构图(图片来自[pdf]Xen I/O Overview):

  我们推断,当时TCP包已经到达上图中的Netfront——guest domain中的网卡。也就是说物理网卡收到了网络包,并发出了中断;中断被VMM处理并发给了driver domain,driver domain已经将网卡中的数据读取到内存中;并且已经完成了与guest domain的page-remapping。socket读取数据时,实际就是在读这块从drvier domain的remap过来的内存页,就在读的过程中发生了“黑色0.1秒”。

  再看一张更详细的图(图片来自Optimizing Network Virtualization in Xen):

  在上图片中,“黑色0.1秒”就发生在guest domain从Hypervisor Page Flipping中读取package data。

  通过这次分析,我们觉得问题可能发生在guest domain从remap过来的内存页中读取数据时。在这个读的过程中,不仅涉及内存,还要涉及CPU——CPU执行的指令情况,CPU的缓存,CPU与内存之间的距离。这是一个更复杂的问题,目前我们没有足够的知识,也没有足够的参考资料进行分析。只能把问题留在这里,期待有经验的朋友提供线索。

云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题的更多相关文章

  1. 云计算之路-阿里云上:借助IIS Log Parser Studio分析“黑色30秒”问题

    今天下午15:11-15:13间出现了类似“黑色30秒”的状况,我们用强大的IIS日志分析工具——Log Parser Studio进行了进一步的分析. 分析情况如下—— 先看一下Windows性能监 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Android仿QQ复制昵称效果

    本文同步自http://javaexception.com/archives/76 背景: 这几天做一个复制文本的需求,突然看到QQ上复制昵称跟QQ号的效果,觉得很不错,就想要模仿一波,办法比较简单粗 ...

  2. HDU 1045 Fire Net 【连通块的压缩 二分图匹配】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    ...

  3. 一个简单示例看懂.Net 并行编程

    此示例尽量以最简洁的代码演示并行处理的功能,此示例代码中分别用单线程和多线程分别执行5次耗时1秒的操作.打印出执行过程及耗时. 以下为示例代码,.net framework要求4.0以上. using ...

  4. serlvet配置xml和@WebServlet

    简单介绍 XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感.例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项.在web-app元 ...

  5. P2939 改造路

    P2939 [USACO09FEB]改造路Revamping Trails 裸地分层图最短路 培训的时候考到过 但是-- 我考试的时候写了个基本没有的树状数组优化.然后顺利的被卡到了70分(裸的spf ...

  6. ActiveX控件注册不起作用的解决办法

    公司写了一个ActiveX打印插件.其中一个同事的电脑死活不能用.于是我就上网找办法 这位兄弟写的比较清晰. ActiveX交互时浏览器的设置以及ActiveX控件注册的检测 http://blog. ...

  7. 使用Dapper处理多个结果集和多重映射的教程

    在本文中,我们将介绍如何使用DAPPER从单个数据库调用中读取数据库中的多个结果集.我们将看看我们可能希望这样做的场景,以及如何使用它的Query和QueryMultiple方法更简洁地实现这一点. ...

  8. Xcode 9.0 报错, Safe Area Layout Guide Before IOS 9.0

    Xcode 9.0 新建工程报错 xcode Safe Area Layout Guide Before IOS 9.0 如下图,在Builds for 选择iOS9.0 and Later,不勾选U ...

  9. 手动创建简单webpack项目及React使用

    一.创建基本的webpack4.x项目 1.运行 npm init -y 快速初始化项目 2.在项目根目录创建src的源代码目录和dist产品目录 3.在src目录下创建 index.html 4.使 ...

  10. 【模板】tarjan算法

    tarjan求强连通分量 #include<bits/stdc++.h> #define MAX 10005 using namespace std; int dfn[MAX],low[M ...