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

  在发现云服务器读取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:

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完成的

Xen IO模型

  而来自物理设备的中断(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):

Xen IO架构图

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

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

Xen网络模型

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

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

转载于:https://www.cnblogs.com/cmt/p/3723551.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cobertura和Sonar 5.1的问题

最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 。 对于Sonar数据库,我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个&#xf…

centos6.4 卸载mysql_彻底删除MYSQL-CENTOS

yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysql软件:rpm -qa|grep mysql有的话继续删除RPM方式安装MySQL5.6a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除…

ARIMA模型建模步骤

ARIMA模型建模步骤一. 绘制时序图判断序列是否有明显的趋势或周期二. 单位根检验检验方法ADFDFGLSPPKPSSERSNP前三种有有关常数与趋势项假设,应用不方便,建议少用。后三种是去除原序列趋势后进行检验,应用方便。原假设6种方法除KPPS外&#x…

WT2605C音频蓝牙语音芯片:单芯片实现蓝牙+MP3+BLE+电话本多功能应用

在当今的电子产品领域,多功能、高集成度成为了一种趋势。各种产品都需要具备多种功能,以满足用户多样化的需求。针对这一市场趋势,唯创知音推出了一款集成了蓝牙、MP3播放、BLE和电话本功能的音频蓝牙语音芯片——WT2605C,实现了单…

rabbitmq订单模块_RabbitMQ播放模块! 构架

rabbitmq订单模块RabbitMQ提供了具有可预测且一致的吞吐量和延迟的高可用性,可伸缩和便携式消息传递系统。 RabbitMQ是AMQP (业务消息传递的开放标准)的领先实现 ,并且通过适配器支持XMPP,SMTP,STOMP和HTTP…

mysql as join_mysql as 别名与 join 多表连接语法

在MySQL中,使用AS关键字为字段、表、视图取别名,或者不用as,用空格隔开:SELECT (SELECT id a,title b FROM blog c limit 1)d;使用字段别名,可以帮助我们有效的组织查询的输出结果。---------------------------------…

'固定' table宽度,走起!

为了让表格能够填充屏幕(剩余空白区域),常将其宽度属性定义为:100%,单元格也是用百分数来定义。 但这样就会出现问题: 如果单元格中的文本超过宽度限制,就会自动换行,高度自动增高,导致整个表格…

python中view的用法_APIview使用

ModelVIewSet 是对 APIView 封装ModelSerializer 是对 Serializer1.1 在user/urls.py中添加路由urlpatterns [ path(apiview/, views.UserInfoViewSet.as_view()), ]1.2 创建user/serializers.py写序列化器serializers.ModelSerializer 和 serializers.Serializer field参数…

HDU 1597 find the nth digit (二分查找)

二分查找 1 #include<stdio.h>2 __int64 a[65555];3 void init()4 {5 a[0]0;6 for(int i1;i<65537;i)7 {8 a[i]a[i-1]i;9 } 10 } 11 int search(int n,int low,int high) 12 { 13 int temp(lowhigh)/2; 14 if(na[temp]) return temp-…

java 注解应用技巧_改善Java应用程序性能的快速技巧

java 注解应用技巧曾经遇到过性能问题吗&#xff1f; 我也是。 如果我的经理再喊一次“ faaaaster”&#xff0c;我一生都会有听力障碍。 顺便说一句&#xff0c;我能听到所有噪音中的德语发音吗&#xff1f; ;-) 您可以相信仍然有人无知地在谈论垃圾收集器&#xff08;得到它吗…

字符串系列函数(不断跟新)

1.sprintf,sprintf_s sprintf(char* buffer, const char* format, [argument]); vs下需要加上_CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main() {char name[1];int input 9099;sprintf(name,"%d", input);system("pause&qu…

python获取指定区域的像素_如何获得某个区域的像素值?

因此&#xff0c;由于我对编程比较陌生&#xff0c;所以我需要一些帮助来解决这个问题。我在Windows计算机上使用SimpleCV和python2.7。我要做的是让一个(自写)程序告诉我沿着一条预设线的像素值&#xff0c;这里最重要的是每个像素的颜色。在我真的不知道从哪里开始&#xff0…

Windows 键盘操作快捷方式积累

复制、粘贴&#xff1a; CTRLC 复制被选择的项目到剪贴板 CTRLV 粘贴剪贴板中的内容到当前位置 CTRLX 剪切被选择的项目到剪贴板 Alt space E P CMD 窗口…

step7db块寻址_step7中的难点:间接寻址示例,中文详细注释。

step7中的难点&#xff1a;间接寻址示例&#xff0c;中文详细注释。推荐欢迎纠错&#xff0c;防止误导。FUNCTION "DBtoDB" : VOID //该功能块的作用是把一个数据块中的指定的一批数据&#xff0c;复制到另一个块的指定位置。TITLE //标题&#xf…

spring mvc 教程_Spring MVC开发–快速教程

spring mvc 教程这是我们的JCG合作伙伴之一&#xff0c;来自Manoj的有关使用Spring开发Web应用程序的简短教程&#xff0c; 网址为“ The Khangaonkar Report ”。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#xff09; Spring MVC使用基于模型视图…

今天才知道css hack是什么

先来个冷笑话&#xff1a;一晚下班回家&#xff0c;一民警迎面巡逻而来。突然对我大喊&#xff1a;站住&#xff01; 民警&#xff1a;int类型占几个字节? 我&#xff1a;4个。 民警&#xff1a;你可以走了。 我感到很诧异。 我&#xff1a;为什么问这样的问题&#xff1f; 民…

汇智创科机器人_【汇智创科机器人招聘信息】-看准网

在单位去学校参加双选会时投的简历&#xff0c;当时就发了一个面试邀请&#xff0c;约的是10点&#xff0c;如果有人接到面试通知&#xff0c;最好早点去&#xff0c;如果十点去&#xff0c;早上弄不完&#xff0c;下午还要接着&#xff0c;很花时间。去了之后&#xff0c;给我…

java跳转_java servlet 几种页面跳转的方法

Servlet&#xff1a;当然&#xff0c;在servlet中&#xff0c;一般跳转都发生在doGet, doPost等方法里面。1) redirect 方式response.sendRedirect("/a.jsp");页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面&#xff0c;不一定局限于本web应用中&#…

实时监听输入框值变化的完美方案:oninput onpropertychange

实时监听输入框值变化的完美方案&#xff1a;oninput & onpropertychange 原文:实时监听输入框值变化的完美方案&#xff1a;oninput & onpropertychange在 Web 开发中经常会碰到需要动态监听输入框值变化的情况&#xff0c;如果使用 onkeydown、onkeypress、onkeyup 这…

java向应用程序传递参数_Java应用程序中的消息传递主体

java向应用程序传递参数消息传递是每个Java应用程序的关键方面&#xff0c;尤其是对于涉及企业应用程序集成&#xff08;EAI&#xff09;或关注点分离的应用程序&#xff0c;例如多层WEB应用程序。 消息传递可以分为两个主要类别&#xff0c;即同步和异步。 在同步消息传递中&…