系统能向永久存储器写入数据和从永久存储器读取数据的速度通常是该系统整体性能中的一个关键因素。向永久存储器或者从永久存储器传送数据的传统方法要求通过客户端系统和永久存储器系统上的软件、固件和硬件的多个层进行处理。此外,当数据在这些层之间移动时,数据一般会被复制。于是,除了在对底层的物理存储介质进行读取或者写入所需要的延迟之外,还产生额外的延迟,该额外的延迟降低了系统的整体性能。
具体实施方式
本发明的具体实施例现在将被结合附图详细描述。在下述的对于本发明的实施例的详细描述中,许多具体细节被阐述以提供对于本发明的透彻的理解。然而,对于本领域的普通技术人员来说,很明显本发明可以以不具备这些具体细节的方式被实现。在其他的示例中,公知的特征没有被具体描述,以避免这些描述被不必要的复杂化。
在下述对于附图1A-7C的描述中,结合一附图所描述的任何组件,在本发明的不同的实施例中,可以等效于结合任何其他附图而描述的一个或多个被相似命名(like-named)的组件。为了使得描述简洁,将不会结合每一个附图而重复对于这些部件的描述。因此,在每一个附图中这些部件的每一个(each)和每一个实施例(everyembodiment)将被以参照的方式引入并被假设以任意展现在具有一个或多个类似命名的部件的每一个其他附图中。此外,按照本发明的不同的实施例,一个附图中对于这些部件的任何描述将被解释为一个可实现的可选实施例,以附加于、结合于、或者代替结合任何其他附图中对于一个对应的类似命名的部件而描述的实施例。
总体而言,本发明的实施例涉及存储系统。更具体地说,本发明的实施例涉及包括一个或多个存储装置的存储系统,每一个存储装置被配置成允许客户端使用客户端存储器和物理存储器模块的存储器之间的单个直接存储器存取(DMA)来将数据从客户端传送至存储装置,同时保持存储装置能够控制物理存储器布局(physicalstoragelayout)并向其客户端展示抽象的逻辑布局的能力。该架构被称为零副本(Zero-Copy)DMA,其中除了用于每一个读取或者写入的唯一DMA以外,该架构中产生数据的零副本。具体而言,在本发明的一个或多个实施例中,存储装置包括存储模块,且客户端能够使用零副本DMA直接传送数据至存储模块。此外,在本发明的一个或多个实施例中,存储装置包括使用零副本DMA直接将数据从存储模块传送到客户端存储器的功能。
图1A-1E揭示了根据本发明的一个或多个实施例的多个系统。参考图1A,该系统包括可操作地连接至存储装置(102)的一个或多个客户端(客户A(100A)、客户端M(100M))。
在本发明的一个实施例中,客户端(100A、100M)对应于包括向存储装置(102)发布读取请求和/或向存储装置(102)发布写入请求的功能的任何系统。尽管在图1A中没有示出,客户端(100A、100M)中的每一个可包括客户端处理器和客户端存储器。关于客户端中的组件的额外细节将在下面的图1D中描述。在本发明的一个实施例中,客户端(100A、100M)被配置成使用下述协议中的一个或者多个来与存储装置(102)通信:外围组件互联(PCI)、快速PCI(PCI-Express,PCIe)、扩展PCI(PCI-eXtended,PCI-X)、快速非易失性存储(NVMe)、基于快速PCI架构(fabric)的快速非易失性存储、基于以太网架构的快速非易失性存储以及基于无限带宽架构(infinibandfabric)的快速非易失性存储。本领域的技术人员将意识到本发明并不局限于前述的协议。
在本发明的一个或多个实施例中,如果客户端执行PCI、快速PCI或者NVMe,则该客户端包括根组件(rootcomplex)(根组件未示出)。在本发明的一个实施例中,根组件是将客户端处理器和客户端存储器连接至PCIe架构的设备。在本发明的一个实施例中,根组件被集成到客户端处理器中。
在本发明的一个实施例中,PCIe架构包括经由交换机(例如图1D中的客户端交换机(116)和例如图2A中的交换机架构(206)的交换机架构内的交换机)连接的根组件和端点(endpoint)。在本发明的一个实施例中,端点是除了根组件或者交换机以外的设备,该设备能发起PCI交换(例如,读取请求、写入请求)或者作为PCI交换的目标。
在本发明的一实施例中,单个的客户端和单个的存储装置可被认为是单个的PCIe架构的一部分。在本发明的另一个实施例中,一个或者多个客户端和一个或者多个存储装置的任意组合可被认为是单个PCIe架构的一部分。此外,如果存储装置中的个别组件使用PCIe通信,并且客户端中的个别组件(参考图1D)使用PCIe通信,那么存储装置和客户端中的所有组件都可被认为是单个PCIe架构的一部分。本领域的技术人员将意识到本发明的不同实施例可使用其他类型的架构实现而不脱离本发明的范围。
继续参考图1A,在本发明的一个实施例中,存储装置(102)是包括易失存储器和永久存储器的系统,并且该系统被配置成服务来自一个或多个客户端(100A、100M)的读取请求和/或写入请求。存储装置(102)的不同实施例以下在图2A-2D中被描述。
参考图1B,图1B示出了一系统,其中客户端(100A、100M)连接至多个存储装置(104A、104B、104C、104D),该多个存储装置被布置成网格组态(meshconfiguration)(在图1B中被标记为存储装置网格(104))。如图1B所示,存储装置网格(104)被示为全连接(fullconnected)网格组态,也就是说,存储装置网格(104)中的每一个存储装置(104A、104B、104C、104D)与存储装置网格(104)中每一个其他存储装置(104A、104B、104C、104D)直接连接。在本发明的一个实施例中,每一个客户端(100A、100M)可直接连接至存储装置网格(104)中的一个或多个存储装置(104A、104B、104C、104D)。本领域的技术人员将意识到存储装置网格可使用其他网格组态(例如,部分连接网格)实现而不脱离本发明的范围。
参考图1C,图1C示出了一个系统,其中客户端(100A、100M)连接至多个存储装置(104A、104B、104C、104D),该多个存储装置被安排成扇出组态(fan-outconfiguration)。在该组态中,每一个客户端(100A、100M)连接至一个或多个存储装置(104A、104B、104C、104D);然而,各个存储装置(104A、104B、104C、104D)之间并不互相通信。
参考图1D,图1D示出了根据本发明的一个或多个实施例的客户端。如图1D所示,客户端(110)包括客户端处理器(112)、客户端存储器(114)和客户端交换机(116)。这些组件中的每一个在下面进行描述。
在本发明的一个实施例中,客户端处理器(112)是被配置成执行指令的具有单个核心或者多个核心的一组电子电路。在本发明的一个实施例中,客户端处理器(112)可使用复杂指令集(CISC)体系结构或精简指令集(RISC)体系结构实现。在本发明的一个或多个实施例中,客户端处理器(112)包括(由PCIe协议定义的)根组件(未示出)。在本发明的一个实施例中,如果客户端(110)包括根组件(根组件可被集成至客户端处理器(112)),则客户端存储器(114)经由根组件连接至客户端处理器(112)。或者,客户端存储器(114)使用其他点对点连接机制直接连接至客户端处理器(112)。在本发明的一个实施例中,客户端存储器(114)对应于任何易失存储器,包括但不限于,动态随机存取存储器(DRAM)、同步动态随机存取存储器(SDRAM)、单数据速率同步动态随机存取存储器(SDRSDRAM)、双倍数据速率同步动态随机存取存储器(DDRSDRAM)。
在本发明的一个实施例中,客户端存储器(114)包括下述的一个或者多个:用于客户端处理器的提交队列和用于客户端处理器的完成队列。在本发明的一个实施例中,存储装置存储器包括一个或多个用于客户端处理器的提交队列,这些提交队列对于客户端是通过架构(fabric)可见的,而客户端存储器包括一个或多个用于客户端处理器的完成队列,这些完成队列对于存储装置是通过架构可见的。在本发明的一个实施例中,用于客户端处理器的提交队列被用于向客户端处理器发送命令(例如,读取请求、发送请求)。在本发明的一个实施例中,用于客户端处理器的完成队列被用于发信号通知(signal)客户端处理器由客户端处理器发布给另一个实体的命令已经被完成。本发明的实施例可使用其他通知机制(notificationmechanism)实现而不脱离本发明的范围。
在本发明的一个实施例中,客户端交换机(116)仅仅包括一个单个的交换机。在本发明的另一个实施例中,客户端交换机(116)包括数个互联的交换机。如果客户端交换机(116)包括数个交换机,那么每一个交换机可以与每一个其他交换机连接,可以与交换机架构的交换机子集连接,或者仅仅连接至一个其他的交换机。在本发明的一个实施例中,客户端交换机(116)中的每一个交换机是硬件和逻辑的组合(比如可以使用集成电路来实现),(如由(多个)协议所定义的,交换机架构执行)该组合被配置成允许数据和消息在客户端(110)和存储装置(未示出)之间传送。
在本发明的一个实施例中,当客户端(100A、100M)执行一个或多个下述协议:PCI、PCIe或者PCI-X时,客户端交换机(116)是PCI交换机。
在这些实施例中,客户端交换机(116)包括数个端口,每一个端口可被配置成透明桥或非透明桥。实现为透明桥的端口允许根组件继续发现(直接或者间接)连接至该端口的设备(可以是其他根组件、交换机、PCI桥或者端点)。相比之下,当根组件遇到被实现为非透明桥的端口时,根组件不能继续发现连接至该端口的设备,进而,根组件将这种端口作为端点处理。
当端口被实现为非透明桥时,位于非透明桥任意一侧的设备可仅使用电子邮箱系统和(由客户端交换机实现的)门铃中断(doorbellinterrupt)进行通信。门铃中断允许位于非透明桥一侧的处理器向位于非透明桥另一侧的处理器发布中断。此外,电子邮箱系统包括一个或多个可供交换机架构任一侧的处理器读或者写的寄存器。前述的寄存器使得位于客户端交换机任一侧的处理器能跨越非透明桥而传送控制和状态信息。
在本发明的一实施例中,为了从非透明桥一侧的一个设备发送PCI交换(transaction)至非透明桥另一侧的一个设备,PCI交换必须被寻址至实现该非透明桥的端口。在接收到PCI交换之后,客户端交换机执行地址翻译(使用直接地址翻译机制或者基于查找表的翻译机制)。获得的地址接下来被用于将分组路由至非透明桥另一侧的合适的设备。
在本发明的一个实施例中,客户端交换机(116)被配置以使得客户端存储器(114)的至少一部分能够由存储装置直接存取。换句话说,在客户端交换机一侧的存储装置可经由客户端交换机直接存取客户端交换机另一侧的客户端存储器。
在本发明的一个实施例中,客户端交换机(116)包括DMA引擎(118)。在本发明的一个实施例中,DMA引擎(118)可由连接至客户端交换机的客户端处理器或者存储装置编程。如上面所讨论的,客户端交换机(116)被配置以使得客户端存储器(114)的至少一部分能够由存储装置或者存储模块直接存取。因此,DMA引擎(118)可被编程以从客户端存储器中能够由存储装置存取的那部分中的地址读取数据,以及直接将上述数据的副本写入存储装置或者存储模块的存储器中。此外,DMA引擎(118)可被编程以从存储装置中读取数据并将上述数据的副本直接写入客户端存储器中能够由存储装置存取的那部分中的地址。
在本发明的一实施例中,DMA引擎(118)支持组播。在这些实施例中,存储装置中的处理器(参考图2A)可创建组播组,其中组播组中的每一个成员对应存储装置的存储器中的唯一目的地地址。组播组中的每一个成员与一个描述符相关联,该描述符指定:(i)目的地地址;(ii)源地址;(iii)传送尺寸字段;以及(iv)控制字段。用于每一个描述符的源地址保持不变,而用于每一个描述符的目的地地址是变化的。一旦创建组播组,任何通过交换机且以组播组地址为目标的数据传送,包括由DMA引擎发起的传送,将数据的一致副本置于所有与组播组相关联的目的地端口。在本发明的一个实施例中,交换机并行处理所有的组播组描述符。
继续讨论图1D,本领域的技术人员将会意识到虽然图1D示出了位于客户端(110)内的客户端交换机(116),客户端交换机(116)可位于该客户端之外,这并不脱离本发明的范围。此外,本领域的技术人员将会意识到DMA引擎(118)可位于客户端交换机(116)之外,这也不脱离本发明的范围。
参考图1E,图1E示出了一个系统,其中客户端(100A、100M)经由客户端交换机(108)连接到数个被布置成网格组态(在图1E中被标记为存储装置网格(104))的存储装置(104A、104B、104C、104D)。在图1E所示的实施例中,每一个客户端(100A、100M)并不包括其自己的客户端交换机,相反,所有的客户端共享一个客户端交换机(108)。如图1E所示,存储装置网格(104)被示为全连接网格组态,也就是说,存储装置网格(104)中的每一个存储装置(104A、104B、104C、104D)直接连接至存储装置网格(104)中的每一个其他存储装置(104A、104B、104C、104D)。在本发明的一个实施例中,客户端交换机(108)可直接连接至存储装置网格(104)中的一个或多个存储装置(104A、104B、104C、104D)。本领域的技术人员将会意识到存储装置网格可以采用其他网格组态(例如,部分连接组态)实现而不脱离本发明的范围。
尽管在图1E中没有示出,每一个客户端可包括其自己的客户端交换机(如在图1D中示出的),但客户端交换机可使用交换机架构(下面会定义)而连接至存储装置网格(104)。
本领域的技术人员将会意识到虽然图1A-1E所示的存储装置连接至有限数量的客户端,存储装置可以连接至任意数量的客户端而并不脱离本发明的范围。本领域的技术人员将会意识到图1A-1E示出了不同的系统组态,本发明并不被局限于前述的系统组态中。此外,本领域的技术人员将会意识到客户端(不考虑系统的组态)可使用交换机架构(没有示出)被连接至存储装置(下面会进行描述)而不脱离本发明的范围。
图2A-2D示出了根据本发明的一个或多个实施例的多个存储装置的实施例。参考图2A,存储装置包括控制模块(200)和存储模块组(202)。这些组件中的每一个将在下面被描述。总体而言,控制模块(200)被配置成管理来自一个或多个客户端的读取和写入请求的服务。具体而言,控制模块被配置成通过IOM(下面会讨论)从一个或多个客户端接收请求,处理该请求(可包括将该请求发送至存储模块),并在请求被服务后向客户端提供响应。关于控制模块中的组件的其他细节包括在下面的描述中。此外,控制模块关于读取和写入请求的服务的操作将在下面结合附图4A-7C进行描述。
继续对于图2A的讨论,在本发明的一个实施例中,控制模块(200)包括输入/输出模块(IOM)(204)、交换机架构(206)、处理器(208)、存储器(210)以及,可选的,现场可编程门阵列(FPGA)(212)。在本发明的一个实施例中,IOM(204)是客户端(图1A-1E中的100A、100M)和存储装置中的其他组件之间的物理接口(physicalinterface)。IOM支持一个或者多个下述协议:PCI、PCIe、PCI-X、以太网(包括但不限于,由IEEE802.3a-802.3bj所定义的各种标准)、无限带宽(Infiniband)、融合以太网上的远程直接存储器存取(RDMA)(RoCE)。本领域的技术人员将会意识到IOM可以使用上述所列的协议之外的协议实现而不脱离本发明的范围。
继续对于图2A的讨论,交换机架构(206)仅包括单个的交换机。在本发明的另一个实施例中,交换机架构(206)包括数个互联的交换机。如果交换机架构(206)包括多个交换机,那么每一个交换机可以连接至每一个其他交换机,可以连接至交换机架构的交换机子集,或者可以仅仅连接至交换机架构中的另一个交换机。在本发明的一个实施例中,交换机架构(206)中的每一个交换机是硬件和逻辑的组合(比如可以使用集成电路来实现),(如由(多个)协议所定义的,交换机架构执行)该组合被配置成将存储装置中的各个组件连接在一起并在各个连接的组件之间(使用该逻辑)路由分组。在本发明的一个实施例中,交换机架构(206)是物理连接至IOM(204)、处理器(208)、存储模块组(202)以及,如果存在的话,FPGA(212)。在本发明的一个实施例中,控制模块(200)中的所有组件间(inter-component)通信(除了处理器(208)和存储器(210)之间的通信)都通过交换机架构(206)。此外,控制模块(200)和存储模块组(202)之间的所有通信都通过交换机架构(206)。在本发明的一个实施例中,交换机架构(206)是使用PCI协议(例如,PCI、PCIe、PCI-X或者另一个PCI协议)实现。在这些实施例中,所有通过交换机架构(206)的通信使用所对应的PCI协议。
在本发明的一个实施例中,如果交换机架构实现PCI协议,则交换机架构(206)包括用于处理器的端口(或者,更具体地说,用于集成在处理器(208)中的根组件或者用于连接至处理器的根组件的端口)、一个或多个用于存储模块组(202)中的存储模块(214A、214N)(参考图3)的端口、用于FPGA(212)(如果存在的话)的端口以及用于IOM(204)的端口。在本发明的一个或多个实施例中,每一个上述的端口可被配置为透明桥或者非透明桥(如上面讨论的)。本领域的技术人员将会意识到虽然交换机架构(206)是关于PCI实现而描述,交换机架构(206)可以使用其他协议实现而不脱离本发明的范围。
在本发明的一个实施例中,交换机架构(206)中的至少一个交换机被配置为实现组播。更具体地说,在本发明的一个实施例中,处理器(208)被配置为产生组播组,其中组播组包括两个或多个成员,每一个成员指定存储器(210)和/或存储模块(214A、214N)中的地址。当组播组被创建时,组播组与一组播地址相关。为了实现组播,交换机架构中的至少一个交换机被配置成:当接收到指定组播地址作为目的地地址的写入时,交换机被配置成为组播组中的每一个成员产生新的写入,并将这些写入发布至存储装置中适当的地址。在本发明的一个实施例中,用于由交换机产生的每一个写入的地址是通过在组播地址上增加特定的偏移而确定。
继续对于图2A的讨论,处理器(208)是被配置成执行指令的具有单个核心或者多个核心的一组电子电路。在本发明的一个实施例中,处理器(208)可使用复杂指令集(CISC)架构或精简指令集(RISC)架构实现。在本发明的一个或多个实施例中,处理器(208)包括(由PCIe协议定义的)根组件。在本发明的一个实施例中,如果控制模块(200)包括根组件(根组件可被集成在处理器(208)中),那么存储器(210)经由根组件连接至处理器(208)。或者,存储器(210)使用其他点对点连接机制直接连接至处理器(208)。在本发明的一个实施例中,存储器(210)对应于任何易失存储器,包括但不限于,动态随机存取存储器(DRAM)、同步动态随机存取存储器(SDRAM)、单数据速率同步动态随机存取存储器(SDRSDRAM)、双倍数据速率同步动态随机存取存储器(DDRSDRAM)。
在本发明的一个实施例中,处理器(208)被配置成创建并更新存储器内(in-memory)数据结构(未示出),其中存储器内数据结构存储在存储器(210)中。在本发明的一个实施例中,存储器内数据结构包括在存储模块的集合中在逻辑地址和物理地址之间(直接或者间接)的映射。在本发明的一个实施例中,逻辑地址是从客户端的角度展现的数据所驻留的地址。在本发明的一个实施例中,逻辑地址是(或者包括)对n元组(n-tuple)应用散列(hash)函数(例如,SHA-1、MD-5等等)而产生的散列值。在本发明的一个实施例中,n元组是<对象ID,偏移>(<objectID,offset>),其中对象ID定义文件而偏移定义相对于该文件的起始地址的位置。在本发明的另一个实施例中,n元组是<对象ID,偏移,出生时间>(<objectID,offset,birthtime>),其中出生时间对应于(使用对象ID标识)文件被创建的时间。或者,逻辑地址可包括逻辑对象ID和逻辑字节(byte)地址,或者逻辑对象ID和逻辑地址偏移。在本发明的另一个实施例中,逻辑地址包括对象ID和偏移。本领域的技术人员将会意识到多个逻辑地址可被映射到单个的物理地址,因此逻辑地址并不被限制于上述的实施例。
在本发明的一个实施例中,物理地址可对应于(i)存储器(210)中的位置、(ii)弯曲存储器(vaultedmemory)(例如图3中的324)中的位置、(iii)固态存储器模块(例如图3中的330A)中的位置。在本发明的一个实施例中,如果在存储装置中存在数据的多个副本,则存储器内数据结构可将单个的散列值映射到多个物理地址。
在本发明的一个实施例中,存储器(210)包括下述中的一个或多个:用于处理器的提交队列、用于处理器的完成队列、用于存储装置中的每一个存储模块的提交队列和用于存储装置中的每一个存储模块的完成队列。在本发明的一个实施例中,用于处理器的提交队列被用于向处理器发送命令(例如,读取请求、写入请求)。在本发明的一个实施例中,用于处理器的完成队列被用于发信号通知(signal)处理器由处理器发布给另一个实体的命令已经被完成。用于存储模块的提交和完成队列以类似的方式运作。
在本发明的一个实施例中,(经由交换机架构)处理器被配置为将各种类型的处理卸载(offload)至FPGA(212)。在本发明的一个实施例中,FPGA(212)包括为正写入至存储模块和/或正从存储模块中读取的数据计算校验和的功能。此外,为了使用RAID方案(例如RAID2-RAID6)将数据存储在存储模块中,FPGA(212)可包括计算P和/或Q奇偶校验信息的功能,和/或,FPGA(212)还可包括执行各种计算的功能,这些计算是恢复采用RAID方案(例如RAID2-RAID6)保存但被损坏的数据所需要的。在本发明的一个实施例中,存储模块组(202)包括一个或多个存储模块(214A、214N),每一个存储模块被配置成存储数据。存储模块在下面的图3中描述。
在本发明的一个实施例中,处理器(208)被配置成对系统中的一个或多个DMA引擎编程。例如,处理器(208)被配置成对客户端交换机(参见图1D)中的DMA引擎编程。处理器(208)也可被配置成对存储模块(参考图3)中的DMA引擎编程。在本发明的一个实施例中,对客户端交换机中的DMA引擎编程可包括创建组播组和产生用于组播组中的每一个成员的描述符。
转到图2B,图2B示出了按照本发明的一个或多个实施例的存储装置。该存储装置包括控制模块(216)和至少两个存储模块组(236、238)。控制模块(216)包括交换机架构(234),交换机架构直接连接至IOMA(218)、IOMB(220)、处理器A(222)、处理器B(224)、FPGAA(230)(如果存在的话)、FPGAB(232)(如果存在的话)、存储模块组A(236)中的存储模块(236A、236N)和存储模块组B(238)中的存储模块(238A、238N)。所有上述组件之间的通信(除了处理器A(222)和处理器B(224)之间的通信)都通过交换机架构(234)。在本发明的一个实施例中,控制模块(216)内的处理器(222、224)能够使用诸如快速通道互联(QuickPathInterconnect)的点对点互联直接通信。本领域的技术人员将会意识到其他点对点通信机制可被用于允许处理器(222、224)之间的直接通信而不脱离本发明的范围。
继续参考图2B,在本发明的一个实施例中,控制模块(216)与图2A中的控制模块(200)基本上相似。在本发明的一个实施例中,交换机架构(234)与图2A中的交换机架构(206)基本上相似。在本发明的一个实施例中,每一个处理器(222、224)与图2A中的处理器(208)基本上相似。在本发明的一个实施例中,存储器(226、228)与图2A中的存储器(210)基本上相似。在本发明的一个实施例中,IOM(218、220)与图2A中的IOM(204)基本上相似。在本发明的一个实施例中,FPGA(230、232)与图2A中的FPGA(212)基本上相似。最后,存储模块组(236、238)与图2A中的存储模块组(202)基本上相似。
在本发明的一个实施例中,控制模块(216)中的两个IOM(218、220)使得用于控制模块(216)的I/O带宽(相对于具有单个IOM的控制模块的I/O带宽)加倍。此外,添加第二IOM(或者额外的IOM)增加了可连接至给定的控制模块的客户端的数量,以及,通过扩展,增加了可连接至存储装置的客户端的数量。在本发明的一个实施例中,使用交换机架构(234)来处理各个相连接的组件之间的通信(如上面所描述的)允许每一个处理器(222、224)(经由交换机架构(234))直接存取连接至该交换机架构(234)的所有的FPGA(230、232)和所有的存储模块(236A、236N、238A、238N)。
参考图2C,图2C示出了一存储装置,该存储装置包括(通过交换机架构(246))连接至存储模块组(256、258、260、262)中的多个存储模块(未示出)的控制模块(240)。如图2C所示,存储模块(240)包括两个IOM(242、244)、两个处理器(248、250)和存储器(252、254)。在本发明的一个实施例中,控制模块(240)中的所有组件经由交换机架构(246)通信。此外,处理器(248、250)可使用交换机架构(246)或者直接连接(如图2C所示)而与彼此通信。在本发明的一个实施例中,控制模块(240)中的处理器(248、250)可使用诸如快速通道互联(QuickPathInterconnect)的点对点互联直接通信。本领域的技术人员将会意识到其他点对点通信机制可被用于处理器(248、250)之间的直接通信而不脱离本发明的范围。
在本发明的一个实施例中,处理器A(248)被配置成主要处理涉及存储模块组A和B(256、258)的存储和提取(retrieval)数据的请求,而处理器B(250)被配置成主要处理涉及存储模块组C和D(260、262)的存储和提取(retrieval)数据的请求。然而,处理器(248、250)被配置成(经由交换机架构(246))与所有的存储模块组(256、258、260、262)通信。这种组态使得控制模块(240)能够扩展处理之间的I/O请求的处理,和/或,提供内置的冗余度来处置其中一个处理器失效的情况。
继续参考图2C,在本发明的一个实施例中,控制模块(240)基本上与图2A中的控制模块(200)相似。在本发明的一个实施例中,交换机架构(246)基本上与图2A中的交换机架构(206)相似。在本发明的一个实施例中,每一个处理器(248、250)基本上与图2A中的处理器(208)相似。在本发明的一个实施例中,存储器(252、254)基本上与图2A中的存储器(210)相似。在本发明的一个实施例中,IOM(242、244)基本上与图2A中的IOM(204)相似。最后,存储模块组(256、258、260、262)基本上与图2A中的存储模块组(202)相似。
参考图2D,图2D示出了包括两个控制模块(264、266)的存储装置。每一个控制模块包括IOM(296、298、300、302)、处理器(268、270、272、274)、存储器(276、278、280、282)和(如果存在的话)FPGA(288、290、292、294)。每一个存储模块(264、266)包括交换机架构(284、286),控制模块内的部件经由交换机架构通信。
在本发明的一个实施例中,控制模块中的多个处理器(268、270、272、274)可使用诸如快速通道互联(QuickPathInterconnect)的点对点互联直接彼此通信。本领域的技术人员将会意识到其他点对点通信机制可被用于允许多个处理器(268、270、272、274)之间的直接通信而不脱离本发明的范围。此外,控制模块A中的处理器(268、270)可经由与控制模块B中的交换机架构(286)的直接连接而与控制模块B中的组件通信。类似的,控制模块B中的处理器(272、274)可经由与控制模块A中的交换机架构(284)的直接连接而与控制模块A中的组件通信。
在本发明的一个实施例中,每一个控制模块连接至(被标记为存储模块组(304、306、308、310)的)各个存储模块。如图2D所示,每一个控制模块可与连接至控制模块中的交换机架构的存储模块通信。此外,控制模块A(264)中的处理器可使用交换机架构B(286)与连接至控制模块B(266)的存储模块通信。类似的,控制模块B(266)中的处理器可使用交换机架构A(284)与连接至控制模块A(264)的存储模块通信。
控制模块之间的互联允许存储控制在整个存储装置上分配I/O负载而不需要考虑是哪一个控制模块接收了该I/O请求。此外,控制模块的互联使得存储装置能够处理更大数量的I/O请求。更进一步,控制模块的互联提供在一个控制模块(或者其中的一个或多个组件)失效的情况下内置的冗余度。
参考图2B-2D,在本发明的一个或多个实施例中,存储器内(in-memory)数据结构跨控制模块中的存储器被镜像。在这种情况下,控制模块中的处理器发布所必要的命令来更新存储装置中的所有存储器,使得存储器内数据结构跨所有的存储器被镜像。在这种方式中,任何处理器可使用其自己的存储器来确定存储装置中数据的位置(如上面所讨论的,由n元组定义)。这个功能允许任何存储器服务于任何关于存储模块中数据的位置的I/O请求。此外,通过镜像存储器内数据结构,存储装置可在其中一个存储器失效时继续进行运行。
本领域的技术人员将会意识到虽然图2A-2D所示的存储模块连接至有限数量的存储模块,该存储模块可连接至任意数量的存储模块而不脱离本发明的范围。本领域的技术人员将会意识到虽然图2A-2D示出了存储装置的不同组态,存储装置可使用其他组态实现而不脱离本发明的范围。
图3示出了根据本发明的一个或多个实施例的存储模块。存储模块(320)包括存储模块控制器(322)、存储器(324)以及一个或多个固态存储器模块(330A、330N)。这些组件中的每一个将在下面被描述。
在本发明的一个实施例中,存储模块控制器(322)被配置成接收多个请求,这些请求从一个或多个控制模块读取数据和/或向一个或多个控制模块写入数据。此外,存储模块控制器(322)被配置成是使用存储器(324)和/或固态存储器模块(330A、330N)来服务于多个读取请求和写入请求。尽管在图3中没有示出,存储模块控制器(322)可包括DMA引擎,其中DMA引擎被配置成从存储器(324)或者从其中一个固态存储器模块(330A、330N)读取数据,并将数据的副本写入客户端存储器(图1D中的114)中的物理地址。此外,DMA引擎可被配置成将数据从存储器(324)写入到一个或多个固态存储器模块。在本发明的一个实施例中,DMA引擎被配置成由处理器(例如图2A中的208)编程。本领域的技术人员将会意识到存储模块可包括位于该存储模块之外的DMA引擎而不脱离本发明的范围。
在本发明的一个实施例中,存储器(324)对应于任何易失存储器,包括但不限于,动态随机存取存储器(DRAM)、同步动态随机存取存储器(SDRAM)、单数据速率同步动态随机存取存储器(SDRSDRAM)、双倍数据速率同步动态随机存取存储器(DDRSDRAM)。
在本发明的一个实施例中,存储器(324)可被逻辑上或者物理上划分成弯曲存储器(vaultedmemory)(326)和高速缓存(328)。在本发明的一个实施例中,存储模块控制器(322)被配置成在被通知存储模块中的电源失效(或者在另一种存储模块可能失电)的情况下,将弯曲存储器(326)中的全部内容写入到一个或多个固态存储器模块(330A、330N)中。在本发明的一个实施例中,存储模块控制器(322)被配置成在被通知电源失效的时间和存储模块实际失电的时间之间将弯曲存储器(326)中的全部内容写入到一个或多个固态存储器模块(330A、330N)中。相反,高速缓存(328)中的内容在电源失效(或者在另一种存储模块可能失电)的情况下会丢失。
在本发明的一个实施例中,固态存储器模块对应于任何使用固态存储器来存储永久数据的数据存储设备。在本发明的一个实施例中,固态存储器可包括但不限于,NAND闪存(NANDflash)存储器、NOR闪存(NORflash)存储器、磁随机存取(M-RAM)存储器、自旋磁随机存取(ST-MRAM)存储器、相变存储器(PCM)、忆阻内存(memrisitivememory)或者任何其他被定义为非易失性存储级存储器(SCM)的存储器。本领域的技术人员将会意识到本发明的实施例并不限制于存储级存储器。
在本发明的一个实施例中,下述的存储位置是统一地址空间的一部分:(i)经由客户端交换机可存取的客户端存储器的部分、(ii)控制模块的存储器、(iii)存储模块中的存储器以及(iv)固态存储器模块。因此,从存储装置中的处理器的角度看,上述的存储位置(在物理上是分离的)表现为物理地址的单一池(singlepool)。换句话说,处理器可以对存储在该统一地址空间中的任何物理地址的数据发布读取和/或写入请求。上述的存储位置可被称为是使用统一地址空间可存取的存储架构(storagefabric)。
在本发明的一个实施例中,统一地址空间部分地(inpart)是通过客户端交换机中的非透明桥创建,非透明桥允许控制模块中的处理器“看见”客户端存储器的一部分。因此,控制模块中的处理器在其能够“看见”的客户端存储器的部分中执行读取和/或写入请求。
图4A-4B示出了根据本发明的一个或多个实施例的多个流程图。更具体地,图4A-4B示出了根据本发明的一个或多个实施例的用于在存储装置中存储数据的方法。虽然流程图中的各个步骤被展示并描述为按顺序的,本领域的技术人员将会意识到一些步骤或者全部的步骤可以以不同的顺序执行、可被组合或者省略,以及一些或者全部的步骤可被并行执行。在本发明的一个实施例中,图4A中所示的步骤与图4B中所示的步骤可被并行执行。
参考图4A,在步骤400,客户端向控制模块中的处理器(图2A中的208)的提交队列(SQ)写入一写入命令(写入请求)。在本发明的一个实施例中,写入命令指定客户端存储器中数据的逻辑地址(也可以被称为是“源地址”)。在本发明的一个实施例中,写入命令在达到处理器的提交队列(SQ)之前通过至少客户端交换机和交换机架构。
在步骤402,客户端向提交队列尾部门铃寄存器(SQTaildoorbellregister)写入新的提交队列尾部(SQTail)。在本发明的一个实施例中,通过向提交队列尾部门铃寄存器进行写入,客户端通知处理器在其提交队列中有新的命令需要处理。
在步骤404,处理器从提交队列获得该写入命令。在步骤406,处理器确定将要写入该数据的物理地址。在本发明的一个实施例中,物理地址对应于固态存储器模块中的位置。在本发明的一个实施例中,处理器选择两个将要写入该数据的副本的物理地址,其中每一个物理地址是位于分开的固态存储器模块中。
在步骤408,处理器对DMA引擎编程以向组播地址发布写入。在本发明的一个实施例中,组播地址与组播组相关,其中组播组指定控制模块的存储器中的第一存储位置、第一弯曲存储器中的第二存储位置以及第二弯曲存储器中的第三存储位置。在本发明的一个实施例中,第一弯曲存储器与包括由处理器指定的物理地址的固态存储器模块是位于同一个存储模块中。在本发明的一个实施例中,第二从固态存储器以相似的方式确定。在本发明的一个实施例中,为每一个在步骤406中由处理器确定的物理地址选择一个弯曲存储器位置。
在步骤410,DMA引擎从客户端存储器中的源地址读取用户数据,并将该数据写入由控制模块所指向的组播地址。在本发明的一个实施例中,交换机架构中的交换机与组播地址相关。在接收到该地址后,交换机对组播地址执行必要的翻译以获得三个地址—每一个对应一个上述的存储器位置。交换机然后将用户数据的副本发送至三个存储器位置。本领域的技术人员将会意识到执行组播的特定交换机可以根据交换机架构的实现而变化。在该实施例中,在客户端与存储装置之间仅有一个写入被发布。
在本发明的另一个实施例中,在步骤408,处理器对DMA引擎编程以并行发布三个写入请求—每一个对应一个上述的存储器位置。在该实施例中,在步骤410,DMA引擎并行发布该三个写入请求。在该实施例中,在客户端和存储装置之间有三个写入被发布。
继续参考图4A,在步骤412,处理器更新存储器内数据结构以反映该数据的三个副本被存储在存储装置中。在步骤414,处理器将(标识处理器的提交队列的)提交队列标识符(SQIdentifier)和(标识由客户端发布给处理器的具体写入命令的)写入命令标识符(WriteCommandIdentifer)写入客户端的完成队列(CQ)。
在步骤416,处理器为客户端处理器产生中断。在本发明的一个实施例中,处理器使用由非透明桥提供的门铃中断来向客户端处理器发布中断。在步骤418,客户端处理其完成队列(CQ)中的数据。在这一阶段,客户端被通知写入请求已经被处理(serviced)。在步骤420,一旦客户端处理完成处于完成队列头部的数据时,客户端向完成队列(CQ)头部门铃写入新的完成队列(CQ)头部。这对于处理器来说,表示在完成队列中用于未来提供给客户端的通知的下一个位置。
参考图4B,在步骤422,控制模块中的处理器开始从弯曲存储器向在步骤406中标识的物理地址写入数据。在本发明的一个实施例中,控制模块中的处理器对存储模块控制器中的DMA引擎编程,以从弯曲存储器中读取数据并将数据的副本写入固态存储器模块中的物理地址。
在步骤424,延续步骤422,控制模块中的处理器请求弯曲存储器中对应于在步骤422中被写入至固定存储器模块的数据的所有副本被移除。在步骤426,对于移除的确认由每一个在它们各自的弯曲存储器中包括(在步骤410被写入的)数据的副本的存储模块发送至控制模块中的处理器。
图5A-5C示出了在根据本发明的一个或多个实施例的存储装置中存储数据的示例。该示例并不意图限制发明的范围。此外,为了清楚的目的,在图5A-5C中客户端和存储装置中的各个部件被省略。
转到图5A,考虑客户端(500)发布请求以将(由黑色圈所标记)的数据写入存储装置的情况。响应于该请求,控制模块(504)中的处理器(514)确定数据的第一副本应当被写入存储模块A(518)中的固态存储器模块A(526)中的第一物理位置,而数据的第二副本应当被写入存储模块B(520)中的固态存储器模块B(528)中的第二物理位置。
根据该判断,处理器(514)创建具有三个成员的组播组。第一成员具有弯曲存储器A(522)中的目的地地址,第二成员具有弯曲存储器B(524)中的目的地地址,而第三成员具有存储器(512)中的目的地地址。处理器(514)之后对交换机架构(516)中的交换机(未示出)编程以实现该组播组。
DMA引擎继续向与组播组相关联的组播地址发布写入。该写入被发送至交换机架构并最终抵达实现组播组的交换机(未示出)。交换机然后创建三个写入(每一个写入对应一个由该组播组指定的目标)并将写入发布至目标存储位置。在本发明的一个实施例中,三个写入是并行发生的。
将在不同的目的地地址被写入的数据的副本通过交换机架构(516)。一旦写入完成,在存储装置中有数据的三个副本。一旦写入完成,存储器(512)中的存储器内数据结构(未示出)被更新以反映该数据在存储装置内的三个位置被存储。此外,客户端(500)被通知写入已完成。
参考图5B,在晚一些的时间点上,处理器(514)向存储模块A(518)发布请求将弯曲存储器A(522)中当前的数据的副本写入固态存储器模块A(526)的物理地址。响应于该请求,存储模块控制器(未示出)将弯曲存储器A(522)中的数据的副本写入固态存储器模块A(526)。处理器(514)在写入完成时被通知。处理器(514)可在从存储模块A(518)接收到该通知时更新存储器内数据结构。
此外,独立于存储装置的运行,客户端(500)可从客户端存储器(508)移除(已经被写入至存储装置的)数据。
参考图5C,一旦数据的副本已被写入固态存储器模块A,处理器(514)向所有在弯曲存储器中包括数据的副本的存储模块发布请求,要求从它们各自的弯曲存储器中移除数据的副本。在完成该请求后,各存储模块各自通知控制模块。图5C示出了在所有的存储模块完成该请求后系统的状态。处理器(514)可在从存储模块接收到弯曲存储器内所有数据的副本被移除的通知后更新存储器内数据结构。
图6示出了根据本发明的一个或多个实施例的流程图。更具体地,图6示出了根据本发明的一个或多个实施例的从存储装置中读取数据的方法。虽然流程图中的各个步骤被展示并描述为按顺序的,本领域的技术人员将会意识到一些步骤或者全部的步骤可以以不同的顺序执行、可被组合或者省略,以及一些或者全部的步骤可被并行执行。
在步骤600,客户端向控制模块中的处理器的提交队列(SQ)写入读取命令(读取请求)。在本发明的一个实施例中,读取命令包括逻辑地址。如上面所讨论的,逻辑地址的内容可根据实现方式而变化。
在步骤602,客户端向提交队列尾部门铃寄存器(SQTaildoorbellregister)写入新的提交队列尾部(SQTail)。在本发明的一个实施例中,通过对提交队列尾部门铃寄存器的写入,客户端通知处理器在其提交队列中有新的命令要处理。在步骤604,处理器从提交队列(SQ)获取读取命令。在步骤606,处理器基于逻辑地址确定存储器内数据结构中的物理地址的位置。
在步骤608,处理器从在步骤606确定的位置获取物理地址。在本发明的一个实施例中,物理地址对应于存储装置中的数据的一个或多个位置。例如,数据的位置可以包括下述中的一个或多个:处理器的存储器中的位置、存储模块的存储器中的位置和/或固态存储器模块中的位置。
在本发明的一个变化实施例中,如果存储器中数据结构包括逻辑地址至物理地址的直接映射,则步骤606和608可被合并成单个的查找,在该单个的查找中逻辑地址被用于直接获取物理地址。
在步骤610,做出其中一个数据位置是否在控制模块的存储器中的决定(determination)。如果其中一个数据位置是在控制模块的存储器中,该过程继续至步骤622;否则,该过程继续至步骤612。在本发明的一个实施例中,在存储装置中有数据的多个副本的情况下,数据优先从控制模块的存储器中读取。如果该数据在控制模块的存储器中不存在,数据优先从弯曲存储器(如果存在弯曲存储器的话)中读取,之后从固态存储器模块(如果数据的副本在弯曲存储器中不存在)中读取。
在步骤612,处理器向存储模块的提交队列(SQ)写入读取物理数据命令(ReadPhysicalDataCommand)。
在步骤614,存储模块将数据从固态存储器模块中的物理位置传送到存储模块存储器(例如图3中的324),发起从存储模块存储器到客户端存储器的数据的DMA传送,并在DMA完成之后,向处理器的完成队列(CQ)写入读取命令完成。在本发明的一个实施例中,如果所请求的物理位置是在弯曲存储器中,则存储模块不需要将数据从固态存储器模块中的物理位置传送至存储模块存储器。
在本发明的一个实施例中,DMA引擎位于数据所处的存储模块的存储模块控制器中。在本发明的一个实施例中,DMA引擎被配置成向客户端交换机发送数据的副本。客户端交换机收到后,客户端交换机执行必要的映射(或者翻译)以标识客户端存储器中的适当的位置。该数据的副本然后被写入客户端存储器中所标识的位置。
在步骤616中,存储模块为处理器产生中断。在步骤618,处理器处理其完成队列(CQ)中的数据。在这个阶段,处理器已经被通知读取请求已经被服务。在步骤620,一旦处理器处理完位于完成队列头部的数据,客户端向完成队列头部门铃(CQheaddoorbell)写入新的完成队列头部(CQhead)。对于存储模块来说,这表示在完成队列中用于未来提供给处理器的通知的下一个位置。该过程然后继续至步骤624。
在步骤622,处理器对(可位于存储装置或者客户端交换机中的)DMA引擎编程以从控制模块的存储器中读取数据并将数据的副本写入可经由非透明桥存取的客户端存储器中的位置。DMA引擎然后从控制模块中的存储器读取数据并将数据的副本写入客户端存储器。
在步骤624,处理器向客户端的完成队列(CQ)写入(确定处理器的提交队列(SQ))的提交队列标识符(SQIdentifier)和(确定客户端发布给处理器的具体读取命令)的读取命令标识符(ReadCommandIdentifier)。在步骤626,处理器为客户端处理器产生中断。在本发明的一个实施例中,处理器使用由非透明桥提供的门铃中断来向客户端处理器发布中断。在步骤628,客户端在其完成队列(CQ)中处理数据。在这个阶段,客户端已经被通知该读取请求已经被服务。在步骤630,一旦客户端处理完位于完成队列头部的数据,客户端向完成队列头部门铃(CQheaddoorbell)写入新的完成队列头部(CQhead)。对于处理器来说,这表示在完成队列中用于未来提供给客户端的通知的下一个位置。
图7A-7C示出了从根据本发明的一个或多个实施例的存储装置中读取数据的多个示例。这些示例并不意图限制本发明的范围。
参考图7A,考虑客户端(500)发布从存储装置读取(用黑色圈表示的)数据的请求的情况。响应于该请求,控制模块(504)中的处理器(514)确定数据的第一副本是位于存储器(512)中而数据的第二副本是位于固态存储器模块B(528)中。根据该确定,处理器(514)对DMA引擎(为示出)编程以从存储器(512)读取数据并将数据的副本写入客户端存储器(508)中的物理地址。当被编程后,DMA引擎从存储器(512)读取数据并向客户端存储器(508)发布写入。当将要被写入的数据的副本抵达客户端交换机(502)时,客户端交换机将DMA引擎提供的目的地地址映射(或翻译)成客户端存储器(508)中的地址。数据的副本然后被写入到客户端存储器(508)中由客户端交换机(502)所确定的地址。在这个示例中,DMA引擎可位于客户端交换机(502)中。
参考图7B,考虑客户端(500)发布从存储装置读取(用黑色圈表示的)数据的请求的情况。响应于该请求,控制模块(504)中的处理器(514)确定数据的副本是位于固态存储器模块B(528)中。根据该确定,处理器发起从固态存储器模块B(528)至可由DMA引擎(未示出)存取的存储器(例如弯曲存储器B(524))的数据传送,接下来对DMA引擎编程以从该存储位置读取数据并将数据的副本写入客户端存储器(508)中被请求的位置。当将要被写入的数据的副本抵达客户端交换机(502)时,客户端交换机将DMA引擎提供的目的地地址映射(或翻译)成客户端存储器(508)中的地址。该数据的副本然后被写入到客户端存储器(508)中由客户端交换机(502)所确定的地址。在这个示例中,DMA引擎可位于存储模块B(520)中。
参考图7C,考虑客户端(500)发布从存储装置读取(用黑色圈表示的)数据的请求的情况。响应于该请求,控制模块(504)中的处理器(514)确定数据的第一副本是位于弯曲存储器B(524)中而数据的第二副本是位于固态存储器模块B(528)中。根据该确定,处理器(514)对DMA引擎(未示出)进行编程以从弯曲存储器B(524)中读取数据并将数据的副本写入客户端存储器(508)的物理地址中。当被编程后,DMA引擎从弯曲存储器B(524)中读取数据并向客户端存储器(508)发布写入。当将要被写入的数据的副本抵达客户端交换机(502)时,客户端交换机将DMA引擎提供的目的地地址映射(或翻译)成客户端存储器(508)中的地址。数据的副本然后被写入到客户端存储器(508)中由客户端交换机(502)所确定的地址。在这个示例中,DMA引擎可位于存储模块B(520)中。
本发明的一个或多个实施例可使用由该系统中的一个或多个处理器执行的指令实现。此外,这些指令可对应于存储在一个或多个非暂时性的计算机可读介质上的计算机可读指令。
虽然本发明是结合有限数量的实施例被描述,本领域的技术人员,从本发明中受益后,将会意识到其他的实施例也能够被设计出而不脱离此处所揭示的发明的范围。因此,本发明的范围不应当仅被所附的权利要求所限制。