用户空间中的基于服务器的持久性管理的制作方法

文档序号:15884375发布日期:2018-11-09 18:34阅读:149来源:国知局
用户空间中的基于服务器的持久性管理的制作方法

本申请要求于2015年12月11日提交的、名称为“server-basedpersistencemanagementinuserspace”的美国非临时专利申请第14/967,219号的优先权,其通过引用并入本文。

本文中描述的示例涉及存储管理,并且更具体地,涉及一种用于用户空间中的基于服务器的持久性管理的系统和方法。

背景技术

在计算中,文件服务器是被附接到网络的设备,该设备具有提供用于共享磁盘访问的位置(即,可以被连接到网络的其他机器或虚拟机访问的计算机文件(诸如文档、声音文件、照片、电影、图像、数据库等)的共享存储)的主要目的。一种常见类型的文件服务器是网络附接存储(nas)设备。nas专门用于通过它的硬件、软件或配置来为文件提供服务,并且通常被制造为计算机设备—特制专用计算机。nas系统是包含一个或多个存储驱动的联网设备,存储驱动器通常被布置在逻辑冗余存储容器或raid中。

还可以利用包括nas设备的文件服务器来形成存储区域网络(san),san提供对合并的块级数据存储装置的访问。san主要被用于增强存储设备(诸如磁盘阵列和磁带库),从而使得设备作为本地附接设备呈现给操作系统。san通常拥有其自己的存储设备的网络,这些存储设备通常不会被单独暴露于san之外。随着时间的推移,san的成本和复杂性已经下降,从而允许跨企业和中小型企业环境二者而被更广泛地采用。与此同时,包括nas设备的文件存储产品和服务器的数目也被极大地增加。

文件服务器通常提供高速缓存解决方案,该方案减少了响应于来自其他服务器的数据请求所必需的时间量。然而,利用这些高速缓存仍然需要将针对数据的请求传输到文件服务器,文件服务器可以位于通过网络可访问的远程异地位置。取决于距离和网络拥塞,服务器可能不得不等待不可接受的长久时间才能取回数据,即使它被高速缓存在文件服务器处。

附图说明

图1示出了根据一些方面的用于用户空间中的基于服务器的持久性管理的示例系统。

图2示出了根据一些方面的示例持久性管理器。

图3示出了用于使用用户空间中的基于服务器的持久性管理来读取数据的示例方法。

图4示出了用于使用用户空间中的基于服务器的持久性管理来写入数据的示例方法。

图5是示出可以在其上实现本文中描述的各方面的计算机系统的框图。

具体实施方式

诸如具有每秒高输入/输出操作(iops)的优化闪存设备的可用性以及将文件存储委托给专用数据存储设备的技术趋势已经使基于服务器的持久高速缓存成为利用远程数据存储的主机服务器的更具吸引力的选项。这些设备(包括网络附加存储(nas)和存储区域网络(san))可以提供针对企业环境的专用功能、更快的数据访问、更容易的管理和简单的配置。附加地,nas可以有效地利用存储容量,向很多不同的服务器环境提供文件,以及提供灾难恢复、故障转移和重复数据删除。然而,虽然像闪存驱动这样的快速存储技术已经有所改进,但由于存储设备被托管在远程非现场位置,因此通过网络将数据传输到存储设备的速度并不快,并且在很多情况下已经变得更糟。因此,在与应用本身更接近的服务器端管理的持久性高速缓存解决方案现在可以提供优于在存储设备本身处进行高速缓存的优势。

在传统方法中,本地高速缓存以各种方式在虚拟机(vm)的客户操作系统中的块层处、在管理程序中或在单独的vm中被完成。对于非虚拟化环境,高速缓存通常在操作系统的内核中在根或管理级别被完成。由于开源许可问题和服务器的操作系统内核的所有权问题,需要提供持久性管理的备选方法。

所描述的示例提供针对诸如nas设备等数据存储设备的服务器端持久性管理。可以在用户空间中将持久性管理器插入在服务器上运行的应用与应用用来与远程数据存储设备上的文件交互的文件系统api之间。一旦被插入,持久性管理器就可以拦截来自应用的api调用,以便将来自服务器上的高速持久性高速缓存的频繁访问的数据高速缓存并且为其提供服务。

除了其他优点之外,在服务器上运行的应用可以保持不变,因为插入器(interposer)拦截应用已经被编程为使用的标准文件系统调用。这允许持久性管理器与利用标准文件系统api的任何应用一起工作。此外,用于标准api的单个插入器(诸如posix)可以用于所有posix兼容应用。此外,持久性管理器可以提供针对被设计用于服务器端管理的存储的云端应用的高速缓存。

