利用异步冲刷对写入进行节流的制作方法

文档序号:17600316发布日期:2019-05-07 20:11阅读:242来源:国知局
利用异步冲刷对写入进行节流的制作方法

数据存储系统是硬件和软件的布置,其通常包括耦合到非易失性数据存储设备的阵列(例如磁盘驱动器、电子闪存驱动器和/或光学驱动器)的一个或多个存储处理器。存储处理器服务从主机接收到的主机输入/输出(i/o)操作。接收到的i/o操作指定要被写入、读取、创建或删除的存储对象(例如逻辑盘或“lun”)。存储处理器运行如下软件,该软件管理传入i/o操作并执行各种数据处理任务以对从主机接收到的并且存储在非易失性数据存储设备上的主机数据进行组织和确保其安全。

一些数据存储系统将数据组织到文件系统中,文件系统被存储在相应的lun上。这些系统中的一些利用映射的lun,该映射的lun由汇集在一起并且之后被映射到特定地址的底层存储构成。在这些系统中,尤其是在新写入时,存在与将文件系统内的位置映射到底层存储上的位置相关联的一定延迟。因此,为了加速操作,这些系统可以将传入写入缓存到文件系统,允许数据在稍后的时间被“冲刷”到底层存储。



技术实现要素:

遗憾的是,上述传统方法遭受缺陷。例如,如果传入写入到来得太快以至于缓存被淹没,则将来的写入可能被阻塞。这个结果可以通过使用同步冲刷来缓解。在这些技术中,当新写入被缓存时,如果缓存内剩余的存储器的量太低,则系统可以在完成新写入的缓存之前启动数据到底层存储的同步冲刷。遗憾的是,尽管这清除了针对将来的写入的缓存,但是其可能在刚好在缓存填充到阈值以外时发生的那些写入上引入很大延迟。因此,当写入带宽太高时,最大延迟(以及平均延迟)可以达到迅速增大。在一个示例高性能数据存储系统中,当写入带宽高于大约1.5千兆字节每秒(gbps)时,最大写入延迟可以从处于毫秒范围内的典型值增大到超过8秒。

因此,将期望数据存储系统能够当写入带宽高时将数据冲刷到底层存储同时仅仅最小地影响最大延迟。这可以通过利用异步冲刷并且通过当可用缓存空间的量太小时通过防止太多异步冲刷发生而对传入写入进行节流来完成。在上述示例高性能数据存储系统中,当这些技术被应用时,即使当写入带宽高于大约1.5千兆字节每秒(gbps)时,最大写入延迟也已经在实验上被发现为从8秒下降到大约200毫秒。

还可以进行进一步的改进。当在文件或文件系统上使用快照或重复删除时,可以在若干不同的文件系统级块之间共享底层存储的一些块。这能够进一步影响冲刷数据需要的时间量,因为当共享块被写入时,其将需要被取消共享并且额外的底层块将需要被分配以存储新数据。另外,写入缓存空间必须被保留以确保存在足够的空间来临时存储旧数据(其仍然在由其他快照或由其他重复删除的块使用中)和新数据两者。这被称为首次写时复制(cofw)。然而,当使用快照并且cofw被用于保护共享数据时,系统可能低估或高估其需要为cofw存储缓冲保留的空间量。如果系统高估该量,则其可能甚至当可用存储器的量仍然相当大时也启动写入节流。因此,例如,一种采用cofw的系统可以在可用写入缓存的量下降到65%以下时才启动写入节流。在改进的版本中,存储cofw缓冲实际需要的空间量的保留被减去,允许阈值下降到较小的阈值(例如45%)。在示例系统中,这种改进已经在实验上被发现为将最大写入延迟改进了18倍或更多并且将平均写入延迟改进了10倍。

另外,甚至能够当写入带宽不是过多时进行进一步的改进。在通常的系统中,文件系统的每个文件由单独的互斥锁保护,允许一次仅仅一个写入操作针对特定文件被缓存。在改进中,仅仅写入缓存过程的一部分在互斥锁的保护下被放置,允许针对任何给定写入操作的写入缓存的很大一部分在不需要互斥锁的情况下被执行,允许一定增加的并行化。在一些实施例中,代替互斥锁,自旋锁可以由于需要保护的时间减少而被代替地利用,进一步改进延迟。在上述示例高性能数据存储系统中,当这些改进被应用在低带宽情形(例如,仅仅大约0.6gbps的写入带宽)中时,平均写入延迟已经在实验上被发现为下降超过100倍,从大约13毫秒下降到大约80微妙。

