一种远程堆管理方法及远程堆管理系统转让专利

申请号 : CN202210210746.X

文献号 : CN114745410B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 吴悠李林彭琳峰王冠骅

申请人 : 电子科技大学

摘要 :

本发明公开了一种远程堆管理方法及远程堆管理系统,应用于客户端,远程堆管理方法包括:从本地存储空间划分出日志区;接收对象数据的写入请求;将对象数据写入日志区;判断对象数据是否为更新数据,若是,将原对象数据在远程堆空间的存储段中对应的空间标记为空闲区域并将对象数据置于新的存储位置,其中,远程堆空间包括多个段,多个段包括存储段和空闲段;否则,判断日志区的存储空间是否等于额定空间,若是,将日志区中所有对象数据传输至日志区当前对应的空闲段中、清空日志区、标记当前对应的空闲段为存储段并选择下一个空闲段作为日志区的当前对应段之后重新接收对象数据的写入请求;否则,重新接收对象数据的写入请求。

权利要求 :

1.一种远程堆管理方法,其特征在于,应用于客户端,所述远程堆管理方法包括:S1:从本地存储空间划分出日志区;

S2:接收对象数据的写入请求;

S3:将所述对象数据写入所述日志区;

S4:判断所述对象数据是否为更新数据,若是,进入步骤S5;否则,进入步骤S6;

S5:将原对象数据在远程堆空间的存储段中对应的空间标记为空闲区域并将所述对象数据置于新的存储位置;其中,所述远程堆空间包括多个段,多个所述段包括存储段和空闲段,所述存储段包括存储区域和空闲区域;

S6:判断所述日志区的存储空间是否等于额定空间,若是,进入步骤S7;否则,返回步骤S2;

S7:将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中、清空所述日志区、标记所述当前对应的空闲段为存储段并选择下一个空闲段作为所述日志区的当前对应段,之后返回步骤S2;

所述步骤S5包括:

S51:根据所述对象数据的智能指针找到对象描述符,其中,所述智能指针为对象元数据的存储位置,所述对象数据包括所述对象元数据;

S52:根据所述对象描述符,获取对象锁;

S53:判断所述对象数据的本地地址是否为空指针,若是进入步骤S54,否则,进入步骤S510;

S54:判断所述对象数据的远程地址是否为空指针,若是,进入步骤S56;否则,进入步骤S55;

S55:将所述对象描述符从段描述符的对象元数据链表中移除,即将所述段描述符的有效数据量减去该对象描述符的数据量的大小,得到空闲区域的数据量大小;

S56:将所述对象数据追加到日志区;

S57:将对象描述符加入日志缓冲区对应段的段描述符对象元数据链表,并更新有效数据量;

S58:更新所述对象数据的本地地址指针,指向本次在日志区写入数据的位置;

S59:释放对象锁;

S510:判断所述对象数据是否处于缓存淘汰算法的链表中,若是,进入步骤S511;否则,进入步骤S513;

S511:释放所述对象数据的本地地址指向的缓存空间;

S512:将所述对象数据从所述缓存淘汰算法链表中移除,即将缓存使用量计数器减去该对象数据的大小并返回步骤S54;

S513:将所述对象数据写入所述对象数据本地地址指向的位置,即新的存储位置。

2.根据权利要求1所述的远程堆管理方法,其特征在于,多个所述段的存储空间大小和所述日志区的存储空间大小相等。

3.根据权利要求1所述的远程堆管理方法,其特征在于,所述步骤S7中,所述将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段之前,所述远程堆管理方法还包括:获取所述空闲段的空闲段链表的第一个节点;

获取所述第一个节点对应段的地址;

将所述第一个节点对应段的地址填入所述段描述符;

初始化所述段描述符的有效数据量和对象元数据链表头,得到新的段描述符,其中所述有效数据量初始化为零,所述对象元数据链表头初始化为空指针;

将所述新的段描述符加入所述客户端本地的空闲段链表,得到空闲段;

将所述空闲段作为与所述日志区当前对应的空闲段。

4.根据权利要求1所述的远程堆管理方法,其特征在于,所述远程堆管理方法还包括:读取所述对象数据;以及

整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域。

5.根据权利要求4所述的远程堆管理方法,其特征在于,所述读取所述对象数据包括:A1:根据智能指针找到对象描述符;

A2:根据所述对象描述符获取对象锁;

A3:判断所述对象数据的远程地址是否为空指针,若是,进入步骤A4;否则,进入步骤A6;

A4:将所述对象数据全部视为零,完成所述对象数据的接收后释放对象锁;

A5:判断所述对象数据的本地地址是否为空指针,若是,进入步骤A6,否则,进入步骤A7;

A6:将所述对象数据读入本地缓存,将所述对象描述符加入缓存淘汰算法的链表中,将所述对象数据的本地地址指向缓存并返回步骤A5;

A7:从所述对象数据的本地地址读取对象数据;

A8:判断所述对象是否处于缓存淘汰算法链表中,若是,进入步骤A9;否则,进入步骤A4;

A9:将所述对象数据移动到所述缓存淘汰算法链表的表头部后进入步骤A4。

6.根据权利要求4所述的远程堆管理方法,其特征在于,迁移位于所述存储区域的对象数据,所述回收所述存储段中的空闲区域包括:B1:获取多个所述段的当前情况;

B2:根据所述当前情况,生成对各所述段中的对象数据的迁移指令;

B3:接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域。

7.根据权利要求6所述的远程堆管理方法,其特征在于,所述步骤B2包括:B21:扫描与所述日志区对应的当前段的段描述符的对象元数据链表,并将所述当前段中对象数据的对象描述符的智能指针添加到临时列表A;

B22:判断所述当前段是否具有空闲区域,若是,进入步骤B23,否则,进入步骤B29,B23:确定所述当前段中的待迁移对象数据并在所述日志区中为所述待迁移对象数据分配空间;

B24:判断变量大小是否小于分配成功的空间大小且所述临时列表A不为空,若是,进入步骤B25,否则,进入步骤B28;

B25:获取所述临时列表A中的智能指针,以及其所对应的对象描述符;

B26:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B27,否则,返回步骤B24;

B27:为所述对象数据生成迁移指令,将所述智能指针添加到临时列表B,并累加计算变量,以更新所述变量后返回步骤B24;

B28:将所有迁移指令发往所述远程节点;

B29:将下一个存储段作为当前段并返回步骤B22。