如所描述的示例将应用感知带给持久性管理层。例如,高速缓存管理器可以知道重做日志文件与数据库文件之间的区别,这可以允许用户做出逻辑决策,诸如是否需要复制数据库文件,将日志文件高速缓存在存储器中,等等。与传统的高速缓存解决方案不同,如所描述的示例将数据的高速缓存块分配与高速缓存管理分离,这允许持久性管理,而不论文件系统布局和介质类型如何。在一些方面中,块级高速缓存也可以通过将每个逻辑单元号(lun)映射为文件级高速缓存中的文件而被实现。

附加地,持久性管理器可以经由历元(epoch)管理来保持应用一致的快照,并且将这些快照周期性地刷新到数据存储设备。除其他好处之外,保持本地高速缓存的快照可以通过减少对数据存储设备进行的回写的量来提高效率。

根据一个方面,持久性管理系统在服务器处执行与多个应用相关联的操作。在服务器处,持久性管理器可以拦截来自应用中的一个应用的文件系统调用,其中文件系统调用指定被定位在与服务器分离的远程持久存储设备上的文件。持久性管理器可以确定属于由文件系统调用请求的文件的数据被存储在服务器处的本地持久存储设备上,从本地持久存储取回数据,并且使用数据响应于来自应用的文件系统调用。

在另外的方面中,当在本地持久存储设备上未找到另外的数据时,持久性管理器从远程持久存储设备取回属于文件的另外的数据。然后,持久性管理器可以使用数据和另外的数据响应于来自应用的文件系统调用,并且在单独的过程中将另外的数据写入本地持久存储设备。

在一个方面中,持久性管理系统将另外的数据写入与服务器成高可用性配置的对等服务器。此外,独立于与文件系统调用相关联的文件系统,可以将另外的数据写入本地持久存储设备。

在各个方面中,持久性管理器可以确定文件系统调用指定写入操作,将与写入操作对应的新数据写入本地持久存储设备,将新数据与数据的快照相关联,并且将数据的快照写入远程持久存储设备。

附加地,持久性管理器可以在服务器处拦截用户空间中的文件系统调用。拦截文件系统调用可以由第一进程执行,确定数据被存储在本地持久存储设备上可以由第二进程执行,并且第一进程和第二进程可以经由进程间通信机制通信。在一些示例中,来自应用的文件系统调用使用posixapi。

本文中描述的一个或多个方面提供了由计算设备执行的方法、技术和动作以编程方式或者作为计算机实现的方法而被执行。以编程方式表示通过使用代码或计算机可执行指令。以编程方式执行的步骤可以是或不是自动的。

本文中描述的一个或多个方面可以使用编程模块或组件而被实现。编程模块或组件可以包括能够执行一个或多个所述任务或功能的程序、子例程、程序的一部分、软件组件或硬件组件。附加地,模块或组件可以独立于其他模块或组件而存在于硬件组件上。备选地,模块或组件可以是其他模块、程序或机器的共享的元素或进程。

此外,本文中描述的一个或多个方面可以通过使用由一个或多个处理器可执行的指令而被实现。这些指令可以在计算机可读介质上执行。以下图中示出或描述的机器提供了处理资源和其上可以携带和/或执行用于实现一些方面的指令的计算机可读介质的示例。特别地,在一些示例中示出的大量机器包括处理器和用于保存数据和指令的各种形式的存储器。计算机可读介质的示例包括持久性存储器存储设备,诸如个人计算机或服务器上的硬盘驱动器。计算机存储介质的其他示例包括便携式存储单元,诸如cd或dvd单元、闪存或固态存储器(诸如在很多蜂窝电话和消费电子设备上携带的)和磁存储器。计算机、终端、启用网络的设备(例如,移动设备,诸如手机)都是利用处理器、存储器和存储在计算机可读介质上的指令的机器和设备的示例。

备选地,本文中描述的一个或多个示例可以通过使用由逻辑门的互连组成的专用硬件逻辑电路而被实现。这样的电路通常使用硬件描述语言(hdl)(诸如verilog和vhdl)来设计。这些语言包含最终定义电路布局的指令。但是,一旦电路被制造出来,就没有指示。所有的处理由互连的门而被执行。

系统概述