在一个实施例中,执行一种有效地处理由计算机数据存储系统接收到的写入请求集合的方法,每个写入请求标识要被写入到文件的相应的连续区域的块对准的数据的相应的集合。该方法包括,针对写入请求集合中的每个写入请求:(1)将该写入请求的块对准的数据复制到缓冲的文件特定排序的列表中,(2)在复制之后,执行决策操作,该决策操作被配置为:(a)当计算机数据存储系统可用于存储缓冲的存储器的量下降到阈值量以下时产生第一结果,并且(b)当计算机数据存储系统可用于存储缓冲的存储器的量超过阈值量时产生第二结果,(3)响应于决策操作当处理第一写入请求时产生第一结果,在前进之前进入等待状态,等待状态挂起对第一写入请求的处理直到当前忙碌的异步冲刷线程变得空闲,(4)响应于决策操作当处理第二写入请求时产生第二结果,前进以处理第二写入请求而不进入等待状态,(5)在针对第一写入请求和第二写入请求两者前进时,将可用异步冲刷线程配置为将数据缓冲从文件特定排序的列表异步地冲刷到底层持久性存储,并且(6)响应于配置异步冲刷线程,将该写入请求的完成的确认发送回到发出该写入请求的客户端。还提供了一种用于执行类似的方法的装置、系统和计算机程序产品。

前述发明内容出于说明性目的而被呈现以帮助读者容易领会本文呈现的示例特征。然而,前述发明内容不旨在阐述必需的元件或以任何方式限制其实施例。

附图说明

前述和其他特征和优点将从如附图中图示的本发明的特定实施例的以下描述变得明显,其中类似的附图标记在不同的视图中指代相同或类似的部分。

图1是描绘用于结合各种实施例使用的示例装置的框图。

图2是描绘各种实施例的示例方法的流程图。

图3是描绘各种实施例的示例方法的流程图。

图4是描绘各种实施例的示例方法的流程图。

具体实施方式

实施例涉及用于允许数据存储系统能够当写入带宽高时将数据冲刷到底层存储同时最小地影响最大延迟的技术。这可以通过利用异步冲刷并且通过当可用缓存空间的量太小时通过防止太多异步冲刷发生而对传入写入进行节流来完成。还可以进行进一步的改进。因此,例如,一种采用首次写时复制(cofw)的改进的系统可以仅仅在可用写入缓存的量下降到动态计算的阈值以下时才启动写入节流,该动态计算的阈值说明存储cofw缓冲实际需要的空间量。作为另一示例,仅仅写入缓存过程的一部分在互斥锁或自旋锁的保护下被放置,允许针对任何给定写入操作的写入缓存的很大一部分在不需要互斥锁或自旋锁的情况下被执行,允许一定增加的并行化。

图1描绘用作数据存储系统(dss)的示例计算设备32。dss计算设备32可以是任何种类的计算设备,例如,个人计算机、工作站、服务器计算机、企业服务器、dss机架服务器、膝上型计算机、平板计算机、智能电话、移动计算机、等等。在示例中,计算设备32是dss机架服务器。

dss计算设备32包括网络接口电路34、处理电路36、存储器40、存储接口电路42以及持久性数据存储44。dss计算设备32还可以包括如本领域中公知的其他部件,包括互连电路。

网络接口电路34可以包括一个或多个以太网卡、蜂窝调制解调器、光纤通道(fc)适配器、无线保真(wi-fi)无线网络适配器、和/或用于连接到(未描绘的)网络的其他设备。网络接口电路34允许dss计算设备32与能够通过要实现的网络将数据存储命令发送到dss计算设备32(例如,写入命令48)的(未描绘的)一个或多个主机设备进行通信。

处理电路36可以是被配置为执行操作的任何种类的处理器或处理器的集合,例如微处理器、多核微处理器、数字信号处理器、片上系统、电子电路的集合、类似种类的控制器、或以上的任何组合。如所描绘的,处理电路36包括多个处理核37(被描绘为核37(a)、37(b)、……、37(m)),允许处理电路36一次运行m(或者,在一些实施例中,两倍的m)个同时的线程。

在一些实施例中,dss计算设备32可以被构建为两个或更多个存储处理器(sp,未描绘)的集合,每个sp被安装在单独的板上,每个sp具有它自己的网络接口电路34、处理电路36、存储器40以及存储接口电路42,但是在它们之间共享存储44。在这样的实施例中,高速sp间总线可以连接sp。为了冗余和性能原因,可以存在安装在dss计算设备32上的多于一个sp。在这些实施例中,为了本公开内容的目的,每个sp可以被独立地考虑。

