一种大页内存压缩回收系统及方法与流程

文档序号:11677370阅读:179来源:国知局
一种大页内存压缩回收系统及方法与流程

本发明属于计算机操作系统技术领域,具体涉及一种大页内存压缩回收系统及方法。



背景技术:

随着计算机技术的发展,特别是巨型机服务器的内存越来越大。而现有的服务器普遍采用linux内核对内存按4k一个页的粒度进行管理,对于大内存就显得捉襟见肘。比如对于256g的大内存,用4k页机制的话,单页表描述符就需要2g的内存空间。同时其对应的页表也很巨大,导致cpu的cache因不能全部缓存页表而造成cpu的检索过慢,从而影响性能。

对此linux内核采用了一种hugetlb机制把多个连续4k页拼接成2m大页来对大内存进行管理。但是hugetlb机制不支持大页压缩回收机制,以至于大页内存的利用率不高。因为在大页内存中会存在许多活跃度不高的大页,对其进行压缩存储可以提高内存的利用率。

4k页机制虽然能对内存进行压缩回收但是开销太大以及hugetlb机制虽然提供2m大页支持但是不能对其进行压缩回收。

现有的典型的内存复用技术,主要有以下几种:内存压缩、内存去重、ballooning技术、transcendentmemory技术以及swap技术等。

内存去重(memorydedulplication),就是把内存中的重复内容消除以提高内存利用率的技术。由于现代计算机的内存是分页管理的,所以内存去重技术往往指的就是页共享(pagesharing)技术。它通过共享相同内容的物理内存页从而降低物理内存消耗。内存去重是去掉重复的物理内存,以节省物理内存。

ballooning技术和transcendentmemory技术是基于虚拟化平台上的内存复用技术。简而言之,就是通过监测虚拟化平台上各个虚拟机的实际内存使用情况,来对各个虚拟机的内存进行管理,即将实际使用内存少于分配的内存的虚拟机内存进行回收,来供给其余用途。

swap技术是linux内核最常用的一种内存扩容技术。该技术把不常用的冷页内存交换到磁盘的swap分区中,需要访问的时候再把其读取到内存中。该机制由于需要读写磁盘,导致系统的响应特别慢。

内存压缩则比较好理解:由于现今计算机的cpu利用率比较空闲,因此,通过使cpu变得“忙碌”起来,将内存中的一些“冷页”进行压缩然后重新存放到内存中,从而来使我们有更多的可用内存。

内存压缩可以有效的提高内存有效容量,降低页故障率,同时不会有大容量内存的使用带来的能耗和空间消耗。同时可以提高内存带宽使用率。但是压缩和解压缩会带来延迟,如果处理不当可能把压缩带来的好处抵消掉。因此有效使用压缩技术需要谨慎选择实现框架、压缩算法等等。



技术实现要素:

鉴于上述,本发明提供了一种大页内存压缩回收系统及方法,主要是基于全新的大页内存管理机制对大页内存进行压缩回收,把不经常访问的大页内存进行压缩回收,腾出的空间让其他用户进程利用,以提高内存的复用率。

一种大页内存压缩回收系统,包括:

回收控制器,用于对接收的大页进行解映射处理,将压缩执行流模块发送来的解压缩数据转送给操作系统;

压缩执行流模块,用于控制解映射处理后大页中内存数据的压缩执行流程,负责调用压缩流模块的单压缩或多压缩流压缩内存数据,得到压缩数据;用于控制压缩数据管理模块中的压缩数据的解压缩执行流程,负责调用压缩流模块的单压缩或多压缩流解压缩压缩数据,得到解压缩数据;

压缩流模块,用于负责单压缩流或多压缩流的控制和调度,实时地根据cpu的负载情况分配空闲的单压缩流或多压缩流压缩内存数据或解压缩压缩数据;

压缩/解压缩算法模块,用于对大页中内存数据的压缩和压缩数据的解压缩;

压缩数据管理模块,用于压缩数据的动态存储管理。