8.根据权利要求7所述的远程堆管理方法,其特征在于,所述接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域包括:B31:判断所述临时列表B是否不为空,若是,进入步骤B32,否则,进入步骤B39;

B32:获取所述临时列表B中的智能指针;

B33:获取所述智能指针所对应的对象描述符;

B34:根据所述对象描述符,获取对象锁;

B35:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B36;否则,进入步骤B38;

B36:将所述对象描述符从所在的对象元数据链表中移除,加入迁移目的地址所在段的对象元数据链表;

B37:减小迁移源地址所在段的有效数据量,完成对空闲区域的回收,同时增大迁移目的地址所在段的有效数据量后进入步骤B38;

B38:释放所述对象锁;

B39:清空临时列表A;

B310:判断当前被整理的段的有效数据量是否为零,若是,进入步骤B311,否则,返回步骤B32;

B311:将对应的段描述符加入本地空闲段链表。

9.根据权利要求1所述的远程堆管理方法,其特征在于,其特征在于,应用于远程堆,所述远程堆管理方法包括:将所述远程堆的远程堆空间划分为多个段,其中,多个所述段包括存储段和空闲段;

提供空闲段与所述日志区相对应,即接收来自日志区的所有对象数据,以及配合所述日志区对所述对象数据的更新。

10.根据权利要求9所述的远程堆管理方法,其特征在于,所述远程堆管理方法还包括:初始化所述远程堆的远程堆空间;

当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;

接收所述客户端发送的迁移指令,根据所述迁移指令完成对待迁移对象的实际迁移工作,并在迁移完成之后向所述客户端发送响应。

11.根据权利要求10所述的远程堆管理方法,其特征在于,接收所述客户端发送的迁移指令,根据所述迁移指令完成对待迁移对象的实际迁移工作,并在迁移完成之后向所述客户端发送响应包括:C1:接收所述客户端发送的迁移指令,并将所述迁移指令保存在指令列表中;

C2:判断所述指令列表是否不为空,若是,进入步骤C3,否则,进入步骤C7;

C3:从所述指令列表中取出一条指令并进入步骤C4;

C4:判断迁移目的地址是否在本节点中,若在,进入步骤C5,否则,进入步骤C6;

C5:将所述对象数据拷贝到迁移目的地址后返回步骤C2;

C6:将所述对象数据写入迁移目的地址后返回步骤C2;

C7:迁移完成,向所述客户端发送响应。

12.一种基于权利要求1‑11中任意一项所述的远程堆管理方法的远程堆管理系统,其特征在于,所述远程堆管理系统包括:客户端,所述客户端包括第一段管理模块、对象元数据管理模块、日志区管理模块、缓存管理模块和第一内存整理模块;

所述第一段管理模块用于:为所述日志区分配空闲段;

所述对象元数据管理模块用于分配对象描述符,所述对象描述符用于存储所述对象数据的对象元数据,其中,所述对象描述符包括所述对象数据的大小、所述对象数据在远程堆和/或本地缓存和/或日志区中的地址、所述对象数据的引用计数和对象锁;

所述日志区管理模块用于:读取所述对象数据;将所述对象数据和/或更新数据写入所述日志区;在所述日志区的存储空间等于额定空间时,将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中并清空所述日志区;

所述缓存管理模块用于:对所述对象数据进行缓存管理,其中,所述缓存管理包括统计当前缓存量以及释放所述对象数据占据的缓存空间;

所述第一内存整理模块用于:整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域;以及远程堆,所述远程堆包括第二段管理模块和第二内存整理模块;

所述第二段管理模块用于:初始化所述远程堆的远程堆空间;当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;

所述第二内存整理模块用于:接收所述客户端发送的迁移指令,根据所述迁移指令完成对待迁移对象的实际迁移工作,并在迁移完成之后向所述客户端发送响应。

说明书 :

一种远程堆管理方法及远程堆管理系统

技术领域

[0001] 本发明涉及计算机技术领域,具体涉及一种远程堆管理方法及远程堆管理系统。

背景技术