持久性存储44可以包括任何种类的持久性存储设备,例如,硬盘驱动器、固态存储设备(ssd)、闪存驱动器、等等。存储接口电路42控制并提供对持久性存储44的访问。存储接口电路42可以包括例如scsi、sas、ata、sata、fc、m.2和/或其他类似的控制器和端口。

存储器40可以是任何种类的数字系统存储器,例如,随机存取存储器(ram)。存储器40存储运行中的操作系统(os,未描绘)(例如,linux、unix、windows、macos或类似的操作系统内核)。存储器40还存储存储驱动器堆栈46,其在处理电路36上运行以实现来自主机的数据存储请求。存储驱动器堆栈46可以包括若干不同的存储相关的驱动器。尽管这些驱动器中的大多数未进行描绘,但是描绘了存储驱动器堆栈46中的两个特定驱动器:文件系统管理器50和lun管理器52。

文件系统管理器50被配置为管理安装在dss计算设备32上的一个或多个文件系统58。每个文件系统58被配置为被存储在dss计算设备32的特定逻辑卷(也被称为逻辑单元号lun54)上。如本领域中公知的,每个文件系统58可以存储一个或多个文件60(被描绘为文件60(a)、60(b)、……)。如本领域中公知的,每个文件60包括存储文件60的数据的一个或多个数据块62、64。在一些布置中,文件系统管理器50还可以管理一个或多个快照56,每个快照保留一个或多个文件60的先前版本作为检查点文件60’。当首次创建时,快照56不包括检查点文件60’的数据的实际副本。相反,快照56的检查点文件60’最初与相应的文件60共享共享数据块62(利用虚线边界被描绘为共享块62(1)、62(2)、……、62(p)以指示这些块实际上未被单独地存储作为快照56的部分)。然而,当文件60的数据被修改时,原先共享的块(例如,共享数据块62(2))可以利用新的非共享数据块64(例如,非共享数据块64(1))来重写。一旦这种情况发生,先前共享的数据块64(2)就从文件60移除,但是其仍然被维持在快照56内作为检查点文件60’内的非共享数据块65(例如,非共享数据块65(1))。一旦这种情况发生,快照56的元数据(例如,索引节点和间接块,未描绘)可能就需要被修改(或者被创建,如果文件60先前与检查点文件60’共享了所有它的元数据的话)。

应当理解,尽管包括文件系统58、文件60、共享块62、非共享块64(被描绘为非共享块64(1)、64(2)、……、64(q))、非共享块65(被描绘为非共享块65(1)、65(2)、……、65(t))、lun54和快照56的特定数据被描绘为被存储在存储器40内,但是,在一些实施例中,这种数据中的一些或全部可以实际上不被存储在存储器40内。相反,其可以被存储在持久性存储44内。然而,通常,当文件60正在被主动访问时,其块62、64中的至少一些被缓存在存储器40内。

lun管理器52被配置为管理由持久性存储44支持的一个或多个lun54。在一些实施例中,每个lun由从持久性存储44提取的数据的一个或多个切片(未描绘)支持。这些切片可以被连接在一起以创建存储一个或多个文件(未描绘)的“下层文件系统”(ldfs)。存储在ldfs上的一个文件是表示lun54的卷文件。

存储器40还包括由os、存储驱动器堆栈46以及各种其他应用(未描绘)使用的各种其他数据结构。这种数据至少包括缓冲缓存池(bcp)72,其用作缓存。bcp72包括一个或多个缓存的缓冲74,其可以存储稍后要被冲刷到底层lun54的数据块(并且最终被存储在持久性存储44上)的数据。每个缓冲74通常为与文件系统58数据块62、64相同的大小,其也为与lun54内的块相同的大小。这种块大小可以取决于实施例而变化,但是在通常的实施例中,其是2的幂数字节,例如8,192字节(8kb)。bcp72可以存储一个或多个iolists75(被描绘为75(a)、75(b)、……),其中的每个是缓冲74的链表,缓冲74的链表存储要被插入到文件系统58的相应的文件60中的数据块的缓存的数据。这些缓冲74将最终被冲刷到底层lun54的块(并且最终被存储在持久性存储44中),但是目前,它们被缓存在bcp72中。存在针对每个文件60的单独的iolist75(但是,如果不存在针对特定文件60的有待缓存的写入,则可能此时不存在bcp72内的对应的iolist75)。iolist75内的缓冲74以使得具有文件60内的较低逻辑地址的缓冲比具有文件60内的较高逻辑地址的缓冲74更早地被存储在iolist75中的顺序来布置。然而,缓冲74可以不总是表示文件60的连续块,如果存在当前未被缓存以被重写的文件60的块的话。