图1示出了根据一些方面的用于用户空间中的基于服务器的持久性管理的示例系统。持久性管理系统100包括跨网络160而被连接的服务器110、对等高可用性服务器150和远程存储设备170。在一些方面中,服务器110可以执行一个或多个应用130并且包括持久性管理器120,持久性管理器120用于每个应用130、本地存储装置135和操作系统140的适配器125。

在一些示例中,持久性管理器120将自身层叠在应用130下方作为posix插入器,并且通过posixapi与操作系统140交互,由此在服务器110处提供用于i/o自省(introspection)的用户空间控制点。这实现了新的应用级数据管理(诸如使用回写高速缓存的持久性),并且利用后端的远程存储设备170进行更传统的数据管理。例如,持久性管理器120可以拦截来自在远程存储设备170上请求数据的应用130的文件系统调用131,并且更快地从本地存储装置135中的高速缓存提供请求的数据。因此,通过使用预先存在的posixapi与应用130接口,持久性管理器120可以使远程存储设备170免于需要新兴的应用工作负载。尽管本文中以posix的形式描述示例持久性管理系统,但持久性管理器120可以拦截文件系统调用131并且使用被设计用于其他文件系统api的适配器125来与操作系统140交互。

在一些方面中,持久性管理器120包括与应用130中的每个应用对接的适配器125。每个适配器125可以是通过ld_preload拦截和过载posix调用的posix插入器。这些适配器125可以作为共享库而被暴露于核心持久性管理器120。在一些示例中,持久性管理器120通过插入器仅拦截与文件系统相关的posixapi。在文件系统调用131被拦截之后,持久性管理器120执行高速缓存功能,并且如果必要的话,将文件系统调用131移交给操作系统140上方的真实posix层。这允许持久性管理器120避免与文件系统或操作系统140的较低层的相关性。因此,插入器实现了持久性管理器120在用户空间中的能力,并且像任何其他用户空间应用130一样通过库调用与操作系统140交互。

核心持久性管理器120实现各种功能,诸如使用本地存储装置135(例如,固态或闪存驱动器)在服务器110处的持久性管理、到对等高可用性服务器150的复制、以及将持久性数据的快照147发送到远程存储设备170。附加地,持久性管理器120可以包括用于与不同类型的本地存储装置135接口的介质管理组件。

高速缓存被用于加速应用130的i/o性能,并且可以通过管理对本地存储装置135上的数据的访问来在持久性管理系统中被实现,从而消除对访问远程文件系统的需要(例如,在远程存储设备170上)。持久性管理器120利用被存储在高性能驱动器(诸如闪存设备)上的持久性读写高速缓存来提供可预测的性能。在一些方面中,持久性管理器120实现服务器110上的远程存储设备170的文件级高速缓存,从而使得能够从操作系统140的本机本地文件系统利用对高速缓存的文件数据的管理。其具体地利用高速缓存数据从文件系统的分配、解除分配和访问控制。附加地,高速缓存独立于文件系统的类型以及在其上创建文件系统的介质。这种架构使用户空间成为提供应用管理的闪存存储的高速缓存功能的控制点。持久性管理器120高速缓存管理功能可以作为与每个适配器125相同的进程的一部分来运行,或者作为具有使用线程/进程与高速缓存管理器之间的进程间通信(ipc)的共享存储器的单独进程来运行。在单独进程示例中,单个高速缓存管理器可以通过ipc与多个应用130和适配器125交互。高速缓存管理器可以使用多种技术中的一种技术处理高速缓存请求,这些技术包括循环法和优先级顺序库。

当适配器125中的一个适配器拦截来自应用130的读取i/o操作时,持久性管理器120可以确定在操作中请求的数据是否被高速缓存在本地存储装置135上,并且如果是,则在响应145中向应用130返回本地数据133。这可以在不必将文件系统调用131移交给操作系统140上方的真实posix层或者不必通过网络160将数据请求141发送到远程存储设备170的情况下被执行。在一些方面中,只有部分请求的数据被高速缓存在本地存储装置135上。持久性管理器120可以将文件系统调用131移交给操作系统140上方的真实posix层,以便产生数据请求141并且取回远程数据143。持久性管理器120然后可以组合本地数据133和远程数据143,以便将响应145发送回请求应用130。附加地,远程数据143可以被高速缓存在本地存储装置135上以供将来使用。