所述的回收控制器用于对从冷热页跟踪模块隔离的冷大页进行解映射处理。因为在压缩期间,进程的页表项还映射了该页,因此必须对其进行解除映射,保证在压缩数据期间不能有其他用户进程修改大页内存里的数据。

所述的压缩执行流模块包括compress模块、decompress模块以及压缩流程控制模块,其中,compress模块用于执行大页中内存数据的压缩,decompress模块用于执行压缩数据的解压,压缩流程控制模块用于调用单压缩或多压缩流,并控制compress模块执行大页中内存数据的压缩或控decompress模块制执行压缩数据的解压。

所述的压缩流模块包括单压缩流、多压缩流以及控制压缩流动态分配模块,其中,控制压缩流动态分配模块用于根据cpu的负载情况分配单压缩流或多压缩流去执行压缩内存数据操作。

压缩流是缓存buffer和算法私有的,每个压缩操作都会独享压缩流。由于上层调用者kswap是多线程的,如果采用单压缩流,将限制kswap的并发。同时如果单压缩流出现数据奔溃或卡住的情况,所有的其他压缩操作将一直处于等待状态,这样将造成效率低下,而多流压缩架构可以让多个压缩操作并行执行,这大大提高了压缩的效率和稳定性。

所述的压缩/解压缩算法模块包括lzo算法模块、lz4算法模块以及开放算法模块,其中,lzo算法模块内置有压缩或解压的lzo算法,且该算法被单压缩流或多压缩流调用去执行压缩或解压,lz4算法模块内置有压缩或解压的lz4算法,且该算法被单压缩流或多压缩流调用去执行压缩或解压,开放算法模块用于将其他开源算法直接移植于该模块内,并被单压缩流或多压缩流调用。

lzo和lz4算法是比较成熟的压缩算法。目前linux内核3.10版本只有lzo算法,linux内核3.15版本引入了lz4算法。本系统直接移植这两种算法,lzo算法比lz4算法有更好的压缩比和更快的压缩速度,但是lz4在解压速度上比lzo算法更优秀。由于大页有2m大,必须对其进行快速的解压,因此lz4算法在本系统中更具优势。这两个模块是独立模块,可以用开放算法模块中引入的其他算法替换。

所述的压缩数据管理模块包括压缩数据的组织存放模块和mem_pool模块,其中,压缩数据的组织存放模块用于将接收的压缩数据存放于mem_pool模块,mem_pool模块用于压缩数据。

如果将2m大页进行压缩后的压缩数据还是存放于2m大页内,这会导致空间利用率低和数据迁移慢的问题。处于空间率用率和安全性通用性的考虑,本发明运用vmalloc函数将压缩数据放在内核空间的4k小页内,占用整数个4k小页,不满4k小页也占用整个4k小页。这样每个2m大页压缩后的压缩数据最多就浪费4k的内存空间,空间浪费率为1/512。对于解压缩以后,系统将整个4k小页直接释放掉,不会造成空间碎片化。

所述的压缩数据的组织存放模块包含用于对大页数据进行管理的红黑树,所述的红黑树的每个节点是三元组mapping、index、address,其中,mapping和index为每个大页page中独有的元素,以mapping为第一关键字和以index作为第二关键字在红黑树中进行排序,用于对大页进行标记;address保存存储压缩数据4k小页的虚拟地址。这样每次解压缩的时候只需要log(n)的复杂度就可以找到压缩数据的地址进行解压缩。

压缩数据的组织存放模块改变了页表项的映射,压缩前虚拟地址映射的是一块连续的2m物理页,压缩以后将虚拟地址映射到一组4k页。本质就是开始时虚拟地址指向2m页,压缩以后将虚拟地址直指向新存放的地址。

本发明还提供了一种大页内存压缩回收方法,具体包括:

大页内存数据的压缩:回收控制器对大页进行枷锁和unmap操作处理,并将处理后的大页发送至压缩执行流模块,压缩执行流模块调用压缩流模块中的压缩流和压缩/解压算法模块中的压缩算法对大页进行压缩,并将得到的压缩数据发送至压缩数据管理模块,利用红黑树将压缩数据存储于小页中。

压缩数据的解压缩:压缩执行流模块接收来自回收控制器的解压缩命令,通过压缩数据管理模块中的红黑树查找压缩数据,并调用压缩流模块中的压缩流和压缩/解压算法模块中的解压算法对小页进行解压缩,然后将解压缩后的数据写入当前大页,发送至回收流控制器。

所的大页内存数据的压缩具体包括以下步骤:

(a-1)利用回收控制器对冷热页追踪隔离出来的大页进行加锁,防止其他内核模块或进程占用该页;

(a-2)利用回收控制器对该大页进行unmap操作,清空所有映射此大页的页表项pte,保证在压缩过程中用户进程不能修改该大页的数据;

(a-3)compress模块判断大页是否超出压缩限制,若是,则不进行压缩,若否,执行步骤(a-4);

(a-4)compress模块检查大页是否为全0页,若是,将该大页进行特殊标记,并将数据直接扔掉,不进行压缩;若否,执行步骤(a-5);

(a-5)压缩流程控制模块根据回收控制器发送来的大页向控制压缩流的动态分配模块发出调用压缩流的指令;

(a-6)控制压缩流的动态分配模块根据cpu的负载情况分配空闲的单压缩流或多压缩流供压缩流程控制模块调用,若没有空闲的单压缩流或多压缩流,控制压缩流的动态分配模块则进行睡眠等待,直到存在空闲的单压缩流或多压缩流再进行分配;

(a-7)被分配的单压缩流或多压缩流调用压缩/解压缩算法模块中的一个或多个压缩算法随同自身被压缩流程控制模块调用;

(a-8)压缩流程控制模块根据调用的单压缩流或多压缩流以及压缩算法控制compress模块对大页中的内存数据进行压缩,得到压缩数据;

(a-9)压缩数据的组织存放模块将接收到的压缩流中的压缩数据拷贝至mem_pool模块的4k小页中,并将4k小页的address以及当前大页的mapping和index插入到红黑树里;

(a-10)压缩流程控制模块释放单圧缩流或多压缩流,将当前大页从页缓存pagecache中移除;

(a-11)回收控制器接触页锁,并释放该大页。

所述的压缩数据的解压缩具体包括以下步骤:

(b-1)当访问大页触发缺页异常时,回收控制器判断大页的页表项pte是否为空,若是,执行步骤(b-2),若否,则不是由压缩造成的缺页异常,结束解压缩;

(b-2)decompress模块判断页缓存pagecache中是否有对应的文件页,若是,将文件页映射给当前产生缺页异常的页表项pte;若否,执行步骤(b-3);

(b-3)decompress模块申请一个新大页,并将该新大页加入至页缓存pagecache;

(b-4)decompress模块利用当前产生缺页异常的vma找到相应的mapping和index,并利用该二元组mapping和index到红黑树中查找是否存在压缩数据,若是,执行步骤(b-5);若否,则是第一次访问,执行步骤(b-6);

(b-5)decompress模块从红黑树中找到压缩数据的地址,通过标志位判断大页是否是全0页,若是,则直接对大页写0。若否,执行步骤(b-6);

(b-6)压缩流程控制模块调用压缩/解压缩算法模块中的一个或多个压缩解压缩算法并控制decompress模块对4k小页中的压缩数据进行解压缩,并将解压后的数据写入当前大页;

(b-7)把当前的页表项pte映射到该大页。

本发明基于全新的4k小页和2m大页分开管理框架,对2m大页进行压缩回收,不仅可以极大地减少系统内存开销合提升cpu检索cache的速度,还能极大的拓展内存复用率。经测试,可以对内存进行“扩容”2倍以上。比如256g的物理内存,用户能够用的内存可达500g以上。同时本压缩系统采用模块化设计,支持热插拔,和原生的linux内核耦合性低,可方便修改适应不同的内核版本。