[0002] 在云计算环境中,内存资源是竞争最激烈的资源。在Google和阿里巴巴的服务器集群中,平均内存利用率是60%,并且不同的节点内存利用率存在巨大的差异,相比之下,CPU的平均利用率则只有40%。除此之外,内存资源还是云计算环境中最难以扩展的资源。因为应用程序只能使用本机的内存,一旦本机内存耗尽,就必须强行关闭一些应用程序来释放内存资源。据统计,在Google的数据中心中,一个月内就有79万个应用程序因为内存不足而被强行关闭。由于集群内各个节点内存利用率的差异,此时还有许多节点有空闲内存,却无法被内存紧缺节点上的应用程序使用。
[0003] 应用程序只能使用本地内存还造成了另外一个问题,即计算资源和内存资源无法各自独立地扩展。一些计算密集型的程序,消耗的计算资源多,消耗的内存资源少,导致空闲的本地内存被浪费。另一些程序需要消耗大量内存资源,但本机内存资源的上限受主板的DIMM插槽数和内存条容量等硬件限制,无法进行扩展,限制了程序能处理的数据规模。
[0004] 近年来高速发展的NVM(node.js version management)存储技术具有高密度、大容量、可按字节寻址、访存延迟和传统DRAM内存相近等特性。因此用NVM替代DRAM(Remote Direct Memory Access)作为计算机系统的主存,可以提供更大的内存空间以及降低单位容量内存的成本。但NVM技术的引入,并不能解决计算资源和内存资源无法独立扩展的问题,反而让解决这个问题的需求变得更加紧迫。因为每台新增的服务器都可以搭载数十TB的NVM内存,远超出单台服务器承载的应用程序的需要。所以需要让这些空闲的NVM内存能被其它内存资源紧张的服务器有效利用。除此之外,使用NVM替代DRAM作为主存还需要考虑8 9
其寿命问题。NVM的使用寿命显著低于DRAM,其允许的最大擦写次数大概为10 ‑10 次,而
15
DRAM的最大擦写次数则大于10 次。因此,针对NVM的内存管理方案必须要考虑NVM易磨损的问题。
[0005] 为了解决内存资源紧张,扩展性差,节点间内存利用率不平衡等问题,必须能让应用程序有效利用集群内其它节点上的空闲内存,远程堆技术因此产生。远程堆的思想早在二十几年前就产生了。但因为受到当时的网络技术限制,网络传输延迟大概比内存访问延迟高三个数量级,所以在性能上不可接受。直到近几年,高带宽、低延迟的RDMA和InfiniBand等网络技术兴起,让远程堆变成了一个真正具备可行性的解决方案。
[0006] RDMA和InfiniBand技术能够让网络数据传输的带宽达到100Gb/s,已经和内存的带宽相仿,节点间往返延迟小于2us,和内存的访问延迟(几百纳秒)差距从三个数量级缩小到一个数量级。但也正是因为RDMA和InfiniBand技术的性能特点和编程模型与传统的基于套接字接口的TCP/IP协议栈有了非常大的区别,给远程堆的设计带来了一些新的问题和挑战。要想充分发挥它们的性能潜力,新的远程堆方案不能简单地用RDMA技术替换原有的基于TCP/IP方案的网络模块,而是需要围绕RDMA的特点来重新设计整个远程堆方案。
[0007] 总的来说,设计基于RDMA技术和NVM技术的远程堆方案,面临如下所述的三个挑战。
[0008] 第一,虽然RDMA的带宽和内存带宽相仿,但是访问延迟依然比内存访问延迟高出一个数量级。这就要求在向远程堆传输数据的时候,应该尽量使用大量、顺序传输的方式,避免使用随机的、小规模的传输,以最大化利用RDMA的高带宽,同时分摊单次传输的延迟。问题在于,在经典面向对象程序设计思想的指导下,由于对象的职责应该精简且单一,每个内存对象的大小不会太大。并且因为很多内存数据结构,例如哈希表等,其访问模式具有随机性,所以在使用过程中会产生很多随机的更新操作。由此可知,传统的内存管理方式和内存访问模式,与发挥RDMA性能优势的要求背道而驰。所以,新的远程堆方案,需要让内存管理方式和访问模式适应RDMA的性能特点。
[0009] 第二,网络传输延迟的降低使得通信双方的软件处理开销成为了一个性能瓶颈点。传统的远程堆方案中,客户机要存取远程堆中的对象时,需要与远程堆服务主机采用“请求——响应”的方式进行通信。这种方式下,通信双方都需要进行软件处理。客户机发送读写请求,远程堆服务主机解析请求,查询远程对象元数据,从接收缓冲区把数据拷贝到对象中,或是把对象拷贝到发送缓冲区,然后发送响应,客户机接收并解析响应,把对象数据从接收缓冲区拷贝到本地对象缓存中。这之中涉及许多步骤,甚至还需要进行对象数据的拷贝,产生了不小的软件开销。由此可见,远程堆的访存延迟不仅包括在网络中传输数据的延迟,还包括客户端与服务器处理数据的延迟。在传统的远程堆方案中,由于网络传输延迟是毫秒级,相比之下,微秒级的主机软件处理开销可以忽略。但现在RDMA技术使得网络传输延迟也下降到微秒级,软件开销就不能再被忽略了。恰好,RDMA read/write单边操作允许客户机直接存取远程堆服务主机的内存,整个过程无需远程堆服务主机上的服务程序进行感知和任何软件处理。因此,使用RDMA单边操作,理论上可以完全避免服务端的软件处理开销。但是这样的交互方式也打破了传统的“请求——响应”模型,导致基于此模型的传统远程堆方案难以有效利用RDMA单边操作。
[0010] 第三,NVM的最大擦写次数远小于DRAM,这就要求针对NVM的远程堆管理方案需要主动进行磨损均衡来延长NVM的寿命。磨损均衡指的是让写操作尽量在整个NVM空间中均匀分布而不是集中在少数热点区域。但是在许多传统的DRAM远程堆方案中,对象在堆中的位置是固定的,因此对同一个对象的每次更新都会在相同的地址进行写操作,这就导致了写操作的集中,不利于进行磨损均衡。
[0011] 目前的远程堆方案中,第一类是以FastSwap为代表的,基于页面交换机制的方案。当前操作系统的虚拟内存子系统会把较少被访问的内存页面中的数据保存到磁盘中,然后回收对应的内存空间。等到这些数据下次被访问时,再分配新的内存空间,并从磁盘中读入之前保存的数据。而基于页面交换机制的远程堆,原理与之非常相似,只不过是用远端内存替换了磁盘。此类方案的一个问题是软件开销过大。访问一个不在本地内存中的页面时,会触发缺页异常,然后进入操作系统虚拟内存子系统的复杂处理流程中。缺页异常的触发,虚拟内存子系统的处理,以及异常处理返回时可能发生的进程调度,都是十分耗时的,总开销高达十几微秒。第二个问题是此方案存在较为严重的读写放大效应。因为页面大小固定,且至少为4KB。所以每当访问一个不在本地内存中的页面时,即使只需要访问1个字节的数据,也必须将整个4KB的页面读入。同样地,每当一个页面需要被换出到远端内存时,即使该页面的数据只有1个字节被更新,也需要向远端传输整个页面。写放大效应不仅会导致传输带宽的浪费,增加传输延迟,还会对NVM的使用寿命造成不利影响。
[0012] 第二类方案以AIFM为代表,不再使用页面交换机制,而是以对象为粒度来管理数据在本地内存和远端内存中的移动。此类方案不再依靠虚拟内存子系统和CPU产生的缺页异常来判断对象是否位于本地内存,而是使用软件定义的“远程对象指针”来判断对象在本地内存还是远程堆,并为本地和远程对象提供统一的访问接口。此类方案避免了客户端的缺页异常和虚拟内存子系统的处理开销,并且改善了第一类方案中的读写放大问题。但此类方案同样存在两个较为明显的问题。第一,在将本地对象迁移到远程堆时,会产生大量随机的小规模数据传输,不利于充分发挥RDMA的性能优势。第二,此类方案依然使用“请求——响应”的方式与远程堆交互,没能减轻服务端的软件处理开销。
[0013] 第三类方案以AsymNVM为代表,通过批量传输对象来避免随机的小规模数据传输。此类方案在需要将一个对象传输到远程堆时,不是直接传输,而是在本地日志区中创建一条日志。日志记录了对象的ID和对象的数据。等到日志数据量积累到一定的阈值后,再通过一次数据传输操作将日志顺序传输到远程堆服务主机。远程堆服务主机收到日志后,根据日志更新远程堆中的对象数据,然后返回响应。此类方案通过累积日志,批量传输的方式,改善了RDMA网络传输效率,但同样使用了“请求——响应”模型,未能消除服务端的软件处理开销。并且此类方案将对象保存在远程堆中的固定位置,导致写操作集中于部分热点区域,不利于进行磨损均衡延迟NVM寿命。
[0014] 由此可见,目前尚没有一种远程堆方案,既能避免更新对象时产生大量随机小规模数据传输,又能消除远程堆服务主机的软件处理开销,同时还考虑了磨损均衡问题,使写操作在NVM上尽量均匀分布。
[0015] 目前的远程堆方案,普遍存在向远程堆写回对象时RDMA性能利用不充分,以及远程堆服务程序软件处理开销和数据拷贝开销较大的问题。