持久性管理器120可以将回写高速缓存实现为用于将服务器110中的应用数据管理与远程存储设备170中的存储数据管理分离的机制。然而,在一些情况下,服务器110中的回写高速缓存可以是数据的唯一副本,这会使数据容易受到服务器故障、硬件故障或其他故障的影响。因此,示例通过到对等高可用性服务器150的复制来为服务器110中的高速缓存数据提供高可用性(ha),对等高可用性服务器150可以使用低等待时间互连而连接到服务器110。到ha对等体的数据复制可以由持久性管理器120的子组件管理。在一些示例中,对等高可用性服务器150包括与服务器110类似的组件,并且保持通过网络160到远程存储设备170的连接。在服务器110或诸如本地存储装置135等其他组件经历故障的情况下,对等高可用性服务器150可以接管。在服务器110上运行的应用130可以在对等高可用性服务器150上被重新启动,并且使用这些应用130的客户端可以被重定向。

被写入服务器110中的本地存储装置135的数据周期性地通过网络160被刷新到远程存储设备170。这种刷新可以通过应用一致性快照机制以被称为历元的规则间隔而被执行。网络160可以是具有使用以太网被刷新的快照147的局域网160,或者在其他示例中,网络160可以是具有通过如tcp/ip等协议被刷新的快照147的较大网络(例如,因特网)。尽管在图1中为了简单起见而仅示出了一对服务器,但是远程存储设备170可以针对任何数目的服务器对来为文件提供服务。

图2示出了根据一些方面的示例持久性管理器220。持久性管理器220可以被分成两层:持久性层和存储器内层。持久性层存储元数据和本地高速缓存数据235的存储器映射文件201,并且存储器内层包含内核和用户空间组件两者。在一些示例中,用户空间组件包括高速缓存管理器202,高速缓存管理器202可以经由appmgr进程间通信(ipc)客户端203与appmgr复制客户端204通信。关于图1,应用230可以表示应用130中的一个应用,并且gnulibcposix插入器225可以对应于适配器125中的一个适配器,适配器125可以被编译为在运行时期间与ld_preload标志一起使用的共享库。

在一些方面中,高速缓存管理器202的布局包括报头、用于更快速查找的元数据条目的散列表、作为阵列而存储的元数据条目、空闲队列和最近最少使用(lru)队列。元数据条目的改变被周期性地同步到持久性层中的存储器映射(mmap)文件201。例如,它们可以每秒被同步一次。报头包含跨越节点重新启动来启动高速缓存管理器202所必需的信息,并且高速缓存数据(以区段的形式)由被称为闪存高速缓存区段(fce)的元数据跟踪,fce是被保持在高速缓存管理器202中的核心数据结构。

在一些示例中,高速缓存管理器202的数据结构在跨越重新启动时被保持。数据结构经由存储器映射文件201而被分配和管理,并且数据结构中的指针引用相对于与每个数据结构的起始地址的偏移量而被做出。这些数据结构作为存储器映射文件被持久地保存在本地文件系统上。在重新启动之后,对于文件中的每个指针引用,可以将相对地址从新的起始地址转换为绝对地址。对于软重新启动,高速缓存管理器202可以确保与元数据相关的所有脏数据被同步到存储器映射文件201。

范围表示由高速缓存管理器202跟踪的高速缓存数据的最小单位。范围的大小可以根据高速缓存管理器202的配置而变化。例如,当高速缓存管理器202启动时,大小可以被初始化为256kb、1mb或另一值。如果典型的工作负载的i/o大小很小,则较小的区段大小可以产生出色的性能。类似地,如果工作负载的i/o大小很大,则可以使用1mb区段大小来保持低的元数据开销,这可以产生高速缓存管理器202的更好的性能。如果较小的区段大小(例如,256kb)是用于大的i/o工作负载,则这可以产生用于跟踪高速缓存数据的大量元数据开销。如果较大的区段大小(例如,1mb)用于较小的i/o,则过量的高速缓存空间可以保持为空并且被浪费。在一些方面中,一旦设置了区段大小,就不可能动态地改变它,直到所有脏数据被刷新到远程存储设备并且高速缓存管理器202被重新初始化。

在另外的示例中,每个fce的大小是102字节,这允许fce的512mb的存储器开销来支持5tb的高速缓存数据。附加地,每个区段可以被划分为256个子块,这些子块存储为区段元数据中的比特。可以将1mb区段管理为256个4kb子块,并且可以将256kb区段管理为256个1kb子块。附加地,存储在fce中的256位表示给定的子块是否存在于高速缓存中。类似地,可以存储256位脏位图以表示给定子块是否为脏,这表示数据没有被刷新到远程文件系统。换言之,针对子块而被设置的脏位表示高速缓存中的子块的数据比远程存储设备上的数据更新并且因此应当被写入远程存储设备。在一些示例中,使用快照机制来周期性地写入脏数据。