bcp72还可以包括先前被缓存在先前缓存的列表73上的缓冲74。先前缓存的列表70可以包括先前在iolist75上的但是自此已经被冲刷到盘的缓冲74以及先前出于读取缓存目的而加载的缓冲74。bcp72还可以包括空余列表78上的一个或多个未分配缓冲74(其可以是空的或者仅仅存储无效数据)。尽管iolists75、先前缓存的列表73以及空余列表78被描绘为单向链表,但是它们可以是任何种类的链表,包括双向链表。bcp72还可以存储被缓存的并且也将最终被冲刷的脏元数据77。

存储器40还包括当前未出于任何目的而被分配的空余存储器79。

文件系统管理器50可以接收指引其将数据的集合写入到其管理的文件系统58的文件60内的地址范围的写入请求48。如本文中所描述的,写入请求48的数据是块对准的并且是连续的,意味着其在定义文件的特定块62、64的开始的地址处开始并且其包含为固定块大小(例如,8kb)的倍数的数据量。因此,例如,写入请求可以包括被寻址到文件60内的块地址n到n+7的64kb的数据。在操作中,文件系统管理器50可以首先循环通过写入请求48的每个块大小的数据量并且将该数据存储在bcp内的缓冲74中,将每个新分配的缓冲74附加到bcp72的临时iolist76。每个写入请求48具有它自己的相应的临时iolist76,并且临时iolist75的缓冲74以连续的顺序来存储。因此,对于针对文件60(x)内的块地址n到n+7的写入请求,临时iolist76的第一缓冲表示要被写入到文件60(x)的块地址n的数据,临时iolist76的第二缓冲表示要被写入到文件60(x)的块地址n+1的数据,等等。临时iolist76可以被配置为数组或链表,其可以是单链的或双链的。

如果写入请求48的地址范围包括文件60(x)的共享块62,则文件系统管理器50使cofw保留80增加,使得当数据稍后被冲刷时,存储在该共享块62内的数据能够最终被复制到要被保留的cofw读取缓冲70(被描绘为cofw读取缓冲70(1)、70(2)、……、70(r))中(但是,如果共享块62已经被缓存在先前缓存的列表73的缓冲74内,则cofw保留80可以不被增加,因为数据已经被缓存并且无需再次将其存储在cofw读取缓冲70中)。

一旦写入请求48的数据已经被完全插入到相应的临时iolist76中,文件系统管理器50就获得文件60(x)上的每文件锁66(x),其临时防止其他写入请求修改文件60(x)。取决于实施例,每文件锁66可以是如两者都是本领域中公知的互斥锁或自旋锁。一旦获得了每文件锁66(x),文件系统管理器50就可以将临时iolist76的缓冲74插入到针对该文件60(x)的相应的iolist75(x)的合适的位置中,丢弃先前在iolist75上的任何缓冲74,其被来自临时iolist76的新缓冲74替换。一旦完成了这个,如果iolist75(x)不是非常长(即,不长于阈值长度,例如,不长于2048个缓冲74),则文件系统管理器50就可以返回每文件锁66(x)并且通过将写入确认信号86发送回到发出写入请求48的主机来完成写入请求48。

然而,如果iolist75(x)非常长(即,长于阈值长度,例如,长于2048个缓冲74),则文件系统管理器50将首先在释放每文件锁66(x)并且发出确认信号86之前启动iolist75(x)上的冲刷操作。文件系统管理器50包括节流模块70,,其被配置为执行节流以改进文件系统58上的写入性能。因此,一旦iolist75(x)被确定为高于阈值长度,节流模块70就运行以确定是否需要节流。

节流模块70确定净空余存储器量81是否小于总存储器40的存储器压力阈值百分数82。如果不是,则dss计算设备32当前没有经历高存储器压力,并且文件系统管理器50可以立即将异步冲刷线程68(被描绘为异步冲刷线程68(1)、68(2)、……、68(n))配置为对iolist75(x)进行异步冲刷。这些线程68为异步的事实意味着它们可以被启动并且运行而不要求在发出者前进之前完成。因此,一旦文件系统管理器50启动异步冲刷线程68来对iolist75(x)进行异步冲刷,文件系统管理器50就可以在之后返回每文件锁66(x)并且通过将写入确认信号86发送回到发出写入请求48的主机来完成写入请求48。存储器压力阈值百分数82可以是任何百分数,但是,在一些实施例中,其处于40%-50%的范围内,例如45%。