附图说明

图1是本发明实施例大页内存压缩构架概要图;

图2是本发明实施例大页内存压缩回收系统的结构示意图;

图3是本发明实施例改变页表项的映射原理图;

图4是本发明实施例大页内存数据的压缩方法流程图;

图5是本发明实施例压缩数据的解压缩方法流程图。

具体实施方式

为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。

图1所示的是大页内存压缩构架概要图,该架构把物理内存分为两个部分:4k空间和2m空间。利用全新的大页内存独立管理机制管理2m大页内存。而原生的linux内存管理机制负责管理4k页空间,针对于冷热页追踪模块筛选出来的冷大页,采用本发明提出的大页内存压缩回收系统对其进行压缩存储管理。

图2所示的是实施例大页内存压缩回收系统的结构示意图,如图2所示,本实施例大页内存压缩回收系统,包括:回收控制器、压缩执行流模块、压缩流模块、压缩/解压缩算法模块以及压缩数据管理模块。

回收控制器用于对从冷热页跟踪模块隔离的冷大页进行解映射处理。因为在压缩期间,进程的页表项还映射了该页,因此必须对其进行解除映射,保证在压缩数据期间不能有其他用户进程修改大页内存里的数据。

压缩执行流模块包括compress模块、decompress模块以及压缩流程控制模块,其中,compress模块用于执行大页中内存数据的压缩,decompress模块用于执行压缩数据的解压,压缩流程控制模块用于调用单压缩或多压缩流,并控制compress模块执行大页中内存数据的压缩或控decompress模块制执行压缩数据的解压。

压缩流模块包括单压缩流、多压缩流以及控制压缩流动态分配模块,其中,控制压缩流动态分配模块用于根据cpu的负载情况分配单压缩流或多压缩流去执行压缩内存数据操作。

压缩流是缓存buffer和算法私有的,每个压缩操作都会独享压缩流。由于上层调用者kswap是多线程的,如果采用单压缩流,将限制kswap的并发。同时如果单压缩流出现数据奔溃或卡住的情况,所有的其他压缩操作将一直处于等待状态,这样将造成效率低下,而多流压缩架构可以让多个压缩操作并行执行,这大大提高了压缩的效率和稳定性。

压缩/解压缩算法模块包括lzo算法模块、lz4算法模块以及开放算法模块,其中,lzo算法模块内置有压缩或解压的lzo算法,且该算法被单压缩流或多压缩流调用去执行压缩或解压,lz4算法模块内置有压缩或解压的lz4算法,且该算法被单压缩流或多压缩流调用去执行压缩或解压,开放算法模块用于将其它开源算法直接移植于该模块内,并被单压缩流或多压缩流调用。

lzo和lz4算法是比较成熟的压缩算法。目前linux内核3.10版本只有lzo算法,linux内核3.15版本引入了lz4算法。本系统直接移植这两种算法,lzo算法比lz4算法有更好的压缩比和更快的压缩速度,但是lz4在解压速度上比lzo算法更优秀。由于大页有2m大,必须对其进行快速的解压,因此lz4算法在本系统中更具优势。这两个模块是独立模块,可以用开放算法模块中引入的其他算法替换。

压缩数据管理模块包括压缩数据的组织存放模块和mem_pool模块,其中,压缩数据的组织存放模块用于将接收的压缩数据存放于mem_pool模块,mem_pool模块用于压缩数据。

如果将2m大页进行压缩后的压缩数据还是存放于2m大页内,这会导致空间利用率低和数据迁移慢的问题。处于空间率用率和安全性通用性的考虑,本发明运用vmalloc函数将压缩数据放在内核空间的4k小页内,占用整数个4k小页,不满4k小页也占用整个4k小页。这样每个2m大页压缩后的压缩数据最多就浪费4k的内存空间,空间浪费率为1/512。对于解压缩以后,系统将整个4k小页直接释放掉,不会造成空间碎片化。