一些方面提供两种类型的锁定:“共享”和“异常”锁定。“共享”锁定用于同时读取请求,并且“异常”锁定用于读取路径中的写入请求和高速缓存未命中请求。原子锁定计数器被添加到fce以保持跟踪所采取的锁定。fce还具有等待队列,等待队列将后续i/o请求排队,这些后续i/o请求需要“异常”锁定才能访问该区段。这些锁定和队列可以被用来保护数据完整性,例如,以防止多个应用同时覆盖相同的数据或读取其他应用正在写入的数据。

fce可以具有用于散列表的链接列表节点元素,并且可以被保持在最近最少使用(lru)队列中,lru队列可以有两种类型:空闲队列和可用队列。在初始化时,fce被分配并且被推入空闲队列。fce也可以分为两类:具有数据块的fce和没有数据块的fce。具有数据块的fce的数目取决于可用本地存储容量除以区段大小。

没有数据块的fce用于表示从高速缓存中逐出的区段。这两种类型的fce都在初始化期间被添加到空闲队列,并且在i/o期间被使用。附加地,可以实现散列表以更快地搜索fce。在i/o期间,如果在散列表中未找到fce,则对应的fce从空闲队列中被分配并且被移入散列表。因此,除了处于可用的lru队列中之外,给定的fce还将处于空闲队列或散列表中。

历元管理组件可以被包括在高速缓存管理器202中以管理应当经由存储效率机制被刷新到远程存储设备的数据的快照。这个特征实现了应用一致快照,只要存在应用230静止(quiescence)能力。当存储效率机制请求历元(即,当前历元)时,后续写入请求可以被转移到写入数据的本地文件系统上的另一目录(即,下一历元),直到历元点被冻结并且被标记用于存储效率处理。一旦存储效率机制指示数据已经被刷新到远程存储设备,则通过重置脏位以清理该历元的数据,将fce标记为干净。

根据一些示例,本地文件系统将预定义的前缀字符串前置到远程文件系统的高速缓存文件。通过在本地文件系统中创建两个预定义的前缀文件夹,一个用于当前历元,另一个用于前一历元,可以管理快照而无需用于历元管理的附加元数据开销。此外,表示高速缓存本地数据文件的区段的fce存储当前历元值,并且除了文件名和偏移量之外,散列表搜索还可以包括当前历元。高速缓存管理器202可以在本地文件系统中针对两个历元查找fce。

与诸如读取和写入等文件系统操作相反,由应用230请求的文件系统元数据操作没有被路由到高速缓存管理器202。作为替代,元数据操作在本地和远程文件系统两者上执行。

在一些方面中,高速缓存数据通过到对等服务器的复制而被保护以防止节点故障/介质故障,对等服务器为应用的数据提供高可用性。在将确认发送回应用230之前,对于每个写入i/o,复制客户端204(例如,appmgr复制客户端)可以将高速缓存数据复制到对等节点。在服务器故障或其他故障的情况下,对等服务器可以重新启动应用230并且使用复制的数据。在正常的不间断的服务器操作期间,应用230和对等服务器上的数据可以保持处于被动模式。

对本地文件系统上的高速缓存文件数据的管理可以从现有的操作系统和文件系统中利用,这简化了高速缓存实现并且允许其在用户空间中被完全管理。此外,插入器225和客户端203、204不修改应用230并且尽可能保持无状态。复制客户端204咨询高速缓存管理器202以确定由应用230请求的文件数据是否被高速缓存在本地文件系统中(即,本地高速缓存数据235)。如果文件数据未被高速缓存,则复制客户端204将文件数据请求传递给操作系统api(例如,gnulibctrueposix),操作系统api可以从远程文件系统请求数据。一旦数据被接收到,本地缓存可以作为后台操作在本地文件系统上被填充。在一些示例中,高速缓存填充请求被排队等待异步操作,该异步操作由作为高速缓存管理器202的一部分的写入调度器线程拾取。

