在近存储器计算中执行的数据运算符的新鲜度和重力 背景技术 [0001] 将数据移动到CPU进行计算的传统方法已经成为新兴的横向扩展数据密集型应用的显著性能瓶颈,因为与本地缓存访问相比,这种方法的数据重用有限且互连性能相对较慢。同时,3D集成技术的进步使十年前提出的将计算单元耦接到存储器附近(通常称为近存储器计算(NMC))的概念变得更加可行。直接在存储器中进行处理可以显著减少数据密集型应用的数据移动问题。 附图说明 [0002] 参考以下附图根据一个或多个不同的实施例详细地描述本公开。附图仅被提供用于说明性目的,并且仅描绘典型实施例或示例实施例。 [0003] 图1图示了可以在其中将对分解式存储器的数据查询操作卸载到近存储器计算的示例架构。 [0004] 图2图示了可以在其中实施本文所描述的系统和方法的另一示例架构。 [0005] 图3图示了可以在分解式存储器中实施的示例数据运算符堆栈。 [0006] 图4是根据所公开技术的实施方式的用于管理近存储器计算的新鲜度使用指示符的示例的图示。 [0007] 图5是根据所公开技术的实施方式的用于管理近存储器计算的重力使用指示符的示例的图示。 [0008] 图6是根据本文公开的实施方式的用于将数据查询操作路由到分解式存储器的方法的示例流程图。 [0009] 图7图示了可以在其中实施本文所描述的系统和方法的示例计算机系统的框图。 [0010] 附图并非是穷举的,并且不将本公开限制于所公开的精确形式。 具体实施方式 [0011] 多年来,存储器技术在延迟和能耗方面一直无法跟上处理器技术的进步。登纳德缩放(Dennard scaling)的消亡、摩尔定律的放缓以及暗硅计算机性能已经达到稳定期。同时,跨多个学科(例如,材料科学、化学、健康科学等)生成了大量数据。在传统系统中,这些应用会导致服务器的存储器子系统与处理器之间频繁的数据移动。服务器内频繁的数据移动会影响性能和能效。系统架构师试图通过引入减轻片外DRAM的一些缺点的存储器层次结构来弥补这一差距。然而,存储器封装体上有限数量的管脚无法满足当今多核处理器的带宽需求。 [0012] 传统的存储器层次结构通常由多级缓存、主存储器和存储装置构成。例如,一种传统的方法是在将数据从存储装置向上移动到缓存之后处理数据。相反,近存储器计算(NMC)旨在处理数据驻留位置附近的数据。这种以数据为中心的方法使计算单元在逻辑上和/或物理上尽可能靠近数据所驻留的存储装置,并试图最大限度地减少代价高的数据移动。例如,三维堆栈使得能够在存储器附近进行处理。通过使用硅通孔(TSV)将逻辑和存储器堆叠在一起,NMC可以帮助减少存储器访问延迟和功耗,并提供更高的带宽。 [0013] 将计算移动到更靠近存储器的位置,可以通过绕过存储器封装体管脚数限制来避开数据移动中的性能和能量瓶颈。NMC通过在存储器附近执行数据操作的数据运算符来加速对存储器的访问,并且由此消除了来往于存储器的多次互连遍历的开销。NMC通过存储器接口而不是互连接口连接到存储器。存储器接口可以提供数十纳秒的延迟,而不是互连接口上的数百纳秒(例如,300ns)的延迟。通过使用数据运算符,NMC可以有效地增加带宽并减少存储器与计算节点之间的延迟。通过在存储器附近执行操作,可以减少用于执行需要在计算节点与存储器之间传输的数据请求的数据量,与从存储器请求所有数据和在计算节点处执行操作相比,这有效地增加了互连的带宽并减少了延迟。数据运算符可以是寻址(例如,指针追逐)、过滤(例如,数据缩减)或更复杂的计算(例如,初始化、加密、压缩、投影等)的形式。对于运算符不是固定函数的NMC,运算符的数量通常是有限的,并且其需要共享,并且可能被更频繁使用的运算符取代。 [0014] 数据运算符可以设置在存储器与网络层之间,并且可以控制数据如何从存储器移动到网络,从而控制如何从存储器堆栈取得数据。存储器堆栈可以包括分解式存储器,所述分解式存储器是横向扩展存储形式,由一些数量的存储设备构建,所述存储设备充当存储的逻辑池,可以通过网络结构分配给网络上的任何服务器。客户端设备可以通过与一个或多个数据运算符建立连接来访问分解式存储器。每当客户端发出请求时,网络堆栈都会将请求路由到指派给发起数据请求的客户端设备的数据运算符。 [0015] 数据库被独特地定位以利用分解式存储器来解决数据移动效率低下和DRAM容量不足的问题。本文公开的NMC的实施方式可以包括从存储器缓冲器管理物理地分离查询处理。传统上,查询处理线程通过从缓冲池中读取数据库表并将数据复制到其专用工作空间来访问所述数据库表。根据本文公开的实施方式,缓冲池可以被放置在网络连接的分解式存储器上,查询处理节点根据需要被提供以通过从网络连接的缓冲池读取数据来运行查询。本文公开的实施方式提供了多个优点,如但不限于:(1)通过将运算符下推到分解式存储器来减少数据移动,使得处理节点仅接收相关数据;以及(2)通过将缓冲缓存集中在分解式存储器中并去除对计算节点的不必要的数据复制来减少计算节点的存储器需求。 [0016] 与远程存储器相比,分解式存储器系统使用不同于计算节点(如但不限于客户端设备)中的存储器的网络连接的存储器。各种实施方式中的计算节点可以是提供临时存储、联网、存储器和可以消耗分解式存储器实例的处理资源的设备。这种方法允许分解式存储器独立于系统的计算或存储容量进行扩展,并消除了过度提供一种资源以扩展另一种资源的需要。在分解式存储器系统中,网络开销是制约性能的瓶颈。 [0017] 本文公开的实施方式提供了可以改善与经由附接到分解式存储器的网络上的互连结构访问数据相关联的带宽和延迟的系统和方法,同时还通过利用使用指示符(如每个数据运算符的“新鲜度”指示符和NMC朝向计算节点的“重力”指示符)来减少与经由互连结构访问数据相关联的能量。每个使用指示符可以表示NMC对于给定数据请求的适当性的测量单位,从而允许托管分解式存储器的系统通过管理系统内的每个NMC和数据运算符来优化系统的整体性能。例如,可以基于一个或多个使用指示符将数据运算符和/或NMC指派给数据请求,这可以提供最佳性能。 [0018] 应当注意,如本文所使用的术语“优化”、“最优”等可以用于意指做到或实现尽可能有效或完美的性能。然而,阅读本文件的本领域普通技术人员将认识到,并不总是能够实现完美。因此,这些术语还可以涵盖在给定的情况下做到或实现尽可能好或有效或实际的性能、或者做到或实现优于利用其他设置或参数所可以实现的性能。 [0019] 图1图示了可以在其中将对存储器的数据查询操作卸载到NMC的示例架构。图1包括经由网络接口107连接到分解式存储器108的多个计算节点105(例如,第一计算节点105A和第二计算节点105B)。作为数据操作的一部分,计算节点105可以发出请求来自分解式存储器108的数据的数据查询。计算节点105可以被实施为经由网络接口107连接到分解式存储器108的任何计算设备。例如,计算节点105可以是客户端设备。作为另一示例,计算节点 105可以是具有CPU、存储器、网络接口的服务器。在示例实施方式中,计算机节点105可以被实施为图7的计算机系统700。在另一示例中,可以将多个计算节点组织成集群,其中,每个集群表示计算节点105。 [0020] 分解式存储器108包括存储器110(例如,存储器110A、存储器110B、存储器110N等)的逻辑池。图1的每个存储器110可以是互连结构上的示例分解式存储器节点。例如,多个分解式存储器节点110可以经由多个互连结构连接。因此,在一些示例中,分解式存储器108可以用作从计算节点105分解的存储器,并且可以在多个计算机节点105之间共享。在一些情况下,分解式存储器可以由所有节点共享。网络接口107可以是结构接口的示例。 [0021] 分解式存储器108还包括多个动态区域121(例如,第一动态区域121A、第二动态区域121B和第三动态区域121N)。每个动态区域121(在本文中也称为NMC)包括一个或多个数据运算符111(例如,第一数据运算符111A、第二数据运算符111B、第三数据运算符111C、第四数据运算符111E、第五数据运算符111F和第六数据运算符111N)。在一个示例中,多个数据运算符111包括查询运算符,所述查询运算符包括:(i)被配置为根据谓词集合过滤数据的选择运算符,(ii)被配置为减少返回的列并减少存储器访问的投影运算符,(iii)聚合运算符,(iv)区分运算符,(v)被配置为组合元组的分组运算符(例如,区分、按聚合分组),(vi)正则表达式匹配运算符,(vii)加密运算符以及(viii)系统支持运算符,所述系统支持运算符被配置为在发送数据(例如,加密/解密)之前原位处理数据,并执行系统优化任务(如打包数据)以减少整体网络使用。可以使用ASIC、使用FPGA、SmartNIC、ARM、其他处理器等来实施数据运算符111。在示例实施方式中,数据运算符111可以被实施为图7的计算机系统700的实例。 [0022] 在一些实施方式中,每个动态区域121包括一个或多个数据存储区112(例如,数据存储区112A、数据存储区112B、…、数据存储区112N)。数据存储区112可以存储用于指派、加载和管理加载到对应动态区域121中的数据运算符111的指示符和策略。例如,数据存储区 112可以存储每个数据运算符111的第一使用指示符,NMC可以利用所述第一使用指示符来管理数据运算符,以根据策略执行数据请求。作为另一示例,数据存储区112可以存储对应动态区域121的第二使用指示符,NMC可以利用所述第二使用指示符来管理数据运算符,以根据策略执行数据请求。 [0023] 分解式存储器108可以由多个计算节点105中的一个或多个来访问。例如,第一计算节点105A和第二计算节点105B都可以访问分解式存储器108和/或第一计算机节点105A和第二计算机节点105B中的一个可以访问分解式存储器108。在一个示例中,计算节点105A和计算机节点105B各自可以调用两个数据查询的投影和选择形式的数据请求,所述两个数据查询作为对应动态区域121的数据运算符111被卸载到分解式存储器108,同时在计算节点105A和105B处执行联合和最终投影。在一个示例中,分解式存储器108包括编程接口,所述编程接口包括用于路径操作和连接管理操作的数据API。通过将数据API连接到存储器 110,可以将数据运算符111卸载到分解式存储器108,从而有效地充当插接式线流处理器。 [0024] 数据运算符流水线可以由实施给定数据运算符的单独块构建,并提供标准接口以将数据运算符组合成流水线。流水线的模块化特性允许运算符轻松地替换和扩展(例如,连接运算符)。下面结合图3提供了示例数据运算符流水线。 [0025] 图2图示了可以在其中实施本文所描述的系统和方法的另一示例架构200。示例架构200包括存储器堆栈204、数据运算符堆栈206、以及网络堆栈202。数据从一个或多个计算节点(例如,图1的计算节点105A、计算节点105B)经由网络堆栈202和数据运算符堆栈206传输到存储器堆栈204以及从所述存储器堆栈传输。存储器堆栈204包括分解式存储器(例如,图1的分解式存储器108),所述分解式存储器包括经由多个通道(例如,通道256A、通道 256B、…、通道256N)连接到存储器管理单元208的存储器池(例如,图1的存储器110A、存储器110B、…、存储器110N)。数据运算符堆栈206包括多个数据运算符111(例如,图1的数据运算符111A、数据运算符111B、…、数据运算符111N)以及一个或多个数据存储区112。多个数据运算符111连接到存储器管理单元208和网络接口107。多个数据运算符111经由多个通道 236(例如,通道236A、通道236B、…、通道236N)连接到存储器管理单元208。通道236可以是存储器接口的说明,数据运算符堆栈206(例如,动态区域121的示例)通过所述存储器接口与存储器堆栈204连接。网络堆栈202被配置为解码传入数据流并将数据一起传送到适当的数据运算符111。网络堆栈202包括网络接口107。网络接口107经由多个通道234(例如,通道 234A、通道234B、…、通道234N)连接到多个数据运算符111。在一种配置中,网络接口107是结构接口的示例,所述结构接口被配置为通过多个互连结构向多个数据运算符111中的每个数据运算符传输数据。所述多个互连结构可以连接到一个或多个分解式存储器节点。 [0026] 网络堆栈202被配置为向/从数据运算符堆栈206发送/接收数据。例如,网络堆栈 202(例如,从计算节点)接收数据查询并将其转发到数据运算符堆栈206。网络堆栈202管理计算节点与多个数据运算符111之间的所有连接。网络堆栈202经由网络接口107接收/发送数据。网络接口107允许网络上的处理器绕过操作系统和CPU资源来交换主存储器中的数据。在一个示例中,网络接口107包括连接协议,所述连接协议使用零复制联网直接从一个系统的主存储器读取数据并将数据直接写入另一系统的主网络,从而通过释放并行高性能计算(HPC)集群中的服务器资源来提高性能和吞吐量。 [0027] 运算符堆栈206包括将数据运算符下推到分解式存储器所必需的动态逻辑。每个数据运算符111可以被配置为执行NMC(例如,近存储器处理操作)。数据运算符堆栈206可以同时处理多个计算节点的数据。例如,数据运算符111能够处理多个数据查询。数据可以在运算符流水线内以流方式进行处理,其中,处理的每个阶段都被完全流水线化,使得每个数据运算符111内的不同处理阶段可以同时发生。这种配置可以用于利用通过并发动态区域进行的空间并行化(例如,由多个处理单元同时执行任务)和流水线并行化二者。流水线并行化可以指多个运算符彼此依赖,而每个运算符的执行可以与其他数据运算符111重叠。这两者都可以提高系统的整体性能。正是通过运算符堆栈,系统可以识别与先前识别的结构的关系,并且执行对访问数据的优化。优化可以包括预取要访问的数据、将数据缓存在要频繁重用的更高级别的缓存中、和/或通过推测性地更新元数据进行预计算以反映即将到来的IO、缓冲区分配或与应用程序和数据相关联的其他参数。 [0028] 可以根据存储在数据存储区112中的策略和指示符经由管理运算符来管理多个数据运算符111。在示例中,管理运算符可以是运算符111中首先被加载并且基于首先被加载而被配置为管理其他随后被加载的数据运算符111的一个运算符。管理运算符监测其他数据运算符的处理负载,计算新鲜度和重力(如在图4和图5的讨论中进一步详细解释的),并基于策略做出反应。管理运算符还可以向其他工具和系统管理提供编程和用户接口。在另一示例中,管理运算符可以是控制器,所述控制器例如可以被实施为图7的计算设备700。 [0029] 在一个示例中,管理运算符是启动(例如,打开、启动、联机等)的第一数据运算符。 在启动的第一数据运算符是管理运算符的配置中,第一运算符可以被称为“引导运算符”。 管理运算符在整个数据操作过程中都保持打开状态。如果管理运算符崩溃,则多个运算符中的任何一个运算符都可以成为管理运算符。例如,如果管理运算符崩溃,则非管理运算符可以成为管理运算符。 [0030] 数据运算符堆栈206经由多个连接236向/从存储器堆栈204发送/接收数据。存储器堆栈204实施存储器池110,并且可以用作常规存储器,其中根据需要从存储装置加载数据。存储器堆栈204被配置为处理存储器分配、地址转换和并发访问。存储器堆栈204包括用于将地址转换到存储器的存储器管理单元208。存储器管理单元208经由多个通道(例如,通道256A、通道256B、通道256N等)连接到存储器堆栈204内的存储器110。例如,多个通道256可以将存储器110路由到访问存储器管理单元208。可以以条带模式将存储器分配给每个通道以优化可用带宽。运算符堆栈206可以与存储器堆栈204进行接口连接以从存储器堆栈 204接收数据和元数据。 [0031] 计算节点可以通过打开到包含一个或多个数据运算符111的动态区域121中的一个动态区域的连接来访问分解式存储器,每个动态区域能够包含可能的运算符流水线之一。当计算节点发出读取请求时,网络堆栈202将所述请求路由到运算符堆栈206中的动态区域,所述动态区域包含指派给发起所述请求的计算节点的数据运算符111。读取请求被转发到存储器堆栈204,所述存储器堆栈将虚拟地址转换为存储器110中的物理地址,并且然后向存储器110发出实际数据请求。计算节点可以具有可以用于确定要访问的存储器的虚拟地址的本地目录信息。返回的数据被流式传输回动态区域121,在所述动态区域中加载的数据运算符110被应用于数据。最后,将得到的数据转发到网络堆栈202,并进一步直接发送到计算节点。 [0032] 图3图示了数据运算符堆栈106的示例动态区域121。图3图示了包括在动态区域 121中的通用运算符流水线330,所述动态区域包括可以处理数据对象的多个数据运算符 332A‑332N(在本文中统称为数据运算符332)。在一个示例中,多个运算符332可以包括投影、选择(例如,谓词选择、正则表达式匹配)、分组(例如,区分、分组和聚合)和系统支持(例如,加密/解密)。在图3的说明性示例中,多个运算符包括解密运算符332A、投影运算符 332B、选择运算符332C、分组运算符332D以及系统运算符332N。运算符流水线330内的运算符332可以根据要执行的所请求的一组查询而变化。 [0033] 每个运算符流水线被分配给对应计算节点(例如,对应计算节点105)。运算符流水线330包括一个或多个数据运算符332,所述一个或多个数据运算符中的每个数据运算符向分解式存储器提供对数据运算的部分查询处理(例如,数据读取操作的处理)。可以通过查询请求处理程序302将查询转发到运算符堆栈中的查询请求处理程序。查询请求处理程序 302可以从存储器堆栈(例如,存储器堆栈204)请求与查询相关联的数据对象。这可以通过寻址来实现,所述寻址可以基于给定请求允许以行存储格式和列存储格式两者读取数据。 在一些实施例中,还可以以图格式或其他表示来读取数据。用于处理数据对象的数据运算符332可以被预编译到动态区域121,并且可以在运行时被部署(例如,加载)到所述动态区域。查询请求处理程序302可以根据查询将数据对象提交到一个或多个数据运算符332。 [0034] 当查询请求到达时,其首先被转发到查询请求处理程序302,所述查询请求处理程序从存储器堆栈请求数据。同时,用于附加处理的任何必要参数被转发到流水线中的数据运算符332。来自存储器的数据由这些数据运算符以流方式进行处理。一旦处理完成,所得数据就经由网络堆栈发送回客户端。 [0035] 作为说明性实施例,解密运算符332A可以在来自存储器堆栈204的数据被加密的情况下对所述数据进行解密。对于该操作,可能需要计算节点提供用于将密文解密为明文的特定密钥。这些密钥可以与查询请求一起提供。这可以允许系统提供附加的安全级别,这在现代分解式环境中很重要。 [0036] 投影运算符332B可以返回数据对象的子集。投影运算符332B可以从分解式存储器中读取表,基于描述元组及其大小的查询参数来解析传入的数据流,并且仅将必要的列投影到流水线中以使用注释进行进一步处理。这减少了提供给后续阶段的数据量,并且最终减少了总体数据移动的量。投影运算符332B可以使用注释以用来自所请求的查询的参数对元组进行注释。这些参数可以说明哪些列是投影阶段、选择阶段和分组阶段的一部分。投影运算符332B可以注释数据对象的子集,并且将其转发到选择运算符332C。 [0037] 选择运算符332C可以进一步过滤数据,以大大减少最终通过网络发送的数据量,从而减少I/O开销。选择运算符332C可以使用谓词选择、正则表达式匹配、向量化或其他方法来过滤数据。谓词选择可以通过将数据对象的属性的值与查询中提供的常数进行比较来进行。来自投影运算符332B的注释可以辅助确定在谓词匹配阶段期间评估什么内容。正则表达式匹配可以经由运算符堆栈206中的多个并行引擎来使用字符串匹配。该运算符的性能可以由字符串的长度主导,而不取决于所使用的正则表达式的复杂程度。向量化可以通过从运算符堆栈206中的多个通道中并行读取数据来进行。可以将各个元组发射到并行操作的一组选择运算符。并行运算符的数量可以基于存储器通道的数量和元组宽度来选择。 可以针对可以被并行化而没有数据依赖的较简单查询实施向量化。 [0038] 分组运算符332D可以执行聚合并且在将列条目发送到客户端应用程序和设备之前消除重复的条目。分组运算符332D可以对值进行散列并且将条目保存在存储器堆栈中的散列表中。在一些示例中,散列表可以使用布谷鸟散列,其具有可以并行查阅的若干散列表。布谷鸟散列可以从散列表中驱逐条目,并且利用不同的函数将这些条目插入到单独的散列表中,以减少冲突。分组运算符332D可以经由聚合对数据进行分组,并且基于所请求的聚合结果从散列表中转储清除数据条目。聚合可以产生特定分组,从而可以执行已经在分解式节点中的大部分处理(这可以基于特定的应用程序来确定),而不需要首先将所有数据移动到客户端,然后完全处理数据。 [0039] 系统运算符332N可以准备由投影运算符、选择运算符和分组运算符过滤的数据,以发送到客户端设备。系统运算符332N也可以根据需要或根据客户端设备的请求加密数据。系统运算符332N也可以基于来自投影运算符332B的注释列来打包数据,从而更高效地利用可用的网络带宽。打包可以使用溢出缓冲区来维持线路速率。在向量化的情况下,可以使用循环优先级仲裁器将来自每个并行流水线中的元组进行组合。系统运算符332N也可以包括发送器单元以在网络堆栈中产生正确的报头信息。发送器单元可以在没有关于最终数据大小的信息的情况下创建RDMA命令,从而可以允许在发出请求时最终数据大小为未知的情况下在运算符中进行过滤。发送器单元也可以将数据转发到网络堆栈,以便发送到客户端应用程序和设备。 [0040] 图4是根据所公开技术的实施方式的数据运算符的示例使用指示符的图示。更具体地,图4描绘了数据运算符411A‑411N的“新鲜度”指示符的示意图,所述数据运算符可以是图1的数据运算符111A‑111N的说明。图4包括存储器410(例如,存储器110之一的说明)、多个计算节点105(例如,第一计算节点105A、第二计算节点105B和第三计算节点105N)以及数据运算符411。多个数据运算符411布置在动态区域421内,所述动态区域是图1的动态区域121中的任何一个的说明。每个计算节点105经由连接436通信地连接到一个或多个数据运算符411。例如,第一计算节点105A经由连接436A通信地连接到一个或多个第一数据运算符,第二计算节点105B经由连接436B通信地连接到一个或多个第二数据运算符,并且第三计算节点105N经由连接436N通信地连接到一个或多个第三数据运算符。 [0041] 如果数据运算符没有被使用一段时间或足够的频率,并且存在其他可能的运算符活动,则可以将更新鲜的(例如,最近调用的)新数据运算符替换为执行操作。替换数据运算符时,对未加载数据运算符的调用将在调用数据运算符时引发异常。可以再次加载旧运算符,这类似于页面错误。数据访问可以在没有运算符的情况下执行,如果操作是透明的,则速度会慢得多(例如,压缩/解压缩可能必须在调用侧进行)。如果操作是运算符特定的,并且情况不足以使运算符可以被替换,则可能在计算节点处重新引发异常,并且计算节点可能不得不重新发出非运算符特定的请求,或者其可能向另一个分解式存储器节点调用相同的请求。 [0042] 如果数据运算符共享资源,如用于缓存数据的存储器或软核,则缓存的数据可以在一段时间内不被使用后被转储清除,并且软核可以被分配给另一个数据运算符(例如,当客户端明确请求时或者当所有相关联的数据运算符都被取消分配时,共享资源将被安全地转储清除)。 [0043] 可以附加到数据运算符的资源可以用来衡量数据运算符的新鲜度。“数据运算符的新鲜度”是一种确定数据运算符已经使用的时间或数据运算符使用的频率的方法。当数据运算符被广泛使用时,所有资源都可以由数据运算符指派和使用。与其他数据运算符相比,最近使用的数据运算符可以被指派高新鲜度。与其他数据运算符相比,最近未使用的数据运算符可以被指派低新鲜度。数据运算符可以根据最近使用或最频繁使用进行排序。例如,数据运算符可以从最近使用的运算符到尚未使用的运算符进行排序(例如,30纳秒、1秒、3分钟等)。作为另一示例,数据运算符可以根据最频繁使用到最不频繁使用进行排序。 排序可以是高新鲜度、中等新鲜度、低新鲜度等的顺序。那些没有使用或不频繁使用的数据运算符可能表明这些运算符已经过时。 [0044] 图5是根据所公开技术的实施方式的NMC的使用指示符的示例的图示。更具体地,图5描绘了分解式存储器节点与计算节点之间由于动态区域而产生的“重力”指示符的示意图。图5包括存储器510A和510B(例如,存储器110的说明,其可以被称为分解式存储器节点)、动态区域521A和521B(例如,动态区域121的说明)(每个动态区域包括多个运算符(图5中未示出))以及多个计算节点105A和105B。每个计算节点105分别经由连接536和538通信地连接到动态区域521A和521B。例如,第一计算节点105A经由连接536A通信地连接到动态区域521A,并且经由连接536B通信地连接到动态区域521B。第二计算节点105B经由连接 538A通信地连接到动态区域521A,并且经由连接538B通信地连接到动态区域521B。 [0045] 在一些实施方式中,如果在存储器510中的存储器处复制数据,则数据请求可以被路由到与其中复制数据的存储器510相对应的动态区域521,而不是加载新的数据运算符。 经复制数据是指被缓存在存储器510中的存储器的数据缓存中的数据。例如,存储器510可以缓存与计算节点105相关的数据。如果在存储器510处复制这样的数据,则可以确定重力指示符是否利用动态区域521以及其中的数据运算符来执行计算节点105的数据操作。例如,如果与来自计算节点105A的请求相关的数据被复制在存储器510A中(例如,被缓存在存储器510A中),则计算节点105A可以将其数据操作引导到动态区域521A,用于经由动态区域 521A的数据运算符来执行操作。如果与第一计算节点105A相关的被复制的数据被缓存在多个分解式存储器节点(例如,存储器510A和存储器510B)处,则重力指示符可以用于决定引导数据操作请求的动态区域。例如,数据操作请求可以被引导到与其他动态区域521相比具有最高重力指示符的动态区域521。因此,存储器510可以根据重力指示符进行排序,并用于选择具有最高重力的存储器来引导数据请求。 [0046] 利用经复制数据而不是加载新的数据提高了带宽性能,减少了延迟并且减少了能量,从而提高了计算性能。例如,由于对于给定的数据请求操作,数据已经存在于存储器510之一上,因此计算节点105不需要请求已缓存数据。作为结果,计算节点105与存储器510之间的互连(例如,连接536和/或连接538)的带宽被有效地增加(例如,加速),因为所述互连可以用于其他数据交换。带宽被有效地增加到高于互连的实际带宽,例如,在动态区域521不用于数据操作并且所有数据操作都在计算节点105处执行的情况下可用的带宽。在不使用动态区域521的情况下,可能需要从存储器510请求并交换每个数据操作所需的所有数据。此外,由于可以使用已缓存数据来执行数据请求操作,因此动态区域521可以利用经复制数据来执行更接近存储器510的操作。作为结果,可以减少由于互连上的数据交换引起的延迟,由此有效地增加了处理时间并且减少了延迟。 [0047] 有效带宽的增加可以取决于数据运算符。例如,如果数据运算符被实施用于指针追逐,则所述数据运算符将不必通过互连接口,所述互连接口可能具有数百ns的延迟。相反,可以在较低延迟的存储器接口上执行指针追逐操作,由此减少延迟并有效地增加带宽。 作为另一示例,如果数据运算符被实施用于过滤,则需要通过网络传输更少的位数据,这允许通过网络执行更多的数据请求。在又另一示例中,如果数据运算符被实施用于靠近存储器而不是在计算节点上的计算,则所述计算节点的资源可以被释放以执行其他操作等。 [0048] 相应计算节点105与相应存储器510之间由于相应动态区域521而产生的重力指示符 可以如下计算: [0049] [0050] 其中,Si表示服务于计算节点105的分解式存储器的i个存储器510中的存储器510中的相应存储器。Cj表示针对分解式存储器发出数据请求操作的相应计算节点105。SDl表示驻留在存储器Si上的与计算节点Cj的数据请求相关的可寻址数据的量或大小(例如,以字节为单位,如兆字节、千兆字节等)。CDm表示驻留在计算节点Cj上的可以归因于存储器Si的可寻址数据的量或大小。AccelBWDI表示在动态区域521被用于相应数据请求的情况下存储器 510的有效(例如,加速的)带宽,并且AccelBWDm表示相应计算节点105的有效带宽。变量g表示处理因子,所述处理因子是相应动态区域521的常数(有时称为重力或重力常数),并且与要由相应动态区域521针对给定数据请求执行的处理量成比例。因此,类似于重力,通过将SDl(例如,类比于存储器510的质量)乘以CDm(例如,类比于计算节点105的质量)来计算类似于重力,其中,两个物体的质量的乘积除以其间的径向距离,SDl 和CDm的乘积除以AccelBWDI的倒数乘以AccelBWDm的倒数的乘积。然后将结果乘以处理因子(g)。 [0051] 在图5的说明性示例中,存储器510A可以是具有归因于计算节点Cj的相应数据请求的数据SDl的大小的存储器Si。在该示例中,第一计算节点105A可以是其上存储具有数据CDm大小的计算节点Cj。存储器510A的有效带宽是AccelBWDI,并且第一计算节点105A的有效带宽是AccelBWDm。因此,存储器510A到第一计算节点105A由于动态区域521A而产生的重力指示符 可以使用上面的等式1来计算。可以以类似的方式计算存储器 510A与其他计算节点之间以及其他计算节点与存储器510B之间的重力指示符。 [0052] 重力可以朝向由存储器510(例如,分解式存储器节点)托管的单独区域(例如,地址)来表达。可以通过划分存储器510的地址空间并将数据请求源映射到单独区域来跟踪可寻址区域。也就是说,例如,将对给定数据的数据请求源映射到存储器510中数据被寻址的单独区域。当在整个历史或每单位时间内实现特定数量的请求时,可以确定计算节点与存储器510的给定区域之间由于对应于存储器510的动态区域521而产生的重力指示符。多个数据运算符可以服务于每个被寻址的区域,因此可以跟踪动态区域521的聚合重力指示符,以及每个数据运算符的单独重力。 [0053] 图6是根据本文公开的实施方式的将数据请求路由到分解式存储器节点的方法 600的示例流程图。方法600可以由计算节点(例如,图1的计算节点105)执行,用于确定将数据请求朝向哪个分解式存储器节点(例如,图1的存储器110)引导。如上所述,每个分解式存储器节点可以包括其中具有多个数据运算符(例如,数据运算符111)的对应的动态区域(例如,图1的动态区域121)。方法600包括使用如新鲜度指示符和重力指示符等使用指示符来管理用于执行与数据请求相关的数据操作的分解式存储器节点。在高水平下,方法600包括识别对于由计算节点向分解式存储器发出的数据请求具有最高重力的NMC,以及识别具有最高新鲜度的数据运算符。方法600基于所识别的NMC和用于竞争数据请求的数据运算符来管理分解式存储器。 [0054] 下面将参考单个分解式存储器节点和对应的NMC来描述方法600。然而,给定的计算节点可以并行或顺序地执行与分解式存储器的每个分解式存储器节点相关的类似方法。 [0055] 在框602处,由计算节点生成数据请求。例如,计算节点可以接收定义操作的一些输入,计算节点使用所述输入来确定多个数据操作,如数据请求操作和数据处理操作。可以将数据请求操作发给分解式存储器用于访问与操作相关的数据。在另一示例中,NMC可以用于对所请求的数据执行一些或全部数据处理操作。因此,在一些示例中,框602可以包括与数据请求操作一起或与数据请求操分开来确定数据处理操作。 [0056] 在框604处,方法600包括确定是否存在数据运算符。例如,框604包括确定数据运算符是否被加载到分解式存储器节点的NMC中。在此,计算节点确定数据运算符是否存在于NMC中并且可以用于执行与框602的数据请求相关的数据操作。如果没有数据运算符被加载到NMC中,则方法600继续进行到框606,在所述框中数据运算符被加载到NMC中。 [0057] 框604处的确定可以用若干种不同的方式来执行。例如,数据运算符可以在分解式存储器节点上进行操作,并且如果已知有可能的数据运算符被指派给分解式存储器节点并且其没有被加载到NMC中,则框604处的确定为否。作为另一示例,可以发出对数据运算符的显式调用,并且,如果所调用的数据运算符没有加载到NMC中,则将发出警报,并且框604处的确定将为否。作为又另一示例,如果特定请求的数据被加密,并且如果没有加载用于执行解密的数据运算符,则所述数据可能是不可访问的。在这种情况下,框604处的确定将为否。 这些只是一些示例,确定是否加载数据运算符的其他方式也是可能的。 [0058] 如果存在数据运算符,则方法600继续进行到框608以确定与框602的数据请求相关的数据是否被复制在分解式存储器节点上。例如,计算节点检查其中存在来自框604的数据运算符的分解式存储器节点是否已经缓存了与完成框602的数据请求相关的数据。在示例实施方式中,计算节点可以保存指示计算节点可以在哪里发出数据请求的数据表。因此,计算节点可以证实所指示的分解式存储器节点已经兑现了相关数据。如果相关数据未被复制,则方法600继续进行到框616以根据数据请求访问数据。 [0059] 如果计算节点确定该数据被复制,则方法继续进行到框610以确定在框604中识别的数据运算符是否是新鲜的。例如,计算节点确定多个数据运算符中的每个数据运算符的新鲜度指示符。如果来自框604的数据运算符在一定时间量内未使用或未以足够的频率使用,则方法继续进行到框612。例如,所述方法包括访问来自数据存储区611(例如,数据存储区112)的与每个数据运算符相关联的新鲜度指示符的排序,并检查来自框604的数据运算符是否具有最高新鲜度指示符。如果数据运算符的新鲜度指示符是排序中最高的,则方法 600继续进行到框614。否则,方法600继续进行到框612,并选择具有最高新鲜度的数据运算符。例如,框612可以包括用具有更高新鲜度指示符的数据运算符来替换出框604中识别的数据运算符。新鲜度指示符可以例如与框610并行地、与方法600并行地或在框602之前确定。 [0060] 在框614处,方法600包括选择具有最高重力指示符的分解式存储器节点。例如,使用上面的等式1,可以为框602的数据请求确定计算节点与每个分解式存储器节点之间由于对应于分解式存储器节点的NMC而产生的重力指示符。也就是说,可以使用缓存在每个分解式存储器节点处的与数据请求相关的数据量来确定每个节点的SDl。类似地,可以使用与计算节点处的数据请求相关的数据量来确定计算节点的CDm。可以使用由于每个NMC而产生的有效带宽来从每个分解式存储器节点的角度确定 并且从计算节点的角度确定 每个NMC的重力指示符可以在与每个NMC和分解式存储器节点相关联的数据存 储区613(例如,数据存储区112)中进行排序。计算节点访问数据存储区613并选择具有最高重力的分解式存储器。重力指示符可以例如与框614并行地、与方法600并行地或在框602之前确定。 [0061] 在框616处,在框610(或框612)中选择的加载到与在框614中选择的所选分解式存储器节点相关联的NMC上的数据运算符访问经复制数据,并根据来自框602的数据请求执行数据操作。在框618处,更新数据运算符的新鲜度指示符,并且更新NMC的重力指示符。例如,可以基于执行框616使用更新的变量来确定新鲜度指示符和重力指示符。更新的指示符然后可以被推送到数据存储区611和613以更新相应的指示符。 [0062] 以上描述和方法仅作为说明性示例而提供并且不旨在要求或暗示必须按照所呈现的顺序执行各种实施方式的操作。如本领域技术人员将理解的,说明性方法600中的操作顺序可以以任何顺序执行。例如,框608可以在框604之前、在框610和/或612之后等执行。作为另一示例,框614可以在框610和/或612之前或并行执行。如“此后”、“然后”、“下一个”等词语不旨在限制操作的顺序;这些词语只用作示例来引导读者阅读所述方法的说明。 [0063] 图7描绘了可以在其中实施本文描述的各种实施例的示例计算机系统700的框图。 计算机系统700可以是架构100或其任何部件的示例实施方式。计算机系统700包括总线702或用于传送信息的其他通信机制、与总线702耦接以用于处理信息的一个或多个硬件处理器704。(多个)硬件处理器704可以是例如一个或多个通用微处理器。 [0064] 计算机系统700还包括耦接到总线702的主存储器706(如随机存取存储器(RAM)、缓存和/或其他动态存储设备)以用于存储要由处理器704执行的信息和指令(例如,用于执行方法600的指令)。主存储器706还可以用于存储在执行要由处理器704执行的指令期间的临时变量或其他中间信息。这种指令当存储在处理器704可访问的存储介质中时使计算机系统700成为被自定义为执行指令中指定的操作的专用机器。 [0065] 计算机系统700进一步包括只读存储器(ROM)708或耦接到总线702以用于存储处理器704的静态信息和指令的其他静态存储设备。提供了如磁盘、光盘或USB拇指驱动器(闪存驱动器)等存储设备710并将其耦接到总线702,以用于存储信息和指令。 [0066] 计算机系统700可以经由总线702耦接到如液晶显示器(LCD)(或触摸屏)等显示器 712,以用于向计算机用户显示信息。包括字母数字键和其他键的输入设备714耦接到总线 702,以用于将信息和命令选择传送到处理器704。另一种类型的用户输入设备是如鼠标、轨迹球或光标方向键等光标控件716,以用于将方向信息和命令选择传送到处理器704并且用于控制在显示器712上的光标移动。在一些实施例中,与光标控件相同的方向信息和命令选择可以经由在没有光标的触摸屏上接收触摸来实施。 [0067] 计算系统700可以包括用于实施GUI的用户界面模块,所述GUI可以作为由(多个)计算设备执行的可执行软件代码被存储在大容量存储设备中。通过举例的方式,该模块和其他模块可以包括如软件部件、面向对象的软件部件、类部件和任务部件等部件、进程、函数、属性、程序、子例程、程序代码段、驱动器、固件、微代码、电路、数据、数据库、数据结构、表、数组和变量。 [0068] 通常,如本文所使用的词语“部件”、“引擎”、“系统”、“数据库”、“数据存储区”等可以是指在硬件或固件中实施的逻辑,或者是指以例如Java、C或C++等编程语言编写的、可能具有入口点和出口点的软件指令集合。软件部件可以被编译并链接到可执行程序中,被安装在动态链接库中,或者可以用例如BASIC、Perl或Python等解释性编程语言编写。应当理解的是,软件部件可以从其他部件或从其本身调用,和/或可以响应于检测到的事件或中断而被调用。被配置用于在计算设备上执行的软件部件可以被提供在如光盘、数字视频盘、闪存驱动器、磁盘、或任何其他有形介质等计算机可读介质上,或者可以被提供作为数字下载(并且可以原始地以需要在执行之前安装、解压缩或解密的压缩格式或可安装格式进行存储)。这样的软件代码可以部分或全部地存储在执行计算设备的存储器设备上,以用于由计算设备执行。软件指令可以嵌入在如EPROM等固件中。将进一步理解的是,硬件部件可以包括如门和触发器等连接逻辑单元,和/或可以包括如可编程门阵列或处理器等可编程单元。 [0069] 计算机系统700可以使用定制的硬接线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑来实施本文所描述的技术,所述逻辑与计算机系统相结合使计算机系统700成为专用机器或者将其编程为专用机器。根据一个实施例,本文的技术由计算机系统700响应于(多个)处理器704执行包含在主存储器706中的一个或多个指令的一个或多个序列来进行。 这种指令可以从如存储设备710等另一存储介质读取到主存储器706中。包含在主存储器 706中的指令序列的执行使(多个)处理器704执行本文所描述的过程步骤。在替代性实施例中,可以使用硬接线电路来代替软件指令或者与软件指令相结合。 [0070] 如本文所使用的术语“非暂态介质(non‑transitory media)”及类似术语是指存储使机器以特定方式操作的数据和/或指令的任何介质。这种非暂态介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,如存储设备710。易失性介质包括动态存储器,比如主存储器706。非暂态介质的常见形式包括例如软盘、软磁盘、硬盘、固态驱动器、磁带或者任何其他磁性数据存储介质、CD‑ROM、任何其他光学数据存储介质、具有孔图案的任何物理介质、RAM、PROM和EPROM、闪速EPROM、NVRAM、任何其他存储器芯片或盒、以及这些介质的联网版本。 [0071] 非暂态介质不同于传输介质但可以与传输介质结合使用。传输介质参与非暂态介质之间的信息传递。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线702的导线。 传输介质还可以采用声波或光波的形式,比如在无线电波和红外数据通信期间生成的那些声波或光波。 [0072] 计算机系统700还包括耦接到总线702的通信接口718。通信接口718提供耦接到一个或多个网络链路的双向数据通信,所述一个或多个网络链路连接到一个或多个本地网络。例如,通信接口718可以是综合业务数字网(ISDN)卡、电缆调制解调器、卫星调制解调器、或用于提供与对应类型电话线的数据通信连接的调制解调器。作为另一示例,通信接口 718可以是用于提供到兼容LAN(或与WAN通信的WAN部件)的数据通信连接的局域网(LAN)卡。还可以实施无线链路。在任何这种实施方式中,通信接口718发送和接收载送表示各种类型信息的数字数据流的电信号、电磁信号或光信号。 [0073] 网络链路通常提供通过一个或多个网络到其他数据设备的数据通信。例如,网络链路可以提供通过本地网络到主计算机或到由因特网服务提供商(ISP)操作的数据设备的连接。ISP进而通过现在通常被称为“因特网”的全球分组数据通信网络来提供数据通信服务。本地网络和因特网两者都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号以及网络链路上的信号和通过通信接口718的信号(其携带来往于计算机系统 700的数字数据)是传输介质的示例形式。 [0074] 计算机系统700可以通过(多个)网络、网络链路和通信接口718发送消息和接收数据,包括程序代码。在因特网示例中,服务器可以通过因特网、ISP、本地网络和通信接口718来传输应用程序的请求代码。接收到的代码可以在被接收到时由处理器704执行和/或存储在存储设备710或其他非易失性存储装置中以供稍后执行。 [0075] 在前面章节中描述的过程、方法和算法中的每一个均可以在由包括计算机硬件的一个或多个计算机系统或计算机处理器执行的代码部件中实施并且由这些代码部件全部或部分地进行自动化。该一个或多个计算机系统或计算机处理器还可以操作以支持“云计算”环境中相关操作的执行,或者作为“软件即服务(SaaS)”来操作。这些过程和算法可以在专用电路中部分地或全部地实施。上文所描述的各种特征和过程可以彼此独立地使用,或者可以以各种方式进行组合。不同的组合和子组合旨在落入本公开的范围内,并且在一些实施方式中可以省略某些方法框或过程框。本文所描述的方法和过程也不限于任何特定的顺序,并且与这些方法和过程相关的框或状态可以以适当的其他顺序执行、或者可以并行执行、或者以某种其他方式执行。可以向所公开的示例实施例添加框或状态或从中移除框或状态。可以将某些操作或过程的执行分发到计算机系统或计算机处理器之中,使其不是仅驻留在单一机器内,而是跨多个机器部署。 [0076] 如本文所使用的,电路可以利用任何形式的硬件、软件或其组合来实施。例如,可以实施一个或多个处理器、控制器、ASIC、PLA、PAL、CPLD、FPGA、逻辑部件、软件例程或其他机制以构成电路。在实施方式中,本文所描述的各种电路可以被实施为分立电路,或者所描述的功能和特征可以在一个或多个电路间部分地或全部地共享。尽管各种特征或功能元件可以作为单独的电路单个地描述或主张,但这些特征和功能也可以在一个或多个公共电路之中共享,并且这种描述不应要求或暗示需要单独的电路来实施这样的特征或功能。在使用软件来全部或部分地实施电路的情况下,这种软件可以被实施以便与能够执行关于该软件所描述的功能的计算系统或处理系统(如计算机系统700)一起操作。 [0077] 如本文所使用的,术语“或”可以以包括性或者排他性的意义来解释。此外,不应将对单数形式的资源、操作或结构的描述理解为排除复数。除非另有明确陈述,或者在如所使用的上下文内另有理解,否则条件语言(除其他外,比如“可以(can)”、“可能(could)”、“也许(might)”或“会(may)”)一般地旨在传达某些实施例包括而其他实施例不包括某些特征、要素和/或步骤。 [0078] 除非另外明确说明,否则本文档中使用的术语和短语及其变体应被解释为开放式的而不是限制性的。如“常规(conventional)”、“传统(traditional)”、“正常(normal)”、“标准(standard)”、“已知(known)”等形容词和类似含义的术语不应被解释为将所描述的项限制为给定时间段或在给定时间之前可用的项,而是应当被理解为涵盖可能现在或将来的任何时候都可用或已知的常规、传统、正常或标准技术。在一些情况下,宽泛词语和短语(比如“一个或多个”、“至少”、“但不限于”或其他相似的短语)的存在不应被理解为意指在此类宽泛短语可能不存在的情况下意图或要求更窄的情况。