首页> 中国专利> 基于xen虚拟磁盘设备的前端缓存方法

基于xen虚拟磁盘设备的前端缓存方法

摘要

本发明公开了一种基于xen虚拟磁盘设备的前端缓存方法,该方法采用缓存最近对虚拟磁盘扇区访问的结果,进而提供一种接下去访问的扇区在缓存中就能找到的可能性。由于缓存设置在前端驱动中,使得虚拟磁盘读有可能直接在前端驱动中返回而不涉及到后端驱动。本发明完全保留现有xen前后端驱动优点,同时对虚拟机前端驱动做了少量修改,在代码路径添加了查询缓存的功能,只引入较少的额外开销。此外,由于因为在实际应用中缓存的命中率较高,该方法能明显提高xen虚拟磁盘设备的性能。

著录项

  • 公开/公告号CN103207763A

    专利类型发明专利

  • 公开/公告日2013-07-17

    原文格式PDF

  • 申请/专利权人 上海交通大学;

    申请/专利号CN201310150963.5

  • 发明设计人 管海兵;李健;米翔;马汝辉;宋涛;

    申请日2013-04-26

  • 分类号G06F3/06(20060101);

  • 代理机构31220 上海旭诚知识产权代理有限公司;

  • 代理人乐艳;郑立

  • 地址 200240 上海市闵行区东川路800号

  • 入库时间 2024-02-19 19:02:27

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-11-25

    授权

    授权

  • 2013-08-14

    实质审查的生效 IPC(主分类):G06F3/06 申请日:20130426

    实质审查的生效

  • 2013-07-17

    公开

    公开

说明书

技术领域

本发明属于计算机系统虚拟化I/O虚拟化领域,具体地,涉及一种基于xen虚 拟磁盘设备的前端缓存方法,用于改善xen虚拟化技术中半虚拟化设备的性能。

背景技术

虚拟机监控器(Virtual Machine Monitor,VMM)是指在硬件与传统操作系统 之间提供一个软件管理层,来抽象底层的硬件,向上层提供虚拟硬件接口,从而能 够使多个操作系统同时在该虚拟硬件上运行。虚拟机管理主要负责对硬件资源的管 理,主要资源包括处理器、内存和I/O。虚拟机监控器与运行其上的虚拟机或者说 虚拟机操作系统之间的关系就如同传统操作系统和进程之间的关系。

基于虚拟机监控器的系统虚拟化技术是当今云计算,数据中心底层构建的基 础。系统虚拟化技术提供执行的高效性、资源管理的隔离性,有助于企业将原本运 行于多台物理服务器上的服务整合到一台物理服务器上,从而充分利用硬件资源, 有效减少企业在IT基础架构上的开销。此外,通过在虚拟机管理上运行虚拟操作 系统,有助于遗留软件系统的移植。系统虚拟化技术提供的隔离性能够保证一个虚 拟机的执行不影响其他虚拟机的运行。这其中包括安全隔离性和性能隔离性。安全 隔离性指某个虚拟机运行出错或者崩溃不会影响到在同一个宿主机上其他虚拟机 的正常运行。而所谓性能隔离性是指某个虚拟机对系统资源的消耗不会影响系统初 始配置给其他虚拟机的资源。

由于在硬件和虚拟操作系统之间引入了虚拟机监控器中间层,系统的性能势必 受到一些影响。由于硬件虚拟化技术的产生,CPU虚拟化开销已经变得很小了, 并且提升的潜力不大。但是虚拟I/O设备,尤其是虚拟磁盘设备,依然是系统的主 要性能瓶颈之一。当今研究表明,磁盘I/O的性能瓶颈已经从之前的I/O设备变成 了I/O路径。为了减少在I/O路径上的开销,本发明提出了一种装备在xen的前端 驱动中的缓存,来尽可能地缩短I/O路径的长度。

发明内容

有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是提供一种基于xen 虚拟磁盘设备的前端缓存方法,以尽可能地缩短I/O路径的长度。