在一些方面中,高速缓存管理器202独立启动,并且当应用230被启动时,每个posix内插程序225被启动。远程文件系统安装路径和本地文件系统安装路径可以遵循命名约定,以使得高速缓存文件系统的目录上的元数据操作(例如,mkdir、rmdir等)更简单和更快。这个命名约定还可以通过消除对搜索正确的高速缓存文件名的需要来提高高速缓存数据文件的查找速度。例如,如果远程存储设备安装点是/os/app/file,则高速缓存数据可以被存储在本地文件系统上在/cache_prefix_path/os/app/file处。在远程存储设备上的远程文件系统的开放posix调用期间,posix内插程序225可以简单地打开本地缓存文件系统上的文件,其中cache_prefix_path前置到由应用指定的远程路径。附加地,本地文件描述符、远程文件描述符和远程文件名校验和可以被保存在表中。当应用230在打开的posix调用期间在读/写i/o操作中传递文件描述符时,可以使用从与区段大小对齐的偏移量获取的文件名和起始偏移量的校验和作为散列表搜索。

由于高速缓存对应用透明地被完成,因此应用230保持对远程文件系统文件描述符的访问。但是,为了避免在重新启动之后使用不同的名称装入远程文件系统,可以计算并且存储由应用使用的远程文件系统路径的校验和。这可以在重新启动之前被完成,以避免在装入点发生更改时丢失先前存在的数据。

在现代操作系统中,独立进程在它们的独立的地址空间中运行,这通常不允许进程彼此直接通信。然而,将功能上不同的部分分成独立的进程并且让它们经由进程间通信(ipc)机制通信可能是有利的。因此,一些方面将持久性管理器220的高速缓存管理器202(服务器)组件与posix内插程序225和复制客户端204(客户端)分离,使得它们可以独立于应用而运行。与单个进程模型相比,这带来了几个优点。例如,如果应用230失败(由于错误、故障、黑客等),高速缓存管理器202组件不受影响并且可以继续服务于其他应用230。多进程模型还可以支持多处理器应用230,并且每个模块都可以独立地开发和调试。

方法

图3示出了用于使用用户空间中的基于服务器的持久性管理来读取和写入数据的示例方法。图4示出了用于使用用户空间中的基于服务器的持久性管理来写入数据的示例方法。虽然图3和图4的示例的操作在下文中被描述为由持久性管理系统100或持久性管理器220的特定组件、模块或系统执行,但是应当理解,这些操作不一定需要由所标识的特定组件执行,并且可以由可能分布在多台机器上的各种组件和模块执行。因此,为了说明用于执行所描述的步骤或子步骤的适当组件或元件,可以参考持久性管理系统100的元件。备选地,在系统100中描述的各种组件和模块中的至少某些可以被布置在单个硬件、软件或固件组件内。还应当理解,该方法的一些步骤可以并行或者以与所示的不同的顺序被执行。

参考图3的示例,通过例如如图1所述的持久性管理系统100来拦截应用读取i/o操作(310)。在一些方面中,读取操作采用由应用进行的posixapi调用的形式,并且该api调用在作为持久性管理器120的一部分的诸如适配器125的posix插入器处被拦截。接下来,读取i/o(fd、buffer、count)经由ipc被路由到高速缓存管理器进程。高速缓存管理器根据计数(i/o大小)确定区段的数目,并且针对每个区段搜索散列表。与应用i/o大小相比,基于区段大小,可以将单个应用i/o分为单个或多个连续的读取区段i/o。

对于每个区段大小的i/o,通过使用文件名和偏移量的校验和(或crc)来查找散列表以找到文件高速缓存区段(fce)来确定高速缓存命中(320)。如果fce已经存在于散列表中,则通过检查fce的有效位,在子块级别(例如,4kb或更少)处进一步确定区段的高速缓存命中。如果所有子块均有效,则区段被声明为高速缓存命中。请求fce上的“共享”锁定类型,并且允许应用从本地存储高速缓存读取本地文件系统数据。如果某些子块无效,则请求fce上的“异常”锁定类型。如果任何一个锁定不可用,则可以将i/o请求移动到fce的等待队列,当fce被锁定fce的前一请求解锁时,fec被唤醒。

当区段在散列表中不可用时发生高速缓存未命中,这导致fce从空闲队列被分配。如果空闲队列耗尽,则从空闲队列中移除有效的最近最少使用(lru)队列中最旧的fce,将其从散列表中移除,并且将其数据复制到从fce的虚幻(ghost)lru队列获取的虚幻fce。这个被释放的fce被用作新的fce,并且用诸如偏移量、当前i/o的文件名的crc、和锁定计数等字段以及“异常”锁定来初始化。这个新的fce然后被添加到散列表。