发明内容

[0016] 本发明的目的在于提供一种远程堆管理方法及远程堆管理系统,以解决现有的远程堆管理普遍存在向远程堆写回对象时RDMA性能利用不充分,以及远程堆服务程序软件处理开销和数据拷贝开销较大的问题。
[0017] 本发明解决上述技术问题的技术方案如下:
[0018] 本发明提供一种远程堆管理方法,应用于客户端,所述远程堆管理方法包括:
[0019] S1:从本地存储空间划分出日志区;
[0020] S2:接收对象数据的写入请求;
[0021] S3:将所述对象数据写入所述日志区;
[0022] S4:判断所述对象数据是否为更新数据,若是,进入步骤S5;否则,进入步骤S6;
[0023] S5:将原对象数据在远程堆空间的存储段中对应的空间标记为空闲区域并将所述对象数据置于新的存储位置;其中,所述远程堆空间包括多个段,多个所述段包括存储段和空闲段,所述存储段包括存储区域和空闲区域;
[0024] S6:判断所述日志区的存储空间是否等于额定空间,若是,进入步骤S7;否则,返回步骤S2;
[0025] S7:将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中、清空所述日志区、标记所述当前对应的空闲段为存储段并选择下一个空闲段作为所述日志区的当前对应段,之后返回步骤S2。
[0026] 可选择地,多个所述段的存储空间大小和所述日志区的存储空间大小相等。
[0027] 可选择地,所述步骤S5包括:
[0028] S51:根据所述对象数据的智能指针找到对象描述符,其中,所述智能指针为对象元数据的存储位置,所述对象数据包括所述对象元数据;
[0029] S52:根据所述对象描述符,获取对象锁;
[0030] S53:判断所述对象数据的本地地址是否为空指针,若是进入步骤S54,否则,进入步骤S510;
[0031] S54:判断所述对象数据的远程地址是否为空指针,若是,进入步骤S56;否则,进入步骤S55;
[0032] S55:将所述对象描述符从段描述符的对象元数据链表中移除,即将所述段描述符的有效数据量减去该对象描述符的数据量的大小,得到空闲区域的数据量大小;
[0033] S56:将所述对象数据追加到日志区;
[0034] S57:将对象描述符加入日志缓冲区对应段的段描述符对象元数据链表,并更新有效数据量;
[0035] S58:更新所述对象数据的本地地址指针,指向本次在日志区写入数据的位置;
[0036] S59:释放对象锁,以将所述对象数据写入所述日志区中;
[0037] S510:判断所述对象数据是否处于缓存淘汰算法的链表中,若是,进入步骤S511;否则,进入步骤S513;
[0038] S511:释放所述对象数据的本地地址指向的缓存空间;
[0039] S512:将所述对象数据从所述缓存淘汰算法链表中移除,即将缓存使用量计数器减去该对象数据的大小并返回步骤S54;
[0040] S513:将所述对象数据写入所述对象数据本地地址指向的位置,即新的存储位置。
[0041] 可选择地,所述步骤S7中,所述将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段之前,所述远程堆管理方法还包括:
[0042] 获取所述空闲段的空闲段链表的第一个节点;
[0043] 获取所述第一个节点对应段的地址;
[0044] 将所述第一个节点对应段的地址填入所述段描述符;
[0045] 初始化所述段描述符的有效数据量和对象元数据链表头,得到新的段描述符,其中所述有效数据量初始化为零,所述对象元数据链表头初始化为空指针;
[0046] 将所述新的段描述符加入所述客户端本地的空闲段链表,得到空闲段;
[0047] 将所述空闲段作为与所述日志区当前对应的空闲段。
[0048] 可选择地,所述远程堆管理方法还包括:读取所述对象数据;以及整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域。
[0049] 可选择地,所述读取所述对象数据包括:
[0050] A1:根据智能指针(对象元数据的存储位置)找到对象描述符;
[0051] A2:根据所述对象描述符获取对象锁(防止一个对象同事发生多个操作);
[0052] A3:判断所述对象数据的远程地址是否为空指针,若是,进入步骤A4;否则,进入步骤A6;
[0053] A4:将所述对象数据全部视为零,完成所述对象数据的接收后释放对象锁;
[0054] A5:判断所述对象数据的本地地址是否为空指针,若是,进入步骤A6,否则,进入步骤A7;
[0055] A6:将所述对象数据读入本地缓存,将所述对象描述符加入缓存淘汰算法的链表中,将所述对象数据的本地地址指向缓存并返回步骤A5(将本地地址的值设置为对象在本地缓存中的存储位置);
[0056] A7:从所述对象数据的本地地址读取对象数据;;
[0057] A8:判断所述对象是否处于缓存淘汰算法链表中,若是,进入步骤A9;否则,进入步骤A4;
[0058] A9:将所述对象数据移动到所述缓存淘汰算法链表的表头部后进入步骤A4。
[0059] 可选择地,迁移位于所述存储区域的对象数据,所述回收所述存储段中的空闲区域包括:
[0060] B1:获取多个所述段的当前情况;
[0061] B2:根据所述当前情况,生成对各所述段中的对象数据的迁移指令;
[0062] B3:接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域。
[0063] 可选择地,所述步骤B2包括:
[0064] B21:扫描与所述日志区对应的当前段的段描述符的对象元数据链表,并将所述当前段中对象数据的对象描述符的智能指针添加到临时列表A;
[0065] B22:判断所述当前段是否具有空闲区域,若是,进入步骤B23,否则,进入步骤B29,[0066] B23:确定所述当前段中的待迁移对象数据并在所述日志区中为所述待迁移对象数据分配空间;
[0067] B24:判断变量大小是否小于分配成功的空间大小且所述临时列表A不为空,若是,进入步骤B25,否则,进入步骤B28;
[0068] B25:获取所述临时列表A中的智能指针,以及其所对应的对象描述符;
[0069] B26:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B27,否则,返回步骤B24;
[0070] B27:为所述对象数据生成迁移指令,将所述智能指针添加到临时列表B,并累加计算变量,以更新所述变量后返回步骤B24;
[0071] B28:将所有迁移指令发往所述远程节点;
[0072] B29:将下一个存储段作为当前段并返回步骤B22。
[0073] 可选择地,所述接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域包括:
[0074] B31:判断所述临时列表B是否不为空,若是,进入步骤B32,否则,进入步骤B39;
[0075] B32:获取所述临时列表B中的智能指针;
[0076] B33:获取所述智能指针所对应的对象描述符;
[0077] B34:根据所述对象描述符,获取对象锁;
[0078] B35:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B36;否则,进入步骤B38;
[0079] B36:将所述对象描述符从所在的对象元数据链表中移除,加入迁移目的地址所在段的对象元数据链表;
[0080] B37:减小迁移源地址所在段的有效数据量,完成对空闲区域的回收,同时增大迁移目的地址所在段的有效数据量后进入步骤B38;
[0081] B38:释放所述对象锁;
[0082] B39:清空临时列表A;
[0083] B310:判断当前被整理的段的有效数据量是否为零,若是,进入步骤B311,否则,返回步骤B32;
[0084] B311:将对应的段描述符加入本地空闲段链表。
[0085] 本发明还提供一种远程堆管理方法,应用于远程堆,所述远程堆管理方法包括:将所述远程堆的远程堆空间划分为多个段,其中,多个所述段包括存储段和空闲段;提供空闲段与所述日志区相对应,即接收来自日志区的所有对象数据,以及配合所述日志区对所述对象数据的更新。
[0086] 可选择地,所述远程堆管理方法还包括:当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;接收所述客户端发送的迁移指令,根据所述迁移指令拷贝所述对象数据以进行迁移操作,并在迁移完成之后向所述客户端发送响应。
[0087] 可选择地,所述接收所述客户端发送的迁移指令,根据所述迁移指令对拷贝对象进行迁移操作,并在迁移完成之后向所述客户端发送响应包括:
[0088] C1:接收所述客户端发送的迁移指令,并将所述迁移指令保存在指令列表中;
[0089] C2:判断所述指令列表是否不为空,若是,进入步骤C3,否则,进入步骤C7;
[0090] C3:从所述指令列表中取出一条指令并进入步骤C4;
[0091] C4:判断迁移目的地址是否在本节点中,若在,进入步骤C5,否则,进入步骤C6;
[0092] C5:将所述对象数据拷贝到迁移目的地址后返回步骤C2;
[0093] C6:将所述对象数据写入迁移目的地址后返回步骤C2;
[0094] C7:迁移完成,向所述客户端发送响应。
[0095] 本发明还提供一种基于上述的远程堆管理方法的远程堆管理系统,所述远程堆管理系统包括:
[0096] 客户端,所述客户端包括第一段管理模块、对象元数据管理模块、日志区管理模块、缓存管理模块和第一内存整理模块;
[0097] 所述第一段管理模块用于:为所述日志区分配空闲段;
[0098] 所述对象元数据管理模块用于分配对象描述符,所述对象描述符用于存储所述对象数据的对象元数据,其中,所述对象描述符包括所述对象数据的大小、所述对象数据在远程堆和/或本地缓存和/或日志区中的地址、所述对象数据的引用计数和对象锁;
[0099] 所述日志区管理模块用于:读取所述对象数据;将所述对象数据和/或更新数据写入所述日志区;在所述日志区的存储空间等于额定空间时,将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中并清空所述日志区;
[0100] 所述缓存管理模块用于:对所述对象数据进行缓存管理,其中,所述缓存管理包括统计当前缓存量以及释放所述对象数据占据的缓存空间;
[0101] 所述第一内存整理模块用于:整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域;以及
[0102] 远程堆,所述远程堆包括第二段管理模块和第二内存整理模块;
[0103] 所述第二段管理模块用于:初始化所述远程堆的远程堆空间;当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;
[0104] 所述第二内存整理模块用于:接收所述客户端发送的迁移指令,根据所述迁移指令完成对待迁移对象的实际迁移工作,并在迁移完成之后向所述客户端发送响应。
[0105] 本发明具有以下有益效果:
[0106] 1、本发明在向远程堆写回对象时,不存在随机小规模数据传输,能够充分发挥RDMA传输大量连续数据的性能优势;
[0107] 2、对象的分配、释放、读入和写回操作全部由客户端独自完成,不需要远程节点参与任何处理,没有任何服务端软件处理开销;
[0108] 3、日志结构的远程堆管理方式有很好的磨损均衡效果;
[0109] 4、对象写回操作不产生任何数据拷贝开销;
[0110] 5、日志中除了对象数据之外,不包含任何额外信息,避免了对内存和网络资源的浪费。