为实现上述目的,本发明提供了一种基于xen虚拟磁盘设备的前端缓存方法, 包括以下步骤:

1)用户空间程序通过系统调用产生一个磁盘读请求;

2)虚拟机操作系统为这个请求分配DMA页并且调度请求;

3)以bio vector为单位查看缓存命中情况,若一个bio vector要求的磁盘数据 全部命中缓存,则使用缓存中保留的要求的磁盘数据的内存页指针更新bio vector 中的指针;

4)命中和丢失的扇区均视为最近访问的扇区,需要加入缓存中;若缓存已满, 则采用替换策略进行替换;

5)对于所有bio vector都命中缓存的请求,由于步骤3)中已经将内存页指针 更新成实际数据所在页的指针,相当于需要的数据已经全部取到内存中,就可以直 接结束读请求,将数据返回给上层;

6)如果不是所有bio vector都命中缓存,则按照要求扇区连续的原则,将原请 求分割成若干个小请求;

7)通过授权表机制将这些小请求的内存页共享给Dom0以便后续写入,并且 产生相应的ring request,放到ring buffer上;

8)后端驱动在接到事件通道通知后,处理前端递交过来的请求,从物理磁盘 中读取数据放进相应的内存页;完成后通知前端,请求结束。

根据上述的基于xen虚拟磁盘设备的前端缓存方法,其中,bio vector最多包 括8个扇区的请求。

根据上述的基于xen虚拟磁盘设备的前端缓存方法,其中,缓存存储真实扇区 的数据或者存放数据的内存地址。

根据上述的基于xen虚拟磁盘设备的前端缓存方法,其中,步骤4)中,所述 替换策略为LRU算法。

进一步地,根据上述的基于xen虚拟磁盘设备的前端缓存方法,其中,所述 LRU算法具体如下:每个缓存中的扇区维持一个访问时间Tlast access,代表上一 次访问到这个扇区的时间;当扇区命中缓存,以当前的时间戳来更新Tlast access; 当缓存已满需要踢出一个扇区时,遍历整个缓存找出最小Tlast access的那个踢出。

因此,本发明的基于xen虚拟磁盘设备的前端缓存方法相较于现有技术具有以 下有益的技术效果:

(1)采用缓存最近对虚拟磁盘扇区访问的结果,进而提供一种接下去访问的 扇区在缓存中就能找到的可能性;

(2)由于缓存设置在前端驱动中,本发明使得虚拟磁盘读取有可能直接在前 端驱动中返回而不涉及到后端驱动;

(3)本发明虽然在Xen平台上实现,并且目标的是虚拟磁盘设备,但该方法 不局限于平台和I/O设备,可以用于其他半虚拟化I/O驱动;

(4)本发明对虚拟机前端驱动做了少量修改,在代码路径添加了查询缓存的 功能,只引入较少的额外开销;

(5)此外,本发明还能完全保留现有xen前后端驱动优点,因为在实际应用 中缓存的命中率较高,本发明能明显提高xen虚拟磁盘设备的性能。

附图说明

图1是现有的前后端虚拟磁盘一次读过程;

图2是使用本发明的基于xen虚拟磁盘设备的前端缓存方法后前后端虚拟磁盘 一次读过程;

图3是缓存命中后对原请求的处理。

具体实施方式

以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以 充分地了解本发明的目的、特征和效果。

与传统的基于陷入模拟敏感I/O指令的设备模拟方法相比,xen的半虚拟化设 备驱动(前后端驱动)性能得到了明显提升,这是由于它的上下文切换次数更少并且 使用了共享内存这种快捷的数据转移方法。然而,虚拟机监控器(hypervisor或VMM) 依然参与了整个I/O过程。等待后端驱动的响应以及事件通道机制均引入严重的开 销。