在一些方面中,高速缓存管理器提供用于支持向应用展示比可用于服务器的实际物理存储容量更大的高速缓存容量的驱逐管理机制。这种额外的容量是以没有对应的存储空间的虚幻fce的形式存在的。虚幻fce列表被保持为虚幻lru队列。在高速缓存管理器初始化期间,可以完全分配支持最大高速缓存大小所必需的多个fce。在一些示例中,达到最大高速缓存大小表示所有fce在本地存储上具有高速缓存数据的区段。基于本地存储的可用高速缓存容量,fce被分类为本地fce、对等fce和虚幻fce。当应用工作集超过高速缓存介质容量时,lru队列用于将某些fce驱逐为虚幻fce,并且对应的数据块可以被释放。在一些示例中,xfs文件系统被用作闪存介质存储上的本地文件系统,因为它支持冲孔(punchingholes),这释放了本地文件系统上的高速缓存数据资源以用于新数据。附加地,只有读取高速缓存被驱逐,以支持远程存储设备上的更大容量。

对于区段对齐的i/o,一旦所有fce被锁定,高速缓存管理器向持久性管理器的客户端进程发送布尔值和子块比特的阵列,该阵列的大小取决于给定的应用i/o请求大小的区段的数目。具有子块位的每个值指示在子块级的高速缓存命中或未命中。基于从高速缓存管理器返回的这个布尔向量和子块位,持久性管理器客户端或者从本地文件系统(330)或者从远程文件系统(340)读取。在一些示例中,文件数据请求被传递到操作系统api(例如,posix层),操作系统api可以从远程文件系统请求数据。

对于区段未对齐的i/o,基于由应用请求的i/o的文件偏移量和长度来完全读取第一或最后的区段子块。对于在开头未对齐的子块,从本地或远程文件系统读取整个子块,并且从i/o开始到子块结束的数据被复制到缓冲器。对于在最后未对齐的子块,从本地或远程文件系统读取整个子块,并且从子块开始到i/o结束的数据被复制到缓冲器。

在一些方面中,区段i/o对从应用传递的缓冲器的相应区域操作。第一区段可以覆盖缓冲器的一部分,直到距离缓冲器的起始地址的区段大小。后续区段覆盖缓冲器的相应部分,并且复制到缓冲器的数据受限于部分区段的起始偏移量和计数参数。在读取操作期间,fce被锁定并且从lru队列中移除。对于高速缓存未命中,fce通过“异常”锁定被分配并且添加到散列表。一旦完成对所有区段的读取(远程或本地),则将来自两个文件系统的组合数据返回给请求应用(350)。

对于高速缓存未命中的每个区段,可以对写入请求排队以填充本地文件系统上的高速缓存作为背景活动(360)。一旦这个本地写入完成,对应的区段可以使用有效位来更新。如果在这个操作期间出现在相同区段上的任何新的读/写i/o,则它们在“异常”锁定等待队列中排队,直到写入完成,这释放锁定(370)。一旦“异常”锁定被释放,等待解锁的应用线程/进程请求被唤醒,并且线程/进程中的一个线程/进程根据对高速缓存管理器的读或写请求而获取“共享”或“异常”锁定。

对于fce中的部分有效子块,在子块级读取来自两个文件系统(远程和本地)的数据。选择其有效位被设置的数据以添加到组合缓冲器,其然后可以在区段级别被复制到缓冲器。在读取i/o操作结束时,fce被添加到lru队列。

参考图4的示例,通过例如如图1所述的持久性管理系统100来拦截应用写入i/o操作(410)。类似于读取路径,写入操作可以采取由应用进行的posixapi调用的形式,并且该api调用在作为持久性管理器120的一部分的诸如适配器125等posix插入器处被拦截。接下来,读取i/o(fd、buffer、count)经由ipc被路由到高速缓存管理器进程。高速缓存管理器根据计数(i/o大小)确定区段的数目,并且针对每个区段搜索散列表。与应用i/o大小相比,基于区段大小,可以将单个应用i/o分为单个或多个连续的读取区段i/o。

对于每个区段大小的i/o,通过使用文件名和偏移量的校验和(或crc)来查找散列表以找到文件高速缓存区段(fce)来确定高速缓存命中(420)。如果fce已经存在于散列表中,其被视为高速缓存命中,则无论子块是否有效。fce上的“异常”锁定类型被请求,并且与读取路径类似,如果锁定不可用,则将i/o请求移动到fce的等待队列,当fce被锁定fce的前一请求解锁时,fce被唤醒。