然而,如果节流模块70确定净空余存储器量81小于总存储器40的存储器压力阈值百分数82(但是大于临界压力阈值百分数83),则节流模块70将在前进以将异步冲刷线程68(y)配置为对iolist75(x)进行异步冲刷之前首先等待当前运行的异步冲刷线程68(y)变得空闲。一旦文件系统管理器50启动异步冲刷线程68(y)来对iolist75(x)进行异步冲刷,文件系统管理器50就可以在之后返回每文件锁66(x)并且通过将写入确认信号86发送回到发出写入请求48的主机来完成写入请求48。

在一些实施例中,如果节流模块70确定净空余存储器量81小于临界压力阈值百分数83,则节流模块70将代替地通过在返回每文件锁66(x)并且通过将写入确认信号86发送回到发出写入请求48的主机之前对iolist75(x)进行完全冲刷(或在一些实施例中,至少对iolist75(x)的一部分进行冲刷)来执行同步冲刷。临界压力阈值百分数83可以是任何百分数,但是,在一些实施例中,其处于15%-25%的范围内,例如为20%。

在一些实施例中,简单地通过查看空余列表78的大小来计算净空余存储器量81。之后可以将净空余存储器量81与bcp72的大小或存储器40的总大小(或被分配给文件系统管理器50的存储器40的量)进行比较。

在利用用于处理cofw的改进的技术的实施例中,净空余存储器可以代替地根据涉及cofw保留大小80的更复杂的技术来计算。下面结合图3可见。

在一些实施例中,存储器40还可以包括持久性存储部分(未描绘)。存储器40的持久性存储部分可以由一个或多个持久性存储设备(例如盘)构成。存储器40的持久性存储部分或持久性存储44被配置为甚至当dss计算设备32被断电时存储程序和数据。os、应用程序和存储驱动器堆栈46通常被存储在存储器40的该持久性存储部分中或持久性存储44上,使得它们可以在系统重启时或在需要时从存储器40的该持久性存储部分或持久性存储44被加载到存储器40的系统部分中。存储驱动器堆栈46或其各种软件部件,例如文件系统管理器50、lun管理器52或节流管理器70当以非暂态形式存储在存储器40的易失性部分中或者持久性存储驱动器44上或者存储器40的持久性部分中时形成计算机程序产品。运行一个或多个应用程序和/或存储驱动器堆栈46和/或其部件中的一个的处理电路36因此形成被构造并被布置为执行本文中描述的各种过程的专用电路。

图2图示了根据各种实施例的由存储驱动器堆栈46(并且更具体地,由文件系统管理器50)执行的用于有效地摄取数据的示例方法100。应当理解,无论何时软件(例如,存储驱动器堆栈46、文件系统管理器50、节流模块70、lun管理器52、等等)被描述为执行一种方法、过程、步骤或功能,实际上这意味着其上运行了该软件的计算设备(例如,dss计算设备32)当在其处理电路36上运行该软件时执行该方法、过程、步骤或功能。应当理解,方法100的步骤或子步骤中的一个或多个可以在一些实施例中被省略。类似地,在一些实施例中,一个或多个步骤或子步骤可以被组合在一起或以不同的顺序来执行。方法100由dss计算设备32来执行。

在步骤110中,文件系统管理器50接收指示其将块对准的数据的集合写入到文件60(x)的连续区域的写入请求48。该写入请求48被寻址到文件60(x)的连续块的集合(例如,针对具有z+1的块长度的数据的集合的逻辑块地址n到n+z)。

在步骤115中,如果针对该文件60(x)的iolist75(x)(也被称为“脏列表”)已经达到(或超过,取决于实现方式)最大阈值长度(例如,2048个缓冲74之长),则文件系统管理器50可以临时暂停写入请求。通常,这将仅仅在针对相同文件60(x)的另一写入请求48已经待决并且其他写入请求48已经将新缓冲74添加到针对该文件60(x)的iolist75(x)超过阈值最大长度时发生。通常,该暂停将继续直到被配置为冲刷iolist75(x)的异步冲刷线程68(y)已经完成或者至少直到其已经将iolist75(x)的长度减小到阈值最大值(取决于实施例)以下。在其中节流模块70执行同步冲刷的罕见实例中,暂停将继续直到同步冲刷操作已经完成。