整个虚拟磁盘I/O过程大致如下:首先用户空间程序通过系统调用产生一个磁 盘读写请求;之后虚拟机操作系统为这个请求分配DMA页并且调度请求;当请求 被下发到前端驱动后,前端驱动将这个请求做特定的包装后放到ring buffer上,之 后通过事件通道通知后端。运行在Dom0中的后端驱动接收到通知后,会从ring  buffer上取出这个请求并且提交给真实设备。

本发明提出了在前端设置缓存来缓存最近访问过的那些虚拟磁盘扇区数据。由 于数据访问的地址空间和时间连续性,这些缓存中的数据有可能最近还会被访问 到,这就被称为缓存命中。当缓存命中时,前端驱动就可以直接把请求的数据返回 给上层,避免使用事件通道机制和Dom0的参与。

前端驱动和后端驱动均工作在Linux的block-IO驱动之上。每一个磁盘读写请 求由多个bio请求组成。每个bio请求又是由多个bio vector组成,这个bio vector 是磁盘I/O的最小单元。每个bio vector数据结构中包括一个DMA内存页的引用, 并负责最多一个页面大小(4KB)的磁盘读写。通常情况中,磁盘读写的单元为扇区, 它的大小是512byte,比一个内存页要小。bio vector数据结构有相应的成员来指明 DMA页内的偏移和大小,这样就可以满足小于1个内存页的请求。为了和后端驱 动配合,被递交给后端的一个请求必须是由连续若干个扇区组成。

bio vector最多可以包括8个扇区的请求。如果一个bio vector中的所有扇区都 命中了缓存,才可以认为一个bio vector命中了缓存。当一个bio vector命中缓存, 就可以被完全的丢弃掉而不需要被递交给后端驱动。这时只需要将bio vector中使 用的DMA页里的内容置换成缓存中存储的相应数据内容即可。如果一个请求中的 所有bio vector都命中缓存,那么这个请求就可以立刻返回。否则,就需要将缓存 中没有的那些bio vector递交给后端驱动,走原始的路径。这里可能的发生的是, 一个请求中有一些bio vector命中了缓存,另外一些没有命中。这样就需要对原始 请求做缩减和分割处理。缩减指的是可以将那些命中缓存的bio vector从这个请求 中删除掉再递交给后端;分割操作有由后端要求一个请求是连续的若干个扇区而决 定的,如果命中的那些bio vector在该请求所有bio vector的中部,就需要将这个 请求分割成两个小请求,以满足连续性。

缓存中存储的可以是扇区中真实的数据,但是这样的话在缓存命中时或者将新 的扇区加入缓存时都需要一次额外的数据拷贝,即在相应DMA内存页和缓存之间 的数据拷贝。本发明采用了另一种方法,缓存内存地址。具体来说,缓存的是一个 扇区数据在内存中地址,包括页帧的引用以及页内的偏移。这样,缓存的大小可以 被控制得很小,并且不需要额外的数据拷贝。当一次请求中的扇区命中缓存后,只 需要将bio vector数据结构中的DMA页引用和页内偏移设置成缓存中的相应地址, 就可以返回了。这一方法需要修改代码流程以配合,被取到DMA中的内存不能在 结束一次请求之后全部释放,只能释放那些未被加入缓存中的扇区所在的内存。而 加入缓存中的扇区所在的内存不能这时释放,即需要提供给后续可能的缓存命中的 请求使用。释放这些内存的时机被拖后,直到这个内存存储的扇区从缓存中被替换 出去,才可以释放内存。

本发明使用最近最少使用策略(least-recently-used,LRU)作为缓存的替换策略。 LRU基于以下事实:刚被访问过的扇区很可能在不久的将来被再次访问到。当需 要替换时,LRU总是替换那个最近最少被使用到的缓存单元。具体的实施方法如 下:为每个缓存中的扇区维持一个访问时间Tlast access,代表上一次访问到这个 扇区的时间。当扇区命中缓存,以当前的时间戳(rdtsc命令)来更新Tlast access。当 缓存已满需要踢出一个扇区时,遍历整个缓存找出最小Tlast access的那个踢出。