当区段在散列表中不可用时发生高速缓存未命中,这导致fce从具有数据块的空闲队列被分配。如果空闲队列耗尽,则从空闲队列中移除有效的最近最少使用(lru)队列中最旧的fce,将其从散列表中移除,并且将其数据复制到从fce的虚幻lru队列获取的虚幻fce。这个被释放的fce被用作新的fce,并且用诸如偏移量、当前i/o的文件名的crc、和锁定计数等字段以及“异常”锁定来初始化。这个新的fce然后被添加到散列表。

对于区段对齐的i/o,一旦所有fce被锁定,高速缓存管理器发送布尔值和子块位的阵列,该阵列的大小取决于给定的应用i/o请求大小的区段数目。具有子块位的每个值指示在子块级的高速缓存命中或未命中。对于命中和未命中两者,持久性管理器客户端从缓冲器写入本地文件系统并且更新fce的脏位图(430)。

对于区段未对齐的i/o,基于由应用请求的i/o的文件偏移量和长度来完全读取第一或最后的区段子块。对于在开头未对齐的子块,从本地或远程文件系统读取整个子块,并且从i/o开始到子块结束的数据被复制到缓冲器。对于在最后未对齐的子块,从本地或远程文件系统读取整个子块,并且从子块开始到i/o结束的数据被复制到缓冲器。然后可以将缓冲器写入本地文件系统。

在一些方面中,区段i/o对从应用传递的缓冲器的相应区域操作。第一区段可以覆盖缓冲器的一部分,直到距离缓冲器的起始地址的区段大小。后续区段覆盖缓冲器的相应部分,并且复制到缓冲器的数据受限于部分区段的起始偏移量和计数参数。在写入操作期间,fce被锁定并且从lru队列中移除。对于高速缓存未命中,fce通过“异常”锁定被分配并且添加到散列表。一旦完成对本地文件系统的所有区段的写入,则将写入确认返回请求应用,并且使用脏位更新区段(440)。如果在这个操作期间出现在相同区段上的任何新的读/写i/o,则它们在“异常”锁定等待队列中排队,直到写入完成,这释放锁定(450)。一旦“异常”锁定被释放,等待解锁的应用线程/进程请求被唤醒,并且线程/进程中的一个线程/进程根据对高速缓存管理器的读或写请求而获取“共享”或“异常”锁定。

对于fce中的部分有效子块,由于来自应用的数据是新的,因此其被写入区段的每个子块,并且对应的脏位在fce中被设置。在写入i/o操作结束时,fce被添加到lru队列。

计算机系统

图5是示出可以在其上实现本文中描述的各方面的计算机系统的框图。例如,在图1的上下文中,持久性管理系统100可以使用诸如图5所描述的一个或多个服务器而被实现。

在一个方面中,计算机系统500包括处理器504、存储器506(包括非暂态存储器)、持久性管理器508、存储设备510和通信接口518。计算机系统500包括用于处理信息的至少一个处理器504。计算机系统500还包括用于存储要由处理器504执行的信息和指令的主存储器506,诸如随机存取存储器(ram)或其他动态存储设备。主存储器506还可以用于在要由处理器504执行的指令的执行期间存储临时变量或其他中间信息。计算机系统500还可以包括用于存储处理器504的静态信息和指令的只读存储器(rom)或其他静态存储设备。诸如磁盘或光盘等存储设备510被提供用于存储信息和说明。通信接口518可以使得计算机系统500能够通过使用网络链路520和多种公知传输协议(例如,超文本传输协议(http))中的任何一种来与一个或多个网络通信。网络的示例包括局域网(lan)、广域网(wan)、因特网、移动电话网络、普通老式电话服务(pots)网络和无线数据网络(例如,wifi和wimax网络)。

本文中描述的示例涉及使用计算机系统500来实现本文中描述的技术。根据一个方面,那些技术由计算机系统500响应于处理器504执行包含在主存储器506中的一个或多个指令的一个或多个序列而被执行。这样的指令可以从另一机器可读介质(诸如存储设备510)读入主存储器506。包含在主存储器506中的指令序列的执行使得处理器504执行本文中描述的处理步骤。在备选方面中,可以使用硬连线电路来代替软件指令或与软件指令组合以实现本文中描述的方面。因此,所描述的方面不限于硬件电路和软件的任何特定组合。

尽管已经参考附图在本文中详细描述了示例性方面,但是本公开内容涵盖对具体示例和细节的变化。意图在于,本文中描述的示例的范围由权利要求及其等同物限定。此外,可以设想,单独或作为一个方面的一部分而描述的特定特征可以与其他单独描述的特征或其他方面的部分组合。因此,不存在描述性组合不应当妨碍发明人声明对这样的组合的权利。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1