压缩数据的组织存放模块包含用于对大页数据进行管理的红黑树,所述的红黑树的每个节点是三元组mapping、index、address,其中,mapping和index为每个大页page中独有的元素,以mapping为第一关键字和以index作为第二关键字在红黑树中进行排序,用于对大页进行标记;address保存存储压缩数据4k小页的虚拟地址。这样每次解压缩的时候只需要log(n)的复杂度就可以找到压缩数据的地址进行解压缩。

压缩数据的组织存放模块改变了页表项的映射,压缩前虚拟地址映射的是一块连续的2m物理页,压缩以后将虚拟地址映射到一组4k页。本质就是开始时虚拟地址指向2m页,压缩以后将虚拟地址直指向新存放的地址,其原理图如图3所示。

本实施例还提供了一种利用上述大页内存压缩回收系统今进行大页内存压缩回收方法,包括大页内存数据的压缩方法和压缩数据的解压缩方法。

如图4所示的是本发明提供的大页内存数据的压缩方法实施例流程示意图,本实施例所描述的大页内存数据的压缩方法,具体包括以下步骤:

s101,利用回收控制器对冷热页追踪隔离出来的大页进行加锁,防止其他内核模块或进程占用该页。

s102,利用回收控制器对该大页进行unmap操作,清空所有映射此大页的页表项pte,保证在压缩过程中用户进程不能修改该大页的数据。

s103,compress模块判断大页是否超出压缩限制,若是,即大页没有空间存放数据,则不进行压缩,若否,执行步骤s104。

s104,compress模块判断大页是否为全0页,若是,将该大页进行特殊标记,并将数据直接扔掉,不进行压缩;若否,执行s105。

s105,压缩流程控制模块根据回收控制器发送来的大页向控制压缩流的动态分配模块发出调用压缩流的指令。

s106,控制压缩流的动态分配模块根据cpu的负载情况分配空闲的多压缩流供压缩流程控制模块调用。

s107,被分配的多压缩流调用压缩/解压缩算法模块中的lz4算法随同自身被压缩流程控制模块调用。

s108,压缩流程控制模块根据调用的多压缩流以及lz4算法控制compress模块对大页中的内存数据进行压缩,得到压缩数据。

s109,压缩数据的组织存放模块将接收到的压缩流中的压缩数据拷贝至mem_pool模块的4k小页中,并将4k小页的address以及当前大页的mapping和index插入到红黑树里。

s110,压缩流程控制模块释放多压缩流,将当前大页从页缓存pagecache中移除。

s111,回收控制器接触页锁,并释放该大页。

如图5所示是本发明提供的压缩数据的解压缩方法实施例流程示意图,本实施例所描述的压缩数据的解压缩方法,具体包括以下步骤;

s201,当访问大页触发缺页异常时,回收控制器判断大页的页表项pte是否为空,若是,执行s202,若否,则不是由压缩造成的缺页异常,结束解压缩。

s202,decompress模块判断页缓存pagecache中是否有对应的文件页,若是,将文件页映射给当前产生缺页异常的页表项pte;若否,执行s203。

s203,decompress模块申请一个新大页,并将该新大页加入至页缓存pagecache。

s204,decompress模块利用当前产生缺页异常的vma找到相应的mapping和index,并利用该二元组mapping和index到红黑树中查找是否存在压缩数据,若是,执行s205;若否,则是第一次访问,执行s206。

s205,decompress模块从红黑树中找到压缩数据的地址,通过标志位判断大页是否是全0页,若是,则直接对大页写0。若否,执行s206。

s206,压缩流程控制模块调用压缩/解压缩算法模块中的lzo算法并控制decompress模块对4k小页中的压缩数据进行解压缩,并将解压后的数据写入当前大页。

s207,把当前的页表项pte映射到该大页。

以上所述的具体实施方式对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。

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