附图说明

[0111] 图1为本发明所提供的远程堆管理方法应用于客户端的流程图;
[0112] 图2为本发明所提供的远程堆管理方法的写对象的结构示意图;
[0113] 图3为本发明所提供的远程堆管理方法的日志区的存储空间等于额定空间的结构示意图;
[0114] 图4为本发明所提供的远程堆管理方法的更新对象数据的结构示意图;
[0115] 图5为图1中步骤S5的分步骤流程图;
[0116] 图6为第一段管理模块的结构示意图;
[0117] 图7为读取对象数据的流程图;
[0118] 图8为更新对象数据的流程图;
[0119] 图9为图8中步骤B2的分步骤流程图;
[0120] 图10为图8中步骤B3的分步骤流程图;
[0121] 图11为应用于远程堆的更新对象数据的流程图;
[0122] 图12为对象元数据管理模块的结构示意图;
[0123] 图13为日志区管理模块的结构示意图;
[0124] 图14为第二段管理模块的结构示意图;
[0125] 图15为整理包括空闲区域的存储段的结构示意图。

具体实施方式

[0126] 以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0127] 实施例1
[0128] 本发明提供一种远程堆管理方法,应用于客户端,参考图1所示,所述远程堆管理方法包括:
[0129] S1:从本地存储空间划分出日志区;
[0130] 由于在本发明中,首先将远程堆的远程堆空间划分为若干固定大小的段,每个段的长度为1GB,因此,为了让远程堆与客户端相对应,客户端本地内存空间中,也会划分出1GB的空间作为日志区,并且从自己所管理的远程堆空间的段中,选择一个空闲段,作为日志区对应的段。当然,本领域技术人员可以选择为其他容量的存储空间,本发明不做具体限制,以实现多个所述段的存储空间大小和所述日志区的存储空间大小相等即可。
[0131] S2:接收对象数据的写入请求;
[0132] S3:将所述对象数据写入所述日志区;
[0133] S4:判断所述对象数据是否为更新数据,若是,进入步骤S5;否则,进入步骤S6;
[0134] S5:将原对象数据在远程堆空间的存储段中对应的空间标记为空闲区域并将所述对象数据置于新的存储位置;其中,所述远程堆空间包括多个段,多个所述段包括存储段和空闲段,所述存储段包括存储区域和空闲区域;
[0135] 这里,所有的对象数据的更新操作,都是把新的对象数据顺序写入日志区,然后修改客户端本地内存中的对象元数据和段管理元数据,标记旧对象数据所占据的空间为空闲区域。
[0136] S6:判断所述日志区的存储空间是否等于额定空间,若是,进入步骤S7;否则,返回步骤S2;
[0137] 等到本地日志区写满后,通过一次RDMA write操作把整个日志区的数据写入日志区对应的段中。然后再为日志区选择一个新的空闲段与之对应。
[0138] S7:将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中、清空所述日志区、标记所述当前对应的空闲段为存储段并选择下一个空闲段作为所述日志区的当前对应段,之后返回步骤S2。具体参考图2至图4。
[0139] 可选择地,参考图5所示,所述步骤S5包括:
[0140] S51:根据所述对象数据的智能指针找到对象描述符,其中,所述智能指针为对象元数据的存储位置,所述对象数据包括所述对象元数据;
[0141] S52:根据所述对象描述符,获取对象锁;
[0142] S53:判断所述对象数据的本地地址是否为空指针,若是进入步骤S54,否则,进入步骤S510;
[0143] S54:判断所述对象数据的远程地址是否为空指针,若是,进入步骤S56;否则,进入步骤S55;
[0144] S55:将所述对象描述符从段描述符的对象元数据链表中移除,即将所述段描述符的有效数据量减去该对象描述符的数据量的大小,得到空闲区域的数据量大小;
[0145] S56:将所述对象数据追加到日志区;
[0146] S57:将对象描述符加入日志缓冲区对应段的段描述符对象元数据链表,并更新有效数据量;
[0147] S58:更新所述对象数据的本地地址指针,指向本次在日志区写入数据的位置;
[0148] S59:释放对象锁,以将所述对象数据写入所述日志区中;
[0149] S510:判断所述对象数据是否处于缓存淘汰算法的链表中,若是,进入步骤S511;否则,进入步骤S5;
[0150] S511:释放所述对象数据的本地地址指向的缓存空间;
[0151] S512:将所述对象数据从所述缓存淘汰算法链表中移除,即将缓存使用量计数器减去该对象数据的大小并返回步骤S54;
[0152] S513:将所述对象数据写入所述对象数据本地地址指向的位置,即新的存储位置。
[0153] 可选择地,所述步骤S7中,所述将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段之前,所述远程堆管理方法还包括:
[0154] 获取所述空闲段的空闲段链表的第一个节点;
[0155] 获取所述第一个节点对应段的地址;
[0156] 将所述第一个节点对应段的地址填入所述段描述符;
[0157] 初始化所述段描述符的有效数据量和对象元数据链表头,得到新的段描述符,其中所述有效数据量初始化为零,所述对象元数据链表头初始化为空指针;
[0158] 将所述新的段描述符加入所述客户端本地的空闲段链表,得到空闲段;
[0159] 将所述空闲段作为与所述日志区当前对应的空闲段。
[0160] 这里,参考图6所示,在客户端侧,第一段管理模块为每个从远程堆分配的段分配一个段描述符,还维护了两条链表,一条是空闲段链表,一条是使用中的段链表。段描述符被插入这两条链表其中之一。段描述符中记录了该段对应的远程节点,以及远程节点内存地址,还记录了该段内存储的有效对象数据数量,以及一个对象元数据链表头,链接该段内存放的所有对象对应的对象描述符。
[0161] 客户端的段管理模块,需要负责为日志区分配空闲段。当空闲段不足,且使用的远程堆资源未超过限制时,段管理模块会通过RDMA CAS操作摘取远程节点内的空闲段链表的第一个节点(记为节点A),分配一个新的空闲段。同时在本地构造一个新的段描述符,根据节点A在数组中的下标得到其对应的段地址,填入新分配空闲段的地址信息,并将段内有效数据数量初始化为0,把段内对象元数据链表头初始化为空指针,然后加入本地的空闲段链表中。然后客户端的段管理模块需要通过一次RDMA write操作将自己的客户端ID写入节点A。
[0162] 为了防止客户端在摘下远程节点空闲段链表上的节点A后,向节点A写入客户端ID前,发生故障,或是网络长时间中断,造成对应的段得不到回收,发生远程堆资源泄漏,远程节点会定期扫描节点A所在的整个数组,以及空闲段链表,找出那些既不在链表中,又没有填写有效客户ID的数组项。若找到这样的数组项,在等待一定的时间后,若数组项还未被填入客户ID或是重新加入链表,则远程节点上的段管理模块会将它们重新加入空闲段链表。
[0163] 可选择地,所述远程堆管理方法还包括:
[0164] 读取所述对象数据;
[0165] 以及整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域。
[0166] 可选择地,参考图7所示,所述读取所述对象数据包括:
[0167] A1:根据智能指针找到对象描述符;其中,智能指针即为对象元数据的存储位置。
[0168] A2:根据所述对象描述符获取对象锁;这里,对象锁存在的目的即为防止一个对象同时发生多个操作。
[0169] A3:判断所述对象数据的远程地址是否为空指针,若是,进入步骤A4;否则,进入步骤A6;
[0170] A4:将所述对象数据全部视为零,完成所述对象数据的接收后释放对象锁;
[0171] A5:判断所述对象数据的本地地址是否为空指针,若是,进入步骤A6,否则,进入步骤A7;
[0172] A6:将所述对象数据读入本地缓存,将所述对象描述符加入缓存淘汰算法的链表中,将所述对象数据的本地地址指向缓存并返回步骤A5;这里,指向缓存即为将本地地址的值设置为对象在本地缓存中的存储位置。
[0173] A7:从所述对象数据的本地地址读取对象数据;
[0174] A8:判断所述对象数据是否处于缓存淘汰算法链表中,若是,进入步骤A9;否则,进入步骤A4;
[0175] A9:将所述对象数据移动到所述缓存淘汰算法链表的表头部后进入步骤A4。
[0176] 可选择地,参考图8所示,迁移位于所述存储区域的对象数据,所述回收所述存储段中的空闲区域包括:
[0177] B1:获取多个所述段的当前情况;
[0178] B2:根据所述当前情况,生成对各所述段中的对象数据的迁移指令;
[0179] B3:接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域。
[0180] 可选择地,参考图9所示,所述步骤B2包括:
[0181] B21:扫描与所述日志区对应的当前段的段描述符的对象元数据链表,并将所述当前段中对象数据的对象描述符的智能指针添加到临时列表A;
[0182] B22:判断所述当前段是否具有空闲区域,若是,进入步骤B23,否则,进入步骤B29,[0183] B23:确定所述当前段中的待迁移对象数据并在所述日志区中为所述待迁移对象数据分配空间;
[0184] B24:判断变量大小是否小于分配成功的空间大小且所述临时列表A不为空,若是,进入步骤B25,否则,进入步骤B28;
[0185] B25:获取所述临时列表A中的智能指针,以及其所对应的对象描述符;
[0186] B26:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B27,否则,返回步骤B24;
[0187] B27:为所述对象数据生成迁移指令,将所述智能指针添加到临时列表B,并累加计算变量,以更新所述变量后返回步骤B24;
[0188] B28:将所有迁移指令发往所述远程节点;
[0189] B29:将下一个存储段作为当前段并返回步骤B22。
[0190] 可选择地,参考图10所示,所述接收远程堆的迁移完成响应,并根据所述迁移完成响应回收所述存储段中的空闲区域包括:
[0191] B31:判断所述临时列表B是否不为空,若是,进入步骤B32,否则,进入步骤B39;
[0192] B32:获取所述临时列表B中的智能指针;
[0193] B33:获取所述智能指针所对应的对象描述符;
[0194] B34:根据所述对象描述符,获取对象锁;
[0195] B35:判断是否满足所述对象描述符中记录的引用计数不为1且所述对象数据仍在所述当前段内,若满足,进入步骤B36;否则,进入步骤B38;
[0196] B36:将所述对象描述符从所在的对象元数据链表中移除,加入迁移目的地址所在段的对象元数据链表;
[0197] B37:减小迁移源地址所在段的有效数据量,完成对空闲区域的回收,同时增大迁移目的地址所在段的有效数据量后进入步骤B38;
[0198] B38:释放所述对象锁;
[0199] B39:清空临时列表A;
[0200] B310:判断当前被整理的段的有效数据量是否为零,若是,进入步骤B311,否则,返回步骤B32;
[0201] B311:将对应的段描述符加入本地空闲段链表。
[0202] 本发明还提供一种远程堆管理方法,应用于远程堆,所述远程堆管理方法包括:将所述远程堆的远程堆空间划分为多个段,其中,多个所述段包括存储段和空闲段;
[0203] 远程堆空间被以段为单位分配给各个客户端进行管理。一个客户端可能管理多个远程节点中的多个段,而每个段只会属于一个客户端。
[0204] 提供空闲段与所述日志区相对应,即接收来自日志区的所有对象数据,以及配合所述日志区对所述对象数据的更新。
[0205] 可选择地,所述远程堆管理方法还包括:当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;接收所述客户端发送的迁移指令,根据所述迁移指令拷贝所述对象数据以进行迁移操作,并在迁移完成之后向所述客户端发送响应。
[0206] 可选择地,参考图11所示,所述接收所述客户端发送的迁移指令,根据所述迁移指令对拷贝对象进行迁移操作,并在迁移完成之后向所述客户端发送响应包括:
[0207] C1:接收所述客户端发送的迁移指令,并将所述迁移指令保存在指令列表中;
[0208] C2:判断所述指令列表是否不为空,若是,进入步骤C3,否则,进入步骤C7;
[0209] C3:从所述指令列表中取出一条指令并进入步骤C4;
[0210] C4:判断迁移目的地址是否在本节点中,若在,进入步骤C5,否则,进入步骤C6;
[0211] C5:将所述对象数据拷贝到迁移目的地址后返回步骤C2;
[0212] C6:将所述对象数据写入迁移目的地址后返回步骤C2;
[0213] C7:迁移完成,向所述客户端发送响应。
[0214] 本发明还提供一种基于上述的远程堆管理方法的远程堆管理系统,所述远程堆管理系统包括:
[0215] 客户端,所述客户端包括第一段管理模块、对象元数据管理模块、日志区管理模块、缓存管理模块和第一内存整理模块;
[0216] 所述第一段管理模块用于:为所述日志区分配空闲段;
[0217] 具体地,第一段管理模块为每个从远程堆分配的段分配一个段描述符,还维护了两条链表,一条是空闲段链表,一条是使用中的段链表。段描述符被插入这两条链表其中之一。段描述符中记录了该段对应的远程节点,以及远程节点内存地址,还记录了该段内存储的有效对象数据数量,以及一个对象元数据链表头,链接该段内存放的所有对象对应的对象描述符。
[0218] 所述对象元数据管理模块用于分配对象描述符,所述对象描述符用于存储所述对象数据的对象元数据,其中,所述对象描述符包括所述对象数据的大小、所述对象数据在远程堆和/或本地缓存和/或日志区中的地址、所述对象数据的引用计数和对象锁;
[0219] 具体地,如图12所示,其内部维护了若干内存池,用于分配对象描述符。这些内存池被一条可用内存池链表组织起来。内存池的第一个元素用于存储内存池的元数据信息,包括空闲元素数目,分配位图,以及指向下一个可用内存池的指针。每个内存池大小为4KB,并且起始地址是4KB的整数倍。当释放一个对象描述符时,直接将其地址向下对齐到4KB的整数倍,即可找到对应的内存池元数据。对象描述符负责存储一个对象的元数据信息,包括该对象的大小,该对象在远程堆中的地址,该对象在本地缓存或是日志区中的地址,该对象的引用计数,对象锁,以及两组next和prev指针。对象锁用于保证多线程访问同一个对象的安全性。两组next和prev指针用于把该对象描述符挂入段描述符的对象元数据链表和缓存管理模块的LRU链表中。
[0220] 当需要分配一个对象时,仅仅是由对象元数据管理模块从内存池中分配一个对象描述符,并填入对象的大小,把引用计数设置为1,把对象的本地地址和远程堆地址都设置为nullptr,然后返回给用户一个指向该对象描述符的智能指针。用户对该对象的所有操作,都需要通过智能指针进行。
[0221] 当对象的引用计数变为0时,该对象按照如下步骤被释放。第一步,根据智能指针找到对象描述符。第二步,从对象描述符中获取对象大小,如果对象在本地缓存中的话(根据对象描述符中用于加入缓存管理模块LRU链表的next和prev指针判断),将对象描述符从缓存管理模块的LRU链表中移除,并将本地缓存数据量减去对象的大小。第三步,如果对象在段描述符的对象元数据链表中(根据对象描述符中的远程地址是否为nullptr确定),将对象描述符从链表中移除,并将段描述符中的有效对象数据量减去该对象的大小。第四步,将该对象描述符重新放入内存池中。
[0222] 可以发现,对象的分配和释放操作都不涉及任何和远程节点的交互或者网络通信操作,完全在本地内存中进行。
[0223] 所述日志区管理模块用于:读取所述对象数据;将所述对象数据和/或更新数据写入所述日志区;在所述日志区的存储空间等于额定空间时,将所述日志区中所有对象数据传输至所述日志区当前对应的空闲段中并清空所述日志区;
[0224] 具体地,如图13所示,它在本地内存中开辟了一块大小为1GB的日志缓冲区,并维护了三个指针:log_start,log_tail,remote_log_segment。分别指向日志缓冲区的起始位置,当前日志尾部,以及日志缓冲区目前对应的远程堆中的段。当更新对象时,需要把新的对象数据写入日志区。此时,日志区管理模块直接把新的对象数据写入log_tail指向的位置,然后把log_tail指针加上该对象的大小,作为新的log_tail。如果日志缓冲区剩余的空间不足,则日志区管理模块会使用RDMA write操作将整个1GB大小的日志缓冲区一次性地写回remote_log_segment指针指向的段中,然后使用段管理模块分配一个新的空闲段,将段地址记录在remote_log_segment中,并将log_tail重新指向log_start。
[0225] 所述缓存管理模块用于:对所述对象数据进行缓存管理,其中,所述缓存管理包括统计当前缓存量以及释放所述对象数据占据的缓存空间;
[0226] 具体地,使用LRU(最近最少用)策略来管理本地缓存。其内部维护了一根LRU链表,链表中是所有位于本地缓存中的对象对应的对象描述符。当某个对象被访问时,其对应的对象描述符被移动到LRU链表头部。缓存管理模块内部还维护了一个计数器,统计当前缓存的使用量。每当一个对象被加入缓存,该计数器的值就会加上该对象的大小。当缓存使用量占最大允许的缓存总量的比例达到一定阈值之后,缓存管理模块就开始选择LRU链表尾部的对象进行淘汰。淘汰对象时,缓存管理模块会将对象对应的对象描述符从LRU链表中移除,将对象描述符中的本地内存指针设置为nullptr,将当前缓存使用量计数器减去对象的大小,并释放对象占据的缓存空间。缓存管理模块使用定制化的传统本地堆管理工具,如jemalloc,tcmalloc等,管理本地缓存空间。定制化主要体现为,在这些堆管理工具调用mmap函数向操作系统申请内存时,加入了锁定内存和进行RDMA内存注册的代码,以确保本地缓存所使用的内存可以用于RDMA操作。
[0227] 所述第一内存整理模块用于:整理多个所述段,包括:迁移位于所述存储区域的对象数据,回收所述存储段中的空闲区域;以及
[0228] 远程堆,所述远程堆包括第二段管理模块和第二内存整理模块;
[0229] 所述第二段管理模块用于:参考图14所示,初始化所述远程堆的远程堆空间;当客户端掉线或发生故障时,回收与所述日志区当前所对应的段;
[0230] 所述第二内存整理模块用于:参考图15所示,接收所述客户端发送的迁移指令,根据所述迁移指令完成对待迁移对象的实际迁移工作,并在迁移完成之后向所述客户端发送响应。
[0231] 如前所述,目前的远程堆方案,普遍存在向远程堆写回对象时RDMA性能利用不充分,以及远程堆服务程序软件处理开销和数据拷贝开销较大的问题。本发明能够有效解决这些问题,下面结合本发明技术方案对此进行详细说明。
[0232] 第一,本发明在向远程堆写回对象时,不存在随机小规模数据传输,能够充分发挥RDMA传输大量连续数据的性能优势。
[0233] 本发明将所有被更新的对象在日志缓冲区中连续存放,当日志缓冲区被填满后,才会使用RDMA write将整个1GB的日志缓冲区一次性连续传输到远程堆中的对应段。由此避免了对象写回时的随机小规模数据传输。
[0234] 第二,对象的分配、释放、读入和写回操作全部由客户端独自完成,不需要远程节点参与任何处理,没有任何服务端软件处理开销。
[0235] 由前文描述的详细技术方案可知,对象的分配和释放只涉及本地内存中的数据结构修改,不涉及网络操作。对象的读入则由客户端用RDMA read操作直接从远程堆中读取,不需要远程节点参与任何处理。对象的写回由客户端直接用RDMA write操作直接把日志缓冲区传输到远程堆对应段中,也不需要远程节点对日志进行任何处理。除此之外,客户端使用RDMA CAS和RDMA write操作直接操作远程节点的空闲段链表,完成段的分配和归还操作,也无需远程节点参与处理。
[0236] 第三,日志结构的远程堆管理方式有很好的磨损均衡效果。
[0237] 在日志结构的远程堆管理方式下,对象位置不固定,对同一个对象的每次更新不会都写入相同的位置,所有更新操作都按顺序不断向当前日志段的尾部追加,写操作均匀分布在整个日志段,并随着日志段的轮换覆盖整个NVM空间。
[0238] 第四,对象写回操作不产生任何数据拷贝开销。
[0239] 本发明结合批量日志传输的特点使用日志结构的方式来管理远程堆空间。因此,日志传输的目的地址就是对象在远程堆中的实际存储地址,和现有的基于批量日志传输的方案不同,不再需要把对象数据从日志拷贝到对象在远程堆中的存储位置,避免了额外的数据拷贝开销。
[0240] 第五,日志中除了对象数据之外,不包含任何额外信息,避免了对内存和网络资源的浪费。
[0241] 在本发明的采用的日志结构堆管理方案中,写回对象时,日志被直接传输到对象在远程堆中的实际存储位置,无需远程节点进行任何额外的处理。因此,日志中自然也无需记录任何额外的描述信息,只需记录对象数据即可。
[0242] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。