之后,在步骤120中,文件系统管理器50将写入请求48的块对准的数据复制到针对该文件60(x)的iolist75(x)内的缓冲74中。应当指出,存在可以实现步骤120的各种方式。在一个实施例中,文件系统管理器50可以获得针对该文件的每文件锁66(x),并且之后将所有数据添加到iolist75(x)中。在其他改进的实施例中,步骤120可以代替地如下面结合图4所描述的而被实现。无论如何,步骤120涉及获得文件75(x)上的直到稍后被释放的每文件锁66(x)(下面结合步骤170可见)。

之后,在步骤130中,文件系统管理器50确定iolist75(x)是否超过阈值长度(例如,2048个缓冲74)。如果其没有超过,则操作直接以步骤170前进,其中每文件锁66(x)被释放并且写入确认信号86被返回到发出写入请求48的主机。然而,如果iolist75(x)未超过阈值长度,则操作代替地以步骤170前进。

在步骤140中,文件系统管理器50的节流模块70确定当前是否存在关于净空余存储器81和存储器压力阈值百分数82的高存储器压力。存在可以实现步骤140的各种方式。在一些改进的实施例中,步骤140可以如下面结合图3所描述的而被实现。如果存储器压力被确定为不高,则操作直接以步骤160前进,但是,如果存储器压力被确定为高(但是不是非常高;下面结合图3的步骤240可见),则操作以在步骤160之前的步骤150前进。

在步骤150中,节流模块70等待直到当前运行的异步冲刷线程68的集合中的至少一个当前运行的异步冲刷线程68(y)变得空闲(只要存在至少一个当前运行的异步冲刷线程68,如果没有,则跳过步骤150)。异步冲刷线程68当其已经完成了对iolist75的冲刷时变得空闲,异步冲刷线程68在先前正在冲刷iolist75。操作前进到步骤160。

在步骤160中,节流模块70将可用异步冲刷线程68(例如,在步骤150中刚刚变得空闲的异步冲刷线程68(y),或者,在跳过步骤150的情况下,新分配的异步冲刷线程68(y)或某个先前空闲的异步冲刷线程68(y))配置为开始将来自针对当前文件60(x)的iolist75(x)的缓冲74沿着存储驱动器堆栈46向下异步地冲刷(例如,到lun管理器52,使得表示缓冲74的块能够被插入到ldfs和lun54内的正确位置中,数据最终被存储在持久性存储44内)。在该冲刷过程期间,因为到先前共享的数据块62的写入被冲刷,所以那些共享数据块62的数据可以被复制到相应的cofw读取缓冲70(除非数据已经被存储在先前缓存的列表73的缓冲74内),使得该数据能够最终也被冲刷到快照56。一旦已经启动了异步冲刷线程68(y),操作就可以直接以步骤170前进。因为dss计算设备32具有多个核37,所以包括若干异步冲刷线程68的若干线程可以与实现文件系统管理器50的其他线程并行运行。

最后,在步骤170中,文件系统管理器50释放每文件锁66(x)并将写入确认信号86发送回到发出写入请求48的主机。

图3图示了实现由节流模块70执行的步骤140的示例方式。应当理解,图3中描绘的步骤或子步骤中的一个或多个可以在一些实施例中被省略。类似地,在一些实施例中,一个或多个步骤或子步骤可以被组合在一起或以不同的顺序来执行。

在步骤210中,节流模块70首先计算净空余存储器81。在一些实施例中,这可以通过执行子步骤212-216来完成。

在子步骤212中,节流模块70通过将bcp72的空余列表78上的缓冲74的大小与空余(未分配)存储器79的大小加和在一起来计算空余存储器的总量。

在子步骤214中,节流模块70通过将当前分配的所有cofw读取缓冲70的大小(例如,通过将cofw读取缓冲70的数量r乘以块大小,例如8kb)从cofw保留大小减去来计算净保留。cofw保留大小可以通过将块大小(例如8kb)乘以cofw保留80来计算。cofw保留80表示如下共享块62的总数量,共享块62已经被写入请求48修改但是到那些共享数据块62的写入尚未被冲刷。然而,已经被存储在先前缓存的列表73的缓冲74中的任何共享块62可以从cofw保留80排除(上面结合第0029段并且下面结合图4的子步骤314-316的描述可见)。

最后,在子步骤216中,节流模块70通过将(上面在子步骤214中计算的)净保留从(上面在子步骤212中计算的)空余存储器的总量减去来计算净空余存储器81。应当理解,尽管被描绘为三个连续的步骤212、214、216,但是如在这些步骤212、214、216中描述的相同功能可以通过在一个复杂的运算中或者以不同的顺序执行这些步骤中的全部来实现。