图1是现有技术中前后端虚拟磁盘一次读过程。当一个对虚拟磁盘的读请求产 生后,由上层为这次读请求分配存储读结果的DMA内存页,之后将请求递交给 xen的前端块设备驱动。前端块设备驱动通过xen的授权表机制,将这些DMA内 存页共享给后端驱动所在的Dom0,之后对上层请求做处理,使之转化成符合xen 前后端通信规则的ring request结构,之后将ring request放到共享内存ring buffer 上。这些都完成之后,通过事件通道机制通知后端块设备驱动有新的请求。后端块 设备从ring buffer上取下这个请求,解析之后进行真正的磁盘读操作。这些操作完 成后,通过一个中断告知前端读完成,整个请求结束。

图2是使用本发明的基于xen虚拟磁盘设备的前端缓存方法后一次读过程。具 体步骤如下:

1)用户空间程序通过系统调用产生一个磁盘读请求;

2)虚拟机操作系统为这个请求分配DMA页并且调度请求;

3)以bio vector为单位查看缓存命中情况,若一个bio vector要求的磁盘数据 全部命中缓存,则使用缓存中保留的要求的磁盘数据的内存页指针更新bio vector 中的指针;

4)命中和丢失的扇区均视为最近访问的扇区,需要加入缓存中;若缓存已满, 则采用替换策略进行替换;

5)对于所有bio vector都命中缓存的请求,由于步骤3)中已经将内存页指针 更新成实际数据所在页的指针,相当于需要的数据已经全部取到内存中,就可以直 接结束读请求,将数据返回给上层;

6)如果不是所有bio vector都命中缓存,则按照要求扇区连续的原则,将原请 求分割成若干个小请求;

7)通过授权表机制将这些小请求的内存页共享给Dom0以便后续写入,并且 产生相应的ring request,放到ring buffer上;

8)后端驱动在接到事件通道通知后,处理前端递交过来的请求,从物理磁盘 中读取数据放进相应的内存页;完成后通知前端,请求结束。

由上可见,新过程同原过程不同体现在前半部分。当前端驱动接受到上层递交 的请求后,首先对请求的扇区是否命中缓存做判断。如果全部bio vector命中,那 么请求可以直接返回;否则,对原请求做压缩分割处理:将命中的部分剔除掉,留 下未命中的部分。之后的流程和原过程类似。

图3是缓存命中后对原请求的处理。当一个bio vector的所有扇区在缓存中发 现,说明这个bio vector命中缓存。那么之前为这个bio vector分配的DMA内存页 (准备将读磁盘的数据写入)可以被丢弃,修改bio vector结构中的页指针指向缓存 中提供的页。这样,这个bio vector指向的页里面就有之前已经取好的数据了,可 以直接返回。

Xen是一个开源的虚拟机监控器,xen虚拟机运行的操作系统代码如今已经被集 成在linux中。本发明主要修改的内容为xen的前端块设备驱动代码,在linux内核目 录下具体路径为driver/block/xen-blkfront.c。为了在原本的代码路径中增加本发明提 到的缓存功能,对此文件的主要修改如下:

1.在blkif_queue_request()函数中生成ring request之前以下代码。该代码的主要 功能是:对构成一个request的所有bio vector进行遍历,判断每个bio vector 是否命中缓存,如果命中,将页指针更新(更新sg->page_link)。在遍历的同时, 如果有需要分割出新的ring request(当中间有命中的bio vector时),开始构造 一个新的ring request。主要代码为清零每个ring request的bio vector数量的 nr_segments。这样一次遍历就可以完成对原request的缩减和分割功能。

2.在blkif_queue_request()末尾添加判断代码。如果req所有的bio vector均命中 缓存,那么req可以直接返回,通过调用blk_end_request_all函数。

以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需 创造性劳动就可以根据本发明的构思作出诸多修改和变化。因此,凡本技术领域中 技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验 可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号