一旦已经计算了净空余存储器81,在步骤220中,节流模块70确定净空余存储器81(被表示为存储器40的总量或者存储器40可用于文件系统管理器50的部分的百分数)是否超过存储器压力阈值百分数82。如果是,则操作以步骤230前进,其返回到方法100的步骤160。否则,操作以步骤240前进。

在步骤240中,节流模块70确定净空余存储器81(再次被表示为百分数)是否超过临界存储器压力阈值83。如果是,则操作以步骤250前进,其返回到方法100的步骤150。否则,操作以步骤260前进。

在步骤260中,节流模块70对针对当前文件60(x)的iolist75(x)进行同步冲刷。仅仅当同步冲刷操作完成时,操作才前进到步骤270,其返回到方法100的步骤170。

图4图示了实现由文件系统管理器50执行的步骤120的示例方式。应当理解,图4中描绘的步骤或子步骤中的一个或多个可以在一些实施例中被省略。类似地,在一些实施例中,一个或多个步骤或子步骤可以被组合在一起或以不同的顺序来执行。

在步骤310中,文件系统管理器50按顺序迭代通过写入请求48的数据的每个块,以便执行针对每个块的各个子步骤312-330。应当理解,在一些实施例中,子步骤312-316可以被省略(例如,如果dss计算设备32根本没有被配置为实现快照56或者如果已知未对当前文件60(x)进行检查点操作到任何快照56中)。

首先,在子步骤312中,文件系统管理器50检查在文件60(x)内被针对的块62、64是否与(例如,快照56中的)检查点文件60’(x)共享。在一些实施例中,子步骤312还肯定地评估在文件60(x)内被针对的块62、64是否由于重复删除而与任何其他块共享。实际上,子步骤312肯定地评估在文件60(x)内被针对的块62、64是共享块62还是非共享块64(或者文件60(x)的根本尚未被分配的块)。如果子步骤312肯定地评估,则操作以子步骤314前进。否则,操作直接以子步骤320前进。

在子步骤314中,文件系统管理器50检查共享块62的数据先前是否已经被复制到保留在先前缓存的列表73上的缓冲74。如果是,则操作以子步骤320前进,因为当先前共享数据已经被缓存时无需为先前共享数据保留cofw读取缓冲70。否则,操作首先以子步骤316前进。

在子步骤316中,文件系统管理器50使cofw保留80增加。这确保当到共享块62的写入被冲刷时,在存储器中存在足够的空间来分配cofw读取缓冲70以存储来自先前共享块62的数据。该cofw读取缓冲70之后被配置为保持先前共享数据的副本直到先前共享数据能够被冲刷到快照56。

在子步骤320中,文件系统管理器50将来自写入请求48的合适的数据(即,被针对以被写入到讨论中的文件60(x)的块62、64的数据)复制到bcp72的缓冲74中。之后,在子步骤330中,文件系统管理器50将在步骤320中创建的缓冲74附加到特定于当前写入请求48的临时iolist76的尾部。如果尚未创建临时iolist76(即,其当前是被迭代通过的写入请求48的第一数据块),则文件系统管理器50创建新临时iolist76。

在循环通过写入请求48的所有块之后,在步骤340中,文件系统管理器50保留文件系统内的空间以供新块被写入并且更新文件60(x)的元数据(例如,索引节点和/或一个或多个间接块)。这种更新可以包括更新索引节点和/或一个或多个间接块内的块指针和更新索引节点内的文件大小信息。该步骤340可以在文件特定锁(例如,互斥锁或自旋锁)的保护下来执行,但是其通常是与在步骤350中使用的文件特定锁66(x)不同的文件特定锁。

之后,在步骤350中,文件系统管理器50使用文件特定锁66(x)来锁定文件60(x)。在一些实施例中,文件特定锁66(x)是互斥锁。在其他实施例中,代替地使用自旋锁,由此通过避免线程之间的上下文切换来提高性能。如果文件特定锁66(x)已经被发出到文件系统管理器50的另一线程(例如,已经处理另一写入请求48的线程),则操作在步骤360处停止。如果文件特定锁66(x)是自旋锁,则文件系统管理器50的处理当前写入请求48的线程将继续等待而不进行线程切换直到自旋锁可用,但是因为由自旋锁保护的步骤是快速的(步骤360-380和130-170,但是,重要的是,不包括步骤310,其可能花费很长时间),所以对自旋锁的使用是高效的。然而,应当指出,在使用自旋锁的实施例中,可以在步骤150中释放自旋锁,但是在步骤160中重新获取自旋锁。另外,在使用自旋锁的实施例中,可以在步骤260的开始释放自旋锁,但是在步骤260的结束重新获取自旋锁。如果文件特定锁66(x)是互斥锁,则文件系统管理器50的处理当前写入请求48的线程将暂停,允许其他线程取代它直到互斥锁可用。

一旦已经获得了文件特定锁66(x),在步骤360中,文件系统管理器50就定位写入请求48指向的文件60(x)的块62、64在针对文件60(x)的iolist75(x)中的位置。因此,例如,如果写入请求48指向文件60(x)的块4,918-4,937并且iolist75(x)包括针对块4,912的缓冲74跟随有针对块4,993的另一缓冲74,则文件系统管理器50定位iolist75(x)中的紧跟着针对块4,912的缓冲74的位置。

作为另一示例,如果写入请求48指向文件60(x)的块3,247-3,263并且iolist75(x)包括针对块3,240的缓冲74跟随有针对块3,250的第二缓冲74、针对块3,251的第三缓冲74和针对块3,270的第四缓冲74,则文件系统管理器50定位iolist75(x)中的第二缓冲的位置。文件系统管理器50还保持第二缓冲74和第三缓冲74两者可以被替换并被丢弃的记录,因为它们由当前写入请求48重写。

之后,在步骤370中,文件系统管理器50将临时iolist的缓冲74插入到iolist75(x)中的在步骤360中确定的位置处,替换被记录为遭受替换的任何缓冲74。

最后,在步骤380中,文件系统管理器50解除分配被记录为遭受替换的任何缓冲74(即,通过将它们放置在空余列表78上)。方法100的操作可以之后在步骤130处恢复。应当指出,在步骤350中获得的文件特定锁66(x)将最终在步骤170中被释放。

因此,已经呈现了用于允许数据存储系统32能够当写入带宽高时将数据冲刷到底层存储44同时最小地影响最大延迟的技术。这可以通过利用异步冲刷并且通过当可用缓存空间的量太小时通过防止太多异步冲刷发生而对传入写入请求48进行节流来完成。还可以进行进一步的改进。因此,例如,一种采用首次写时复制(cofw)的改进的系统可以仅仅在可用写入缓存的量下降到动态计算的阈值82以下时才启动写入节流,该动态计算的阈值说明存储cofw缓冲70实际需要的空间量。作为另一示例,仅仅写入缓存过程的一部分在互斥锁或自旋锁66的保护下被放置,允许针对任何给定写入请求48的写入缓存的很大一部分在不需要互斥锁或自旋锁66的情况下被执行,允许一定增加的并行化。

如本文档中所使用的,词语“包括(comprising)”、“包含(including)”、“含有(containing)”和“具有(having)”旨在以开放式方式阐述事物的某些项、步骤、元件或方面。此外,如本文中所使用的并且除非给出相反的特定陈述,词语“集合”意指事物中的一个或多个。无论短语“的集合”是否跟随单数对象或复数对象,并且无论其是否连接有单数动词或复数动词,都是如此。另外,尽管诸如“第一”、“第二”、“第三”、等等的顺序表达可以在本文中被用作形容词,但是,这样的顺序表达被用于标识目的,除非专门指示,不旨在暗喻任何排序或顺序。因此,例如,“第二”事件可以在“第一事件”之前或之后发生,或者甚至第一事件根本不曾发生。另外,本文中对特定元件、特征、或动作作为“第一”这种元件、特征或动作的标识不应当被理解为要求也必须存在“第二”或其他这种元件、特征或动作。相反,“第一”项可以为唯一的。尽管本文中公开了某些实施例,但是应理解,这些实施例仅仅通过示例的方式示出,并且本发明不限于这些特定实施例。

尽管已经具体地示出和描述了各种实施例,但是本领域技术人员将理解,可以在不脱离随附权利要求书的精神和范围的情况下在其中进行形式和细节上的各种变化。

例如,尽管各种实施例已经被描述为方法,但是也包括实现这些方法的软件。因此,一个实施例包括一种编程有指令的有形非暂态计算机可读存储介质(例如,硬盘、软盘、光盘、闪存、等等),这些指令当由计算机或计算机的集合执行时,使各种实施例中描述的方法中的一个或多个得以执行。另一实施例包括一种计算机,该计算机被编程为执行各种实施例中描述的方法中的一个或多个。

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