文件系统、操作系统和电子设备转让专利

申请号 : CN202311615379.2

文献号 : CN117312256B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘科张闯

申请人 : 苏州元脑智能科技有限公司

摘要 :

本申请实施例提供了一种文件系统、操作系统和电子设备,其中,该文件系统部署在操作系统中的应用层与本地文件系统层之间添加的中间层,中间层被允许跟踪应用层中文件的读写特征,文件系统包括:缓存模块,压缩模块和编码模块,其中,缓存模块,用于根据逻辑文件在应用层对应的目标读写特征缓存文件系统中所写入的逻辑文件,得到逻辑文件的用户数据;压缩模块,用于响应接收到的压缩请求,对逻辑文件的用户数据进行压缩,得到逻辑文件的压缩数据;编码模块,用于将逻辑文件的压缩数据编码为连续的物理文件。通过本申请,解决了文件系统处理文件的灵活性较差的技术问题,达到提高文件系统处理文件的灵活性的技术效果。

权利要求 :

1.一种文件系统,其特征在于,

所述文件系统部署在操作系统中的应用层与本地文件系统层之间添加的中间层,所述中间层被允许跟踪应用层中文件的读写特征,所述文件系统包括:缓存模块,压缩模块和编码模块,其中,所述缓存模块,用于根据逻辑文件在所述应用层对应的目标读写特征缓存所述文件系统中所写入的所述逻辑文件,得到所述逻辑文件的用户数据;检测是否到达所述逻辑文件的落盘时机;在检测出已到达所述落盘时机的情况下,向所述压缩模块发送压缩请求;

所述压缩模块,用于响应接收到的所述压缩请求,对所述逻辑文件的用户数据进行压缩,得到所述逻辑文件的压缩数据;

所述编码模块,用于将所述逻辑文件的压缩数据编码为连续的物理文件,其中,所述物理文件中还记载了所述物理文件所在的物理空间与所述逻辑文件所在的逻辑空间之间的映射关系,所述物理文件用于落盘。

2.根据权利要求1所述的文件系统,其特征在于,

所述缓存模块,用于:

获取所述逻辑文件的分块区间的分块长度;

将所述分块长度划分为最少数量的长度值,其中,每个长度值为缓存空间所支持的分块单位的整数倍;

按照所述最少数量的长度值为所述逻辑文件的每个分块区间分配最少数量的缓存块,其中,长度值与缓存块一一对应,每个缓存块为一个连续的缓存空间;

缓存所述逻辑文件的每个分块区间的数据至一组所述最少数量的缓存块,得到所述逻辑文件的用户数据。

3.根据权利要求2所述的文件系统,其特征在于,

所述缓存模块,用于:

从所述分块长度开始,从剩余长度中提取所述分块单位的最大整数倍的长度值,直至所述剩余长度小于或者等于所述分块单位,其中,所述剩余长度是所述分块长度与已被提取的数据长度的差值;

将从所述分块长度中提取的长度值和所述分块单位的长度值确定为所述最少数量的长度值。

4.根据权利要求2所述的文件系统,其特征在于,

所述压缩模块,用于:根据压缩运算的缓存容量和所述最少数量的长度值中的最大长度值确定压缩计算单元的单元数量以及每个压缩计算单元的缓存占用量;按照所述单元数量创建一个或者多个目标计算单元,并按照所述缓存占用量为每个目标计算单元分配占用缓存;

所述缓存模块,用于根据单位数据的数据传输时间和数据压缩时间确定所述最少数量的缓存块之间的传输时间间隔;按照所述传输时间间隔向每个目标计算单元传输对应分块区间中的所述最少数量的缓存块。

5.根据权利要求4所述的文件系统,其特征在于,

所述缓存模块,用于:

在所述传输时间间隔到达的情况下,构建所述最少数量的缓存块中当前待传输的缓存块的直接存储器访问描述符;

将当前待传输的缓存块通过所述直接存储器访问描述符传输至对应的目标计算单元。

6.根据权利要求2所述的文件系统,其特征在于,

所述缓存模块,还用于以下之一:

按照用户编辑的文件分块大小扩展属性确定所述分块长度;

根据所述文件系统所支持的文件类型确定所述分块长度;

将所述文件系统所使用的数据库的存储单位确定为所述分块长度。

7.根据权利要求1所述的文件系统,其特征在于,

所述缓存模块,还用于:

为所述逻辑文件的分块区间分配块索引并提取所述逻辑文件的每个分块区间的元信息,其中,所述元信息包括:缓存块的状态字段,缓存块指针数组字段和描述符字段,所述缓存块的状态字段用于记录每个分块区间所包括的缓存块被操作的信息,所述缓存块指针数组字段用于记录每个分块区间所包括的缓存块的位置,所述描述符字段用于记录用于对每个分块区间所包括的缓存块进行数据传输的描述符;

按照所述块索引构建所述逻辑文件的分块区间的元信息的索引管理结构。

8.根据权利要求7所述的文件系统,其特征在于,

所述缓存块的状态字段,包括:块索引字段,所述缓存块的状态字段,还包括以下至少之一:加速卡同步字段,输入输出同步字段,锁定字段,压缩标记字段,统计信息字段,其中,所述加速卡同步字段用于记录对应分块区间是否已经向压缩模块传输过,所述输入输出同步字段用于记录对应分块区间是否已完成落盘,所述锁定字段用于记录对应分块区间是否允许被释放或者交换到磁盘中,所述压缩标记字段用于记录对应分块区间是否已完成压缩,所述统计信息字段用于记录对应分块区间在操作过程中产生的统计信息。

9.根据权利要求1所述的文件系统,其特征在于,

所述缓存模块,包括:用户空间和存储空间,其中,所述用户空间中存储了所述逻辑文件的多个分块区间的用户数据,每个分块区间的用户数据包括多个用户页面,所述存储空间存储了所述多个分块区间的压缩数据,每个分块区间的压缩数据包括一个压缩页面;

所述缓存模块,用于执行用户对所述逻辑文件的修改操作,得到被修改后的目标用户页面;

所述压缩模块,用于在不对所述目标用户页面所在的目标分块区间进行重新压缩的情况下,生成所述目标用户页面所对应的补丁页面,其中,所述补丁页面用于记录所述修改操作对所述逻辑文件的修改位置和修改内容;将所述补丁页面存入所述存储空间中所述目标分块区间的目标压缩页面之后,其中,所述补丁页面用于对所述目标压缩页面的解压页面执行所述修改操作。

10.根据权利要求9所述的文件系统,其特征在于,所述补丁页面中从顶部向底部记录所述修改操作对所述逻辑文件的每个修改位置和每个修改位置对应的修改内容在所述补丁页面中的位置,从底部向顶部记录所述修改操作对所述逻辑文件的修改内容。

11.根据权利要求1所述的文件系统,其特征在于,所述文件系统,还包括:代价评估模块,其中,

所述缓存模块,用于检测所述逻辑文件的每个分块区间的用户数据的读放大系数,其中,所述读放大系数用于指示数据产生读放大现象的程度;

所述代价评估模块,用于根据所述读放大系数决策所述每个分块区间的用户数据重新压缩时的压缩信息,其中,所述压缩信息包括:是否压缩和压缩算法;

所述压缩模块,用于按照所述压缩信息对所述每个分块区间的用户数据进行重新压缩。

12.根据权利要求11所述的文件系统,其特征在于,所述缓存模块,用于:

检测每个分块区间的用户数据上执行每次读操作时读取出的数据量和用户访问到的数据量;

计算读取出的数据量与用户访问到的数据量之间的比值,得到所述每次读操作的读放大比;

将目标时间窗口内所述读放大比的累加和确定为所述读放大系数。

13.根据权利要求11所述的文件系统,其特征在于,所述代价评估模块,还用于:

根据所述文件系统的硬件资源属性预测所述逻辑文件的每个分块区间的用户数据的压缩性能收益;

按照所述压缩性能收益控制所述压缩模块对每个分块区间的用户数据进行压缩。

14.根据权利要求1所述的文件系统,其特征在于,所述缓存模块,用于:

检测用户对所述逻辑文件的预读系数,其中,所述预读系数用于指示用户对所述逻辑文件使用最多的连续读取尺寸;

在检测到用户对所述逻辑文件的下一次读操作时,按照所述预读系数读取所述逻辑文件的所述物理文件,并行对读取到的所述物理文件进行解压。

15.根据权利要求1所述的文件系统,其特征在于,所述缓存模块,还用于:

在所述缓存所述文件系统中所写入的逻辑文件之前,检测所述文件系统所使用的加速卡的加速卡类型,其中,所述加速卡用于进行数据压缩或解压的硬件加速;

创建与所述加速卡类型匹配的缓存空间,其中,所述逻辑文件被缓存在所述缓存空间中。

16.根据权利要求1所述的文件系统,其特征在于,所述缓存模块,还用于以下至少之一:

在接收到用户发起的落盘指令的情况下,确定检测出已到达所述落盘时机;

在检测到达到目标周期的情况下,确定检测出已到达所述落盘时机;

在检测到已缓存的数据量大于或者等于数据量阈值的情况下,确定检测出已到达所述落盘时机。

17.根据权利要求1所述的文件系统,其特征在于,所述物理文件中包括索引块,其中,所述索引块用于记录所述物理文件所在的物理空间与所述逻辑文件所在的逻辑空间之间的映射关系。

18.根据权利要求17所述的文件系统,其特征在于,所述索引块中包括:具有对应关系的窗口号字段和物理块字段,其中,所述窗口号字段用于指示所述逻辑文件的分块区间的编号,所述物理块字段用于指示所述逻辑文件的分块区间在所述物理文件中对应的物理块。

19.根据权利要求18所述的文件系统,其特征在于,所述物理块字段,包括:物理块数字段,压缩块数字段,块编号字段和压缩算法字段,其中,所述物理块数字段用于表示对应的分块区间占用的物理块数量,所述压缩块数字段用于表示对应的分块区间占用的物理块中压缩块的数量,所述块编号字段用于表示对应的分块区间占用的物理块的编号,所述压缩算法字段用于表示对应的分块区间所采用的压缩算法。

20.根据权利要求17所述的文件系统,其特征在于,所述物理文件中还包括空闲空间管理块,其中,所述空闲空间管理块用于记录所述物理文件中的每个物理块是否空闲。

21.根据权利要求20所述的文件系统,其特征在于,所述物理文件的头部还包括文件管理块,其中,所述文件管理块用于记录所述物理文件中每个所述索引块的位置以及所述空闲空间管理块的位置。

22.一种操作系统,其特征在于,

所述操作系统包括应用层和本地文件系统层,在所述应用层与本地文件系统层之间还添加了中间层,所述中间层被允许跟踪应用层对文件的读写特征,所述中间层部署了权利要求1‑21任一项中所述的文件系统。

23.一种电子设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器上部署了权利要求1‑21任一项中所述的文件系统,所述处理器执行所述计算机程序时实现所述文件系统的运行。

说明书 :

文件系统、操作系统和电子设备

技术领域

[0001] 本申请实施例涉及计算机领域,具体而言,涉及一种文件系统、操作系统和电子设备。

背景技术

[0002] 随着互联网及物联网的迅猛发展,数据的生成速度呈现井喷式的增长,对计算机设备的存储空间及读写性能提出了新的挑战。将数据进行压缩后存储,不仅可以显著的节省存储空间,并且可大幅降低读取磁盘的输入输出IO延迟。
[0003] 尽管用户可以通过压缩软件,将数据压缩后进行存储,读取数据时再进行解压,但这种方式,仅适用于少数文件的管理。对于大型的数据中心,有着海量的文件与不间断的读写请求,用户不可能逐个文件手工处理;由于读写请求的随机性,大量的应用程序软件,也不可能通过嵌入压缩与解压代码进行数据的压缩与解压计算。因此,出现了各种文件系统来实现计算机设备中文件的处理。
[0004] 但目前的文件系统虽然可以对文件进行缓存,压缩,存储等处理,但一般都是采用统一的参数规则配置,统一的处理逻辑流程来实现文件的存储和访问,处理文件的灵活性较差,已经无法适应现如今越来越复杂的文件类型,文件使用场景,以及协助文件处理的硬件结构。
[0005] 针对相关技术中,文件系统处理文件的灵活性较差等问题,尚未提出有效的解决方案。

发明内容

[0006] 本申请实施例提供了一种文件系统、操作系统和电子设备,以至少解决相关技术中文件系统处理文件的灵活性较差的问题。
[0007] 根据本申请的一个实施例,提供了一种文件系统,文件系统部署在操作系统中的应用层与本地文件系统层之间添加的中间层,中间层被允许跟踪应用层中文件的读写特征,文件系统包括:缓存模块,压缩模块和编码模块,其中,缓存模块,用于根据逻辑文件在应用层对应的目标读写特征缓存文件系统中所写入的逻辑文件,得到逻辑文件的用户数据;检测是否到达逻辑文件的落盘时机;在检测出已到达落盘时机的情况下,向压缩模块发送压缩请求;压缩模块,用于响应接收到的压缩请求,对逻辑文件的用户数据进行压缩,得到逻辑文件的压缩数据;编码模块,用于将逻辑文件的压缩数据编码为连续的物理文件,其中,物理文件中还记载了物理文件所在的物理空间与逻辑文件所在的逻辑空间之间的映射关系,物理文件用于落盘。
[0008] 在一个示例性实施例中,缓存模块,用于:获取逻辑文件的分块区间的分块长度;将分块长度划分为最少数量的长度值,其中,每个长度值为缓存空间所支持的分块单位的整数倍;按照最少数量的长度值为逻辑文件的每个分块区间分配最少数量的缓存块,其中,长度值与缓存块一一对应,每个缓存块为一个连续的缓存空间;缓存逻辑文件的每个分块区间的数据至一组最少数量的缓存块,得到逻辑文件的用户数据。
[0009] 在一个示例性实施例中,缓存模块,用于:从分块长度开始,从剩余长度中提取分块单位的最大整数倍的长度值,直至剩余长度小于或者等于分块单位,其中,剩余长度是分块长度与已被提取的数据长度的差值;将从分块长度中提取的长度值和分块单位的长度值确定为最少数量的长度值。
[0010] 在一个示例性实施例中,压缩模块,用于:根据压缩运算的缓存容量和最少数量的长度值中的最大长度值确定压缩计算单元的单元数量以及每个压缩计算单元的缓存占用量;按照单元数量创建一个或者多个目标计算单元,并按照缓存占用量为每个目标计算单元分配占用缓存;缓存模块,用于根据单位数据的数据传输时间和数据压缩时间确定最少数量的缓存块之间的传输时间间隔;按照传输时间间隔向每个目标计算单元传输对应分块区间中的最少数量的缓存块。
[0011] 在一个示例性实施例中,缓存模块,用于:在传输时间间隔到达的情况下,构建最少数量的缓存块中当前待传输的缓存块的直接存储器访问描述符;将当前待传输的缓存块通过直接存储器访问描述符传输至对应的目标计算单元。
[0012] 在一个示例性实施例中,缓存模块,还用于以下之一:按照用户编辑的文件分块大小扩展属性确定分块长度;根据文件系统所支持的文件类型确定分块长度;将文件系统所使用的数据库的存储单位确定为分块长度。
[0013] 在一个示例性实施例中,缓存模块,还用于:为逻辑文件的分块区间分配块索引并提取逻辑文件的每个分块区间的元信息,其中,元信息包括:缓存块的状态字段,缓存块指针数组字段和描述符字段,缓存块的状态字段用于记录每个分块区间所包括的缓存块被操作的信息,缓存块指针数组字段用于记录每个分块区间所包括的缓存块的位置,描述符字段用于记录用于对每个分块区间所包括的缓存块进行数据传输的描述符;按照块索引构建逻辑文件的分块区间的元信息的索引管理结构。
[0014] 在一个示例性实施例中,缓存块的状态字段,包括:块索引字段,缓存块的状态字段,还包括以下至少之一:加速卡同步字段,输入输出同步字段,锁定字段,压缩标记字段,统计信息字段,其中,加速卡同步字段用于记录对应分块区间是否已经向压缩模块传输过,输入输出同步字段用于记录对应分块区间是否已完成落盘,锁定字段用于记录对应分块区间是否允许被释放或者交换到磁盘中,压缩标记字段用于记录对应分块区间是否已完成压缩,统计信息字段用于记录对应分块区间在操作过程中产生的统计信息。
[0015] 在一个示例性实施例中,缓存模块,包括:用户空间和存储空间,其中,用户空间中存储了逻辑文件的多个分块区间的用户数据,每个分块区间的用户数据包括多个用户页面,存储空间存储了多个分块区间的压缩数据,每个分块区间的压缩数据包括一个压缩页面;缓存模块,用于执行用户对逻辑文件的修改操作,得到被修改后的目标用户页面;压缩模块,用于在不对目标用户页面所在的目标分块区间进行重新压缩的情况下,生成目标用户页面所对应的补丁页面,其中,补丁页面用于记录修改操作对逻辑文件的修改位置和修改内容;将补丁页面存入存储空间中目标分块区间的目标压缩页面之后,其中,补丁页面用于对目标压缩页面的解压页面执行修改操作。
[0016] 在一个示例性实施例中,补丁页面中从顶部向底部记录修改操作对逻辑文件的每个修改位置和每个修改位置对应的修改内容在补丁页面中的位置,从底部向顶部记录修改操作对逻辑文件的修改内容。
[0017] 在一个示例性实施例中,文件系统,还包括:代价评估模块,其中,缓存模块,用于检测逻辑文件的每个分块区间的用户数据的读放大系数,其中,读放大系数用于指示数据产生读放大现象的程度;代价评估模块,用于根据读放大系数决策每个分块区间的用户数据重新压缩时的压缩信息,其中,压缩信息包括:是否压缩和压缩算法;压缩模块,用于按照压缩信息对每个分块区间的用户数据进行重新压缩。
[0018] 在一个示例性实施例中,缓存模块,用于:检测每个分块区间的用户数据上执行每次读操作时读取出的数据量和用户访问到的数据量;计算读取出的数据量与用户访问到的数据量之间的比值,得到每次读操作的读放大比;将目标时间窗口内读放大比的累加和确定为读放大系数。
[0019] 在一个示例性实施例中,代价评估模块,还用于:根据文件系统的硬件资源属性预测逻辑文件的每个分块区间的用户数据的压缩性能收益;按照压缩性能收益控制压缩模块对每个分块区间的用户数据进行压缩。
[0020] 在一个示例性实施例中,缓存模块,用于:检测用户对逻辑文件的预读系数,其中,预读系数用于指示用户对逻辑文件使用最多的连续读取尺寸;在检测到用户对逻辑文件的下一次读操作时,按照预读系数读取逻辑文件的物理文件,并行对读取到的物理文件进行解压。
[0021] 在一个示例性实施例中,缓存模块,还用于:在缓存文件系统中所写入的逻辑文件之前,检测文件系统所使用的加速卡的加速卡类型,其中,加速卡用于进行数据压缩或解压的硬件加速;创建与加速卡类型匹配的缓存空间,其中,逻辑文件被缓存在缓存空间中。
[0022] 在一个示例性实施例中,缓存模块,还用于以下至少之一:在接收到用户发起的落盘指令的情况下,确定检测出已到达落盘时机;在检测到达到目标周期的情况下,确定检测出已到达落盘时机;在检测到已缓存的数据量大于或者等于数据量阈值的情况下,确定检测出已到达落盘时机。
[0023] 在一个示例性实施例中,物理文件中包括索引块,其中,索引块用于记录物理文件所在的物理空间与逻辑文件所在的逻辑空间之间的映射关系。
[0024] 在一个示例性实施例中,索引块中包括:具有对应关系的窗口号字段和物理块字段,其中,窗口号字段用于指示逻辑文件的分块区间的编号,物理块字段用于指示逻辑文件的分块区间在物理文件中对应的物理块。
[0025] 在一个示例性实施例中,物理块字段,包括:物理块数字段,压缩块数字段,块编号字段和压缩算法字段,其中,物理块数字段用于表示对应的分块区间占用的物理块数量,压缩块数字段用于表示对应的分块区间占用的物理块中压缩块的数量,块编号字段用于表示对应的分块区间占用的物理块的编号,压缩算法字段用于表示对应的分块区间所采用的压缩算法。
[0026] 在一个示例性实施例中,物理文件中还包括空闲空间管理块,其中,空闲空间管理块用于记录物理文件中的每个物理块是否空闲。
[0027] 在一个示例性实施例中,物理文件的头部还包括文件管理块,其中,文件管理块用于记录物理文件中每个索引块的位置以及空闲空间管理块的位置。
[0028] 根据本申请的又一个实施例,还提供了一种操作系统,所述操作系统包括应用层和本地文件系统层,在所述应用层与本地文件系统层之间还添加了中间层,所述中间层被允许跟踪应用层对文件的读写特征,所述中间层部署了上述任一项中所述的文件系统。
[0029] 根据本申请的又一个实施例,还提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
[0030] 通过本申请,在操作系统中的应用层与本地文件系统层之间添加的中间层,文件系统被部署在中间层上,以逻辑文件为单位进行文件处理,文件系统被允许跟踪应用层中文件的读写特征,文件系统中的缓存模块可以依据逻辑文件在应用层对应的目标读写特征灵活地将逻辑文件缓存为用户数据,并且缓存后不直接压缩落盘,而是通过检测落盘时机进行延迟落盘的策略,根据具体需求灵活进行数据的压缩落盘。在编码过程中动态生成记载了物理文件所在的物理空间与所述逻辑文件所在的逻辑空间之间的映射关系的元信息,从而能够支持数据灵活的随机读写。因此,可以解决文件系统处理文件的灵活性较差的技术问题,达到提高文件系统处理文件的灵活性的技术效果。

附图说明

[0031] 图1是本申请实施例的一种部署了文件系统的服务器设备的硬件结构框图;
[0032] 图2是根据本申请实施例的文件系统的架构示意图;
[0033] 图3是根据本申请实施例的一种计算机设备的架构示意图;
[0034] 图4是根据本申请实施例的一种数据传输方式的示意图;
[0035] 图5是根据本申请实施例的另一种数据传输方式的示意图;
[0036] 图6是根据本申请实施例的一种数据库划分方式的示意图;
[0037] 图7是根据本申请实施例的一种索引管理结构的示意图;
[0038] 图8是根据本申请实施例的一种补丁页面的示意图;
[0039] 图9是根据本申请实施例的一种缓存模块不同缓存方式的示意图;
[0040] 图10是根据本申请实施例的一种缓存模块检测预读系数的示意图;
[0041] 图11是根据本申请实施例的一种读取数据过程的示意图;
[0042] 图12是根据本申请实施例的一种文件压缩的判断过程的示意图;
[0043] 图13是根据本申请实施例的一种硬件平台的示意图;
[0044] 图14是根据本申请实施例的文件的压缩存储方法的流程图;
[0045] 图15是根据本申请实施例的一种文件的压缩存储过程的示意图;
[0046] 图16是根据本申请实施例的一种文件的压缩落盘过程的示意图;
[0047] 图17是根据本申请实施例的一种定时回写指令触发的压缩存储过程的示意图;
[0048] 图18是根据本申请实施例的一种释放空间指令触发的压缩存储过程的示意图;
[0049] 图19是根据本申请实施例的一种释放空间过程的示意图;
[0050] 图20是根据本申请实施例的一种优化存储指令触发的压缩存储过程的示意图;
[0051] 图21是根据本申请实施例的一种待落盘的文件记录方式的示意图;
[0052] 图22是根据本申请实施例的一种文件的元信息的示意图;
[0053] 图23是根据本申请实施例的文件的压缩编码方法的流程图;
[0054] 图24是根据本申请实施例的另一种文件的元信息的示意图;
[0055] 图25是根据本申请实施例的一种文件的元信息中空闲空间管理块的示意图;
[0056] 图26是根据本申请实施例的一种文件的元信息中文件管理块的示意图;
[0057] 图27是根据本申请实施例的一种文件的读取操作过程的示意图;
[0058] 图28是根据本申请实施例的一种文件的写入操作过程的示意图。

具体实施方式

[0059] 下文中将参考附图并结合实施例来详细说明本申请的实施例。
[0060] 需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
[0061] 本申请实施例中所提供的实施例可以在服务器设备或者类似的运算装置等计算机设备中部署。以部署在服务器设备上为例,图1是本申请实施例的一种部署了文件系统的服务器设备的硬件结构框图。如图1所示,服务器设备可以但不限于包括用户层,内核层和物理层,物理层中部署了磁盘,用于存储文件,内核层中部署了VFS(Virtual File System,虚拟文件系统),并可以在VFS下部署不同的本地文件系统中的一种或者多种,比如:FAT(文件配置表),NTFS(新技术文件系统),EXT2(第二代扩展文件系统),F2FS(专门为基于NAND的存储设备设计的新型开源闪存文件系统)等。用户层发出对逻辑文件的读写操作,会经过操作系统的VFS,在内核层调用对应本地文件系统的操作函数,按照磁盘中的本地文件系统所定义的存储方式,进行物理数据的读写操作。本申请中提出的文件系统可以但不限于如图1所示部署在用户层,也可以部署在其他位置,比如:内核层,在本申请中不做限定。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述服务器设备的结构造成限定。例如,服务器设备还可包括比图1中所示更多或者更少的划分和部署,或者具有与图1所示不同的配置。
[0062] 在本实施例中提供了一种文件系统,图2是根据本申请实施例的文件系统的架构示意图,如图2所示,该文件系统部署在操作系统中的应用层与本地文件系统层204之间添加的中间层206,中间层206被允许跟踪应用层中文件的读写特征,该文件系统包括:缓存模块208,压缩模块210和编码模块212。
[0063] 其中,缓存模块208,用于根据逻辑文件在应用层对应的目标读写特征缓存文件系统中所写入的逻辑文件,得到逻辑文件的用户数据;检测是否到达逻辑文件的落盘时机;在检测出已到达落盘时机的情况下,向压缩模块发送压缩请求;
[0064] 压缩模块210,用于响应接收到的压缩请求,对逻辑文件的用户数据进行压缩,得到逻辑文件的压缩数据;
[0065] 编码模块212,用于将逻辑文件的压缩数据编码为连续的物理文件,其中,物理文件中还记载了物理文件所在的物理空间与逻辑文件所在的逻辑空间之间的映射关系,物理文件用于落盘。
[0066] 通过上述方案,在操作系统中的应用层与本地文件系统层之间添加的中间层,文件系统被部署在中间层上,以逻辑文件为单位进行文件处理,文件系统被允许跟踪应用层中文件的读写特征,文件系统中的缓存模块可以依据逻辑文件在应用层对应的目标读写特征灵活地将逻辑文件缓存为用户数据,并且缓存后不直接压缩落盘,而是通过检测落盘时机进行延迟落盘的策略,根据具体需求灵活进行数据的压缩落盘。在编码过程中动态生成记载了物理文件所在的物理空间与所述逻辑文件所在的逻辑空间之间的映射关系的元信息,从而能够支持数据灵活的随机读写。因此,可以解决文件系统处理文件的灵活性较差的技术问题,达到提高文件系统处理文件的灵活性的技术效果。
[0067] 上述文件系统可以但不限于采用Fuse(Filesystem in Userspace,用户态文件系统)技术框架部署在计算机设备的用户层,比如:图3是根据本申请实施例的一种计算机设备的架构示意图,如图3所示,提供了一种基于Fuse的透明压缩文件系统。通过在用户态创建文件系统,用户对逻辑文件的操作会先经过用户态的文件系统,之后通过libfuse(用户态文件系统库)模块,将读写请求发送到内核层的VFS(虚拟文件系统)接口。在用户态文件系统中,可以对逻辑文件的读写进行自定义操作,比如:将逻辑文件进行分块压缩、通过空间映射管理生成元数据、通过文件缓存优化读取、通过代价估计决定是否压缩存储,对生成的元数据与压缩块进行编码,之后回写到物理文件中,实现对文件的透明压缩读写。由于针对的是逻辑文件操作,文件的物理存储接口仍保持不变,从而实现兼容不同的本地文件系统。
[0068] 需要说明的是,本实施例中的文件系统也可以但不限于部署在计算机设备的内核层中,或者采用其他的部署方式,本实施例不做限定。在本实施例中以基于Fuse框架在用户层部署上述文件系统为例进行描述。
[0069] 在本实施例中,基于Fuse框架,在用户态自定义了文件系统。该基于Fuse框架的文件系统可以但不限于包括:VFS接口模块、缓存模块、压缩模块、代价估计模块、编码模块与回写模块等功能模块。其中:VFS接口模块,可用于在用户态实现对文件的VFS接口回调,包括:mount、open、write、read、flush、close等回调函数,分别完成文件系统的挂载、写入、读取、同步、关闭等操作。缓存模块,可用于通过缓存池缓存最近写入或读取的数据,减少与磁盘之间的IO操作与重复的压缩/解压计算操作;同时跟踪每个缓存页面的读写局部性特征,用于评估缓存块是否应该被压缩。压缩模块,可用于对缓存的数据进行压缩,压缩后生成压缩数据块与压缩后长度信息。压缩模块也会根据系统算力资源与负载,缓存剩余容量,用户落盘指令等因素,选择合适的硬件资源进行压缩计算。代价估计模块,可用于根据系统算力,IO吞吐带宽,数据块访问的局部性特征,压缩后的大小,决定文件块的编码是否采用压缩编码方式。编码模块,可用于根据底层文件系统特征、用户设置的文件属性决定采用何种编码方式将压缩块整合为连续的物理文件。回写模块,可用于采用周期性回写与用户强制回写两种方式,将编码模块编码的物理文件,写入到底层的本地文件系统中。
[0070] 对于VFS接口模块,通过挂载Fuse框架提供的操作函数,实现对应用层文件操作的支持,包括:挂载、打开、关闭、读、写、同步、扩展属性设置、卸载等。各个操作函数的功能如下:
[0071] 首先,挂载对应mount回调函数,可执行如下功能:功能1,解析用户输入参数,包括:系统压缩核算力、硬件加速卡类型、默认压缩算法、IO带宽、默认压缩比门限(小于该压缩比的数据块布压缩)、是否开启预读、是否开启补丁页面、是否开启空闲压缩矫正,保存用户输入的参数。功能2,进行缓存池的初始化,申请缓存池内存并进行初始化操作。
[0072] 打开函数用于文件或文件缓存的创建,执行如下步骤:如果打开的文件路径不存在,则创建该文件,并创建12KB的文件头,由编码模块完成对12KB文件头的编码。如果打开的文件路径存在,读取12KB文件头。添加该文件路径的引用计数。
[0073] 关闭函数用于清理文件资源,执行如下步骤:减少文件路径的引用计数。释放文件打开后使用的临时缓存。
[0074] 读操作函数用于向缓存模块提交读取申请,获取缓存模块的数据,执行如下步骤:以偏移地址为索引,从缓存模块会中获取一个缓存块。从缓存块中提取要读取的数据,将提取的数据返回给用户层。
[0075] 假设缓存块将逻辑文件以16KB为单位进行缓存,用户读取文件偏移20KB,长度4KB的数据块,操作流程可以但不限于为:首先,VFS接收到用户层读取文件20KB偏移位置处,4KB大小的读取请求,从缓存模块中,以20KB偏移作为索引,获取一个16KB的缓存块。从16KB缓存块中,提取4KB‑8KB之间的数据,对应了与逻辑文件中的20KB‑24KB之间的数据。将提取的4KB内容返回到用户层,完成读取操作。
[0076] 写操作函数用于将用户写入的数据,拷贝到缓存块中的相应位置,操作步骤如下:以偏移地址为索引,从缓存模块会中获取一个缓存块。VFS接口模块,将用户写入的数据,覆盖到缓存块中对应地址偏移位置。标记缓存块为未同步状态。
[0077] 假设缓存块将逻辑文件以16KB为单位进行缓存,用户读取文件偏移20KB,长度4KB的数据块,操作流程可以但不限于为:从缓存模块中,以20KB偏移作为索引,获取一个16KB的缓存块。将用户写入的数据,写到16KB缓存块的4KB‑8KB之间,对应了与逻辑文件中的20KB‑24KB之间的数据。标记缓存块为未同步状态。
[0078] 同步函数用于接收用户发出的强制同步命令,将写入的数据同步到磁盘中,通过向缓存模块发送信号,由缓存模块进行压缩与回写的操作控制,并阻塞等待缓存模块完成全部操作后才能返回。操作步骤可以但不限于为:将文件路径发送到缓存模块,标记该文件需要立刻同步到磁盘中。等待缓存模块,将所有标记为未同步的缓存块压缩完毕,并写入到磁盘。
[0079] 扩展属性设置函数用于标记文件存储方法,可以但不限于包括:文件是否开启压缩存储,文件默认压缩算法,文件压缩的分块大小,文件默认预读大小,文件使用压缩存储的最小压缩比等等。文件系统可以将这些属性作为参数,用于其他模块进行缓存、压缩、编码时使用。
[0080] 对于缓存模块,可用于缓存最近写入或读出的数据,减少重复的IO操作与压缩/解压计算,并跟踪文件块的读写特征。本实施例中的缓存模块,支持每个文件使用不同大小的缓存块,面向硬件压缩加速器而设计,以提高压缩/解压计算的整体性能,硬件压缩加速器可以但不限于为FPGA或ASIC等专用器件。
[0081] 硬件压缩加速器的特点包括:硬件压缩加速器可以有多个硬件加速计算单元,每个计算单元包含固定大小的片上RAM存储空间(16KB‑1MB)。主机侧数据通过配置DMA描述符,指定主机侧物理地址,加速器侧RAM空间地址,将数据通过DMA传输到片上RAM存储空间中。每个硬件加速计算单元具有压缩/解压计算能力,从片上RAM空间,读取数据进行特定压缩/解压算法(GZIP/LZ77/SNAPPY)的硬件加速计算。压缩/解压计算时,通过寄存器配置原始数据的大小,指定压缩/解压原始数据的大小,完成计算后通过读取寄存器获取计算后的大小。当计算数据大于RAM存储空间时,通过分次加载实现,通过状态寄存器控制指示计算单元是否空闲,当空闲时可继续加载下一次数据。
[0082] 例如,一个GZIP硬件加速计算单元,有32KB的片上RAM缓存,在主机侧的通过PCIe映射的总线地址为0x80000000,要对主机侧物理地址为0x20000000的40KB的数据进行压缩计算。其计算流程可以但不限于包括:
[0083] 通过寄存器配置待压缩数据的总长度为40KB,构建第一个DMA描述符,将主机侧0x20000000起始,32KB大小的内容传输到0x80000000地址位置。通过状态寄存器判断是否计算完成,等待32KB数据计算完成。构建第二个DMA描述符,将主机侧0x20000000+32KB起始,8KB大小的内容传输到0x80000000地址位置。通过状态寄存器判断是否计算完成,等待
8KB数据计算完成。通过寄存器获取压缩后的大小。
[0084] 在一个示例性实施例中,缓存模块,可以但不限于用于:获取逻辑文件的分块区间的分块长度;将分块长度划分为最少数量的长度值,其中,每个长度值为缓存空间所支持的分块单位的整数倍;按照最少数量的长度值为逻辑文件的每个分块区间分配最少数量的缓存块,其中,长度值与缓存块一一对应,每个缓存块为一个连续的缓存空间;缓存逻辑文件的每个分块区间的数据至一组最少数量的缓存块,得到逻辑文件的用户数据。
[0085] 缓存模块将可用内存按照指定大小(即上述分块单位,比如4KB)进行分块,形成缓存池,分配时按照4KB大小为单位,将用户申请逻辑文件的分块区间的分块长度按照以2的整次幂,拆分为多个连续的缓冲块,尽可能的保障物理块的连续,以减少创建DMA描述符的数量,进而减少创建DMA描述符的耗时,提高与加速卡之间的传输效率。
[0086] 在一个示例性实施例中,缓存模块,用于:从分块长度开始,从剩余长度中提取分块单位的最大整数倍的长度值,直至剩余长度小于或者等于分块单位,其中,剩余长度是分块长度与已被提取的数据长度的差值;将从分块长度中提取的长度值和分块单位的长度值确定为最少数量的长度值。
[0087] 一种分块长度的拆分方法可以但不限于为从剩余长度中按照分块单位的最大整数倍的长度值提取,直至剩余长度小于或者等于分块单位时分配一个分块单位的长度值,比如:分块长度为40KB,分块单位4KB,可以首先提取出4KB的8倍长度为32KB的长度值,剩余8KB提取出4KB的2倍长度为8KB的长度值,得到32KB+8KB两个缓存块。上述过程可以但不限于通过以下方式实现:将用户申请的分块长度,以KB为单位,循环右移,初始值为1KB,每右移一次,乘以2。遇到0时跳过,遇到1时,申请对应长度的缓存块,不足4KB时,申请4KB大小。
3
比如40KB,二进制为101000,遇到第一个1时,右移了3次,即2=8KB,遇到第2个1时,右移了5
5
次,即2=32KB。
[0088] 传统方式中,以4KB大小管理操作系统缓存,当对用户申请的内存分块长度以4KB大小为单位进行分配,并不保障分配到数据尽可能的连续,因此所有4KB页面都是随机分配,可能为离散的存储空间。将相应页面传输到硬件加速器时,需要为每一个页面构建DMA描述符,导致较长时间的耗时与DMA描述符的空间占用过多。
[0089] 举例说明,一个40KB的分块长度,传统方式中会分配10个4KB缓存块,并不保障缓存块之间的连续性,因此需要构建10个DMA描述符,每个描述符内标记源地址、目的地址、与4KB长度,实现传输到硬件加速单元的需求。本实施例中,分配32KB+8KB两个缓存块,两个缓存块内部保障物理空间的连续,只需要构建2个DMA描述符即可。大幅减少了DMA描述符创建的耗时与内存空间的占用,提高了主机侧与加速卡之间的传输效率。
[0090] 在一个示例性实施例中,压缩模块,用于:根据压缩运算的缓存容量和最少数量的长度值中的最大长度值确定压缩计算单元的单元数量以及每个压缩计算单元的缓存占用量;按照单元数量创建一个或者多个目标计算单元,并按照缓存占用量为每个目标计算单元分配占用缓存;缓存模块,用于根据单位数据的数据传输时间和数据压缩时间确定最少数量的缓存块之间的传输时间间隔;按照传输时间间隔向每个目标计算单元传输对应分块区间中的最少数量的缓存块。
[0091] 传统方式中,分块压缩存储采用定长分配的策略,文件系统中所有的文件分块是定长的,加速器采用相同大小的RAM空间设计,通过多个计算单元并行的方式,实现对多个分块的并行压缩计算,每一次传输与计算消耗固定的时钟周期。操作模式较为简洁,将一批缓存块传输到计算单元后,启动计算,等待计算完成,载入下一批数据。在本实施例中,缓存模块以硬件加速器计算单元的片上缓存空间为基数,设定传输分块大小,根据计算与传输的耗时比例,计算数据传输间隔,进行缓存数据向加速器的交替DMA传输与计算,从而降低端到端的传输与计算延迟。
[0092] 在一个示例性实施例中,缓存模块,用于:在传输时间间隔到达的情况下,构建最少数量的缓存块中当前待传输的缓存块的直接存储器访问描述符;将当前待传输的缓存块通过直接存储器访问描述符传输至对应的目标计算单元。
[0093] 本实施例中,分块压缩存储支持变长的分配策略,硬件加速器采用如上述分次加载的方式支持变长数据的压缩,使不同的文件可使用不同长度的缓存块,以提高数据访问的性能。但由于分次加载之间需要等待前一次的计算完成,才能开启下一次的传输,如果按照传统方式中的等待计算完成后再传输下一次的方法,可能产生极大的延迟。
[0094] 为了解决该问题,本实施例中采用交替传输与计算的策略,提升整体性能,举例说明,假设,硬件加速器有128KB的片上RAM缓存资源,DMA传输128KB数据消耗128个时钟周期,硬件加速算法完成128KB的GZIP压缩耗时256个时钟周期,计算/传输耗时比为2:1,用户最长分块长度为64KB。图4是根据本申请实施例的一种数据传输方式的示意图,如图4所示,传统方式中,创建2个计算单元,每个计算单元占用64KB的缓存空间。本实施例中,最少数量的长度值中的最大长度值为32KB,可以创建4个计算单元,每个计算单元占用32KB缓存空间。当需要对4个64KB缓存块进行压缩计算时,传统方式分两次加载,每次传输64KB,到两个计算单元中计算。本实施例中分两次加载,每次传输32KB到4个计算单元中,由于计算单元数量更多,计算启动时间更早,因而获得更低的延迟。
[0095] 图5是根据本申请实施例的另一种数据传输方式的示意图,如图5所示,当需要对4个40KB缓存块进行压缩计算时,传统方式分两次加载,每次传输40KB,到2个计算的单元进行计算。本发明中,分两次加载,第一次传输4个缓存块的前32KB到计算单元中,第二次传输4个缓存块的后8KB到计算单元中,根据传输与计算耗时比例,可计算出后8KB,放入DMA(直接存储器访问)传输队列的时间,使计算单元在完成前一部分数据的计算后立刻加载后一部分的数据进行计算,实现更低的总体延迟。
[0096] 在一个示例性实施例中,缓存模块,还用于以下之一的分块长度的配置方式:
[0097] 方式一,按照用户编辑的文件分块大小扩展属性确定分块长度;
[0098] 方式二,根据文件系统所支持的文件类型确定分块长度;
[0099] 方式三,将文件系统所使用的数据库的存储单位确定为分块长度。
[0100] 在本实施例中,用户可通过文件分块大小扩展属性,指定对文件进行分块压缩的大小,使文件支持不同长度的缓存块。缓存将逻辑文件划分为多个相同大小的数据块,分块长度的大小可由用户通过对文件的扩展属性指定,用于不同类型文件的空间局部性访问优化。图6是根据本申请实施例的一种数据库划分方式的示意图,如图6所示,MySQL数据库默认以32KB为单位进行数据的存储,而PostgreSQL以8KB为单位进行数据的存储。在应用层发起对存储层的访问时,MySQL访问了32KB中的前4KB,之后一定会访问后面28KB内容;而PostgreSQL访问前4KB,之后会访问后面4KB内容,但不一定访问后面8KB内容。这种访问了前面部分数据后,会访问后面邻近页面的特征称为空间局部性,是由与应用程序需要对一个语义上的整体进行访问造成的(MySQL一次访问32KB,PostgreSQL一次访问8KB)。由于应用层的空间局部性特征,往往是可以在程序运行期预知的,比如:数据库中的配置文件,会显示数据库按照多大的单位容量进行数据的存储,因此可以充分利用不同文件的访问时的空间局部性进行分块压缩,以减少IO与压缩/解压计算的次数,从而定制化的提升性能。假设压缩比为4:1,MySQL随机访问0‑32KB、64‑96KB,PostgreSQL随机访问0‑8KB,16‑32KB。如果按照数据库中的存储单位,进行分块压缩,如图6中(a)与(b)所示,MySQL只需要读取16KB数据,进行两次解压计算耗时;PostgreSQL只需要读取4KB,进行两次解压计算,但是没有按照数据库的存储单位极性分块压缩,如图6中(c)所示,对MySQL按照16KB分块,小于数据库存储单位,MySQL需要读取16KB数据库,进行四次解压计算,由于传输与解压所需的启动耗时,会导致比(a)更大的延迟,如图6中(d)所示,对PostgreSQL按照8KB分块,大于数据库的存储单位, PostgreSQL需要读取8KB数据,进行一次解压计算,读取与计算量增加了一倍,而用户实际只需要其中一半的数据,造成不必要的延迟。
[0101] 在本实施例中,提供了多种分块长度的配置方式,用户可以根据需求和所使用数据库的情况灵活配置分块长度,从而更灵活更高效的使用文件系统。
[0102] 在一个示例性实施例中,缓存模块,还用于:为逻辑文件的分块区间分配块索引并提取逻辑文件的每个分块区间的元信息,其中,元信息包括:缓存块的状态字段,缓存块指针数组字段和描述符字段,缓存块的状态字段用于记录每个分块区间所包括的缓存块被操作的信息,缓存块指针数组字段用于记录每个分块区间所包括的缓存块的位置,描述符字段用于记录用于对每个分块区间所包括的缓存块进行数据传输的描述符;按照块索引构建逻辑文件的分块区间的元信息的索引管理结构。
[0103] 缓存模块使用索引管理结构管理文件的缓存,该索引管理结构的形式可以但不限于包括平衡二叉树树,平衡二叉树上的节点为缓存块的元信息。元信息负责对文件中一段逻辑地址空间的管理,维护与数据加速卡之间的数据传输、以及与磁盘间的数据同步。
[0104] 在一个示例性实施例中,缓存块的状态字段,包括:块索引字段,缓存块的状态字段,还包括以下至少之一:加速卡同步字段,输入输出同步字段,锁定字段,压缩标记字段,统计信息字段,其中,加速卡同步字段用于记录对应分块区间是否已经向压缩模块传输过,输入输出同步字段用于记录对应分块区间是否已完成落盘,锁定字段用于记录对应分块区间是否允许被释放或者交换到磁盘中,压缩标记字段用于记录对应分块区间是否已完成压缩,统计信息字段用于记录对应分块区间在操作过程中产生的统计信息。
[0105] 在传统方式中,缓存块按照4KB大小进行管理,使用基数树等树状容器管理缓存块的插入与查找。每个缓存块在硬件上对应一个页表项,完成缓存的分配与IO读取后,会将页表项设置为只读模式,对缓存块进行写入操作时,由页表项触发缺页异常,在缺页异常中标记页面为脏页,表示缓存中的数据与磁盘中的数据不一致,需要将该数据进行回写操作。
[0106] 然而在压缩存储的场景下,一个分块包含多个4KB页面,当修改任意一个4KB页面时,整个分块的数据应视为一个整体进行处理,比如:重新压缩计算整个分块或其它方法处理。
[0107] 本实施例中,将逻辑文件划分为分块,每个分块中包含若干个4KB大小的页面,以分块大小为单位进行压缩存储。图7是根据本申请实施例的一种索引管理结构的示意图,如图7所示,每个分块分配一个元信息,元信息使用平衡二叉树进行管理,使用块索引进行插入与查找。元信息中的字段内容包括:缓存块的状态,缓存块指针数组,DMA描述符等等。用户对逻辑文件进行访问时,访问到某个4KB页面时,当该4KB页面没有物理内存或被写保护时,会有硬件触发缺页异常,本实施例中在缺页异常中将访问的4KB页面偏移,转换为分块的块索引,在主机侧与加速卡侧,分别申请分块大小的逻辑页面内存与物理页面缓存,对于支持P2P的加速卡物理页面为加速卡的片外DDR内存,对于不支持P2P的加速卡物理页面为主机侧内存。在主机侧一次性建立分块大小的虚拟地址到物理地址的内存映射。进行元信息初始化,包括:初始化缓存块状态,由于主机侧缓存块可能由多个2的整数次幂的物理块构成,通过建立缓存块指针数组,将逻辑上的缓存块进行串联,建立主机侧到加速卡之间传输的DMA描述符。使用分块索引,将元信息插入到平衡二叉树中。用户首次访问一个4KB页面时,会触发缺页异常,缺页异常原因为没有物理页面,在缺页异常处理函数中会申请该4KB页面所在分块的内存,并建立物理地址到虚拟地址的映射,如果是读取操作启动IO从磁盘中读取数据,之后将分块内所有的页面设置为写保护。当用户向该4KB所在分块的页面,进行读取操作时,由于已经建立了物理地址与虚拟地址的映射,因此不会发生缺页异常,无需启动IO从磁盘中获取数据,直接从内存中读取。当用户向该4KB所在分块的页面时,进行写入操作时,由于分块内的页面都设置为了写保护状态,因此会触发缺页异常,缺页异常原因为写保护,在缺页异常处理函数中,修改加速卡与磁盘的同步标记,表示该页面内容与磁盘中的内容不一致。当用户进行落盘操作时,会遍历缓存块中与磁盘不一致的缓存块,从缓存块指针数组中快速获取所有的内存页,无需逐个4KB页面寻找。不使用每个页面的锁定标记位,使用元信息的锁定标记位,一次性锁定一个分块内所有4KB内存。根据DMA描述符将数据块传输到加速卡中进行压缩计算,获取压缩计算结果后修改加速卡同步标记,完成落盘后修改IO同步标记。同时更新用户对该缓存块的读写访问统计。
[0108] 在一个示例性实施例中,缓存模块,包括:用户空间和存储空间,其中,用户空间中存储了逻辑文件的多个分块区间的用户数据,每个分块区间的用户数据包括多个用户页面,存储空间存储了多个分块区间的压缩数据,每个分块区间的压缩数据包括一个压缩页面;缓存模块,用于执行用户对逻辑文件的修改操作,得到被修改后的目标用户页面;压缩模块,用于在不对目标用户页面所在的目标分块区间进行重新压缩的情况下,生成目标用户页面所对应的补丁页面,其中,补丁页面用于记录修改操作对逻辑文件的修改位置和修改内容;将补丁页面存入存储空间中目标分块区间的目标压缩页面之后,其中,补丁页面用于对目标压缩页面的解压页面执行修改操作。
[0109] 缓存模块中,对页面的存储分为逻辑页面(可以称为用户空间)与物理页面(可以称为存储空间),分别对应了用户看到的逻辑数据与实际存储在磁盘中的数据。物理页面中包含:压缩页面与补丁页面,以不同存储策略对文件块进行存储。其中,压缩页面存放对文件块的压缩数据,可能由不同的压缩算法生成;补丁页面,用于存放已经完成了对原始数据的压缩或落盘,用户又对原始数据进行了少量的修改的部分。此时如果对原始数据再次压缩或落盘,产生的延迟代价过高,因此对少量数据的修改的场景,不再重复压缩落盘,使用补丁页面标记修改的部分。页面补丁分为两类:整页补丁、段补丁。整页补丁用于替换一整个页面的内容,段补丁用于替换压缩分块中的部分内容。
[0110] 一个分块区间中,包含压缩后的数据压缩块页面与页面补丁,两种页面。其中页面补丁的类型在编码模块中的元信息会标记。
[0111] 在一个示例性实施例中,补丁页面中从顶部向底部记录修改操作对逻辑文件的每个修改位置和每个修改位置对应的修改内容在补丁页面中的位置,从底部向顶部记录修改操作对逻辑文件的修改内容。
[0112] 对压缩数据打补丁时,将补丁数据拷贝到解压后的页面中,图8是根据本申请实施例的一种补丁页面的示意图,如图8所示,段补丁页面可以但不限于采用如下的结构:段补丁页面中从顶部向底部存储补丁的元数据(记录修改操作对逻辑文件的每个修改位置和每个修改位置对应的修改内容在补丁页面中的位置),元数据中标记解压后修改页面的起始位置,补丁在补丁页面中的偏移,补丁长度;段补丁页面中从底部向顶部依次存放补丁数据,即修改内容。
[0113] 举例说明,图9是根据本申请实施例的一种缓存模块不同缓存方式的示意图,如图9所示,提供了缓存模块的不同场景下的存储方法:缓存模块中,用户数据以页面为单位进行管理,页面大小通常为4KB。多个页面为一组作为分块压缩的单位,如图9中4个页面为一组,则文件按照16KB为单位进行分块压缩。缓存模块中以二叉树结构,存放用户读取或写入的数据,页面在缓存中存储的方式有如下几种情况:
[0114] 方式1,如图9中①所示,数据分块中写入量较大,文件块中大量数据被修改,会对分块的用户页面进行压缩计算,存储页面中缓存为:压缩存储。
[0115] 方式2,如图9中②所示,数据分块中写入量较少,文件块中只有少量修改,不对分块的用户页面再次压缩计算,通过补丁页面记录修改的部分,存储页面中缓存为:压缩存储结合补丁页面的方式。
[0116] 方式3,如图9中③所示,数据分块中由于压缩比较小或者读放大系数过大,编码模块在落盘时采用非压缩存储,缓存模块读取到的为非压缩存储的格式,用户页面与存储页面实际上是相同的,在对这段数据进行写入操作时,存储页面中只更新修改的页面。
[0117] 方式4,如图9中④所示,用户没有对文件进行读取或写入操作部分,缓存模块中不缓存该区间的数据。
[0118] 方式5,如图9中⑤所示,用户读取文件中的一段数据,该分块中在磁盘中采用的压缩结合补丁页面存储方式,原始数据读取到存储页面后,先解压到用户页面,再将补丁内的数据写入到用户页面中,保持数据修改后一致性。
[0119] 在一个示例性实施例中,缓存模块,用于:检测用户对逻辑文件的预读系数,其中,预读系数用于指示用户对逻辑文件使用最多的连续读取尺寸;在检测到用户对逻辑文件的下一次读操作时,按照预读系数读取逻辑文件的物理文件,并行对读取到的物理文件进行解压。
[0120] 缓存模块中,记录对该文件连续读取的尺寸,进行统计,记录最常见的读取尺寸,作为预读系数。从文件打开到关闭期间,缓存模块会记录,一定时间窗口内,对文件的连续读取尺寸,将最常见的连续读写尺寸,作为预读系数。预读系数用于对该文件的预读操作,预先分配大于用户单次请求的缓存块,连续读取大于用户单次请求的数据量,读取的过程中启动解压计算,以提高整体性能。
[0121] 图10是根据本申请实施例的一种缓存模块检测预读系数的示意图,如图10所示,缓存模块检测预读系数操作步骤如下:
[0122] 步骤1:设定时间窗口,记录在时间窗口内对文件的访问,是否为连续地址的访问。
[0123] 步骤2:如果时间窗口内对文件地址的访问是连续的,触发预读操作,设定时间窗口内所连续访问的文件地址长度,为缓存窗口长度。
[0124] 步骤3:申请缓存窗口大小的缓存块,一个缓存窗口内包含多个文件分块,每个文件分块内包含多个4KB页面。
[0125] 步骤4:启动IO(输入输出)读取压缩块,每完成一个分块数据的读取即启动解压计算。
[0126] 步骤5:完成预读窗口内所有压缩块的IO读取后,判断执行步骤4执行时间是否大于时间窗口时间。
[0127] 步骤6:如果步骤4执行时间大于窗口时间,判断用户对文件的访问是否为连续访问,且覆盖了已完成解压的数据块,如果是,则向后移动缓存窗口继续执行步骤4,否则暂停预取操作。
[0128] 值得说明的是,该场景下用户在进行密集的数据连续访问。比如:网络传输场景下,用户访问一个32KB页面后,将数据送入网卡,立即要访问下一个32KB页面,两次32KB页面的访问间隔极小。因此,该场景下应尽量减少IO操作的停顿时间,如果在IO完成后,用户访问了所有已经解压的页面,表征用户仍在发出连续读取的指令,为了尽量减少IO间隔的耗时,本实施例在该场景下,立即启动IO的读取与解压。
[0129] 步骤7:如果步骤4的执行时间小于窗口时间。当用户对文件的访问为连续访问,且访问到缓存窗口内最后一个文件分块时,向后移动缓存窗口继续执行步骤4。
[0130] 值得说明的是,该场景下用户对文件的访问为非密集的连续访问。比如:AI模型训练场景下,用户先读取一个32KB的页面,进行复杂的矩阵运算,再读取下一个32KB页面。虽然两次对文件的访问是连续的,但两次对文件的访问间隔时间较长。此时要减少总体耗时,只需要在用户访问到下一个32KB前完成IO读取与解压即可。
[0131] 举例说明,图11是根据本申请实施例的一种读取数据过程的示意图,如图11所示,假设在一段时间窗口内,用户发出了四次读请求,每次访问4个页面,页面均为连续:缓存模块跟踪每一次的读请求访问,记录下一段时间窗口内,发现最频繁访问的是连续16个页面,页面访问的局部性特征为:第1个页面访问完成后,通常还会访问到后续15个页面。当没有开启预读功能时,如图11中(a)所示,每次读请求,都需要一次执行读取与解压操作。读取与解压操作顺序执行,带来而来较大的访问延迟。当开启预读功能后,如图11中(b)所示,在读取第一次读请求时,缓存模块会读取16个用户页面的数据,当第0个页面解压计算时,同时进行第1个页面的读取操作,同理,解压第1个页面时,同时进行着第2,3页面的读取。读取与解压操作在时间上是并行的,因此可以大幅降低16个页面访问的整体延迟。
[0132] 在一个示例性实施例中,缓存模块,还用于:在缓存文件系统中所写入的逻辑文件之前,检测文件系统所使用的加速卡的加速卡类型,其中,加速卡用于进行数据压缩或解压的硬件加速;创建与加速卡类型匹配的缓存空间,其中,逻辑文件被缓存在缓存空间中。
[0133] 可选的,缓存模块根据不同加速卡类型创建不同类型的缓存池。考虑到压缩与解压计算会消耗大量的CPU算力资源导致较大的延迟,实践中往往会使用硬件加速卡进行压缩与解压的硬件加速。由于不用的硬件加速卡对缓存的一致性维护机制不同,因此本实施例中会针对不用的硬件加速设备,对缓存进行分别设定:
[0134] 对于无加速卡的情况,动态申请缓存构成缓存池,物理页面与逻辑页面均使用主机侧内存。对于PCIe加速卡,由于PCIe加速卡无法保障主机侧与加速卡侧内存的一致性,读写操作需要借助DMA,进行主机侧与加速卡之间的来回传输。因此,本实施例中,对于支持P2P传输的加速卡,物理页面使用加速卡的外存DDR;对于不支持P2P传输的加速卡,物理页面使用主机侧内存。对于CXL加速卡,由于CXL加速卡硬件上可以自动保障主机与加速卡的内存一致性。因此,本实施例中,将CXL加速卡内存地址空间由内核态映射到用户态,将映射到用户态的内存地址进行分块,直接使用CXL加速卡内存形成缓存池。逻辑页面与物理页面均可使用CXL的内存,物理页页面优先从CXL中获取内存,当CXL中内存不足时再从主机侧分配内存。
[0135] 在一个示例性实施例中,缓存模块,还用于以下至少之一的方式触发落盘时机:
[0136] 方式a,在接收到用户发起的落盘指令的情况下,确定检测出已到达落盘时机。相当于接收到用户触发的强制落盘指令后达到落盘时机。
[0137] 方式b,在检测到达到目标周期的情况下,确定检测出已到达落盘时机。相当于周期性触发定时回写指令后达到落盘时机。
[0138] 方式c,在检测到已缓存的数据量大于或者等于数据量阈值的情况下,确定检测出已到达落盘时机。相当于通过触发释放空间指令或者优化存储指令达到落盘时机。
[0139] 对于压缩模块,可用于完成对缓存模块中需要落盘存储页面的压缩计算。读取缓存页面中用户页面,压缩后存储到存储页面中。压缩模块,可能调用CPU或者硬件加速卡进行压缩计算,其工作流程如下:收到缓存模块的压缩请求,每一个请求对应一个文件的压缩,对请求进行优先级排序,规则可以但不限于为:用户对文件的强制落盘请求的落盘优先级大于缓存模块周期性发出的压缩请求;遍历待压缩文件,将文件ID号,传入代价估计模块,代价估计模块返回该文件是否应该进行压缩计算以及每个文件缓存块的压缩标记;对需要进行压缩计算的文件,遍历文件的缓存块,对于尚未进行过压缩的缓存块、以及有大量修改的缓存块,代价估计模块会标记该压缩块为需要压缩。对此类模块进行压缩计算,如果获得的压缩比较大,将压缩后的数据放入缓存块存储页面中,同时标记存储页面的压缩数据有效长度。如果获得的压缩比较小,则存储页面中存放原始数据,同时标记存储页面为非压缩状态。对于已经执行过压缩的缓存块,只有少量用户页面进行了修改的场景,代价估计模块可能标记为不需要压缩。此时将用户页面修改的部分作为补丁页面,存放到存储页面中,并标记补丁页面的大小。完成整个文件中所有缓存块的压缩计算后,更新该文件的平均压缩比。
[0140] 在一个示例性实施例中,文件系统,还包括:代价评估模块,其中,缓存模块,用于检测逻辑文件的每个分块区间的用户数据的读放大系数,其中,读放大系数用于指示数据产生读放大现象的程度;代价评估模块,用于根据读放大系数决策每个分块区间的用户数据重新压缩时的压缩信息,其中,压缩信息包括:是否压缩和压缩算法;压缩模块,用于按照压缩信息对每个分块区间的用户数据进行重新压缩。
[0141] 缓存模块会跟踪缓存失效频率、用户页面中访问到的数据量与载入到存储页面的数据量,计算读放大系数。当系统缓存不足时,会清理长期没有读写操作的缓存块,该文件块的缓存即为失效状态,再次读写操作,需要重新从磁盘中载入数据到存储页面中。一段时间窗口内,该缓存块失效,再次发生读写的次数,设定为缓存失效频率系数。在缓存块有效期间,记录从磁盘中读取到存储页面的数据量,用户页面中访问到的数据量,存储页面的数据量除以用户页面访问到的数据量,设定为读放大比。一段时间窗口内,读放大比的累加和,等于读放大系数,作为该分块的空间局部性评估指标,决定该分块数据再次落盘时,是否值得采用压缩存储的方式。
[0142] 在一个示例性实施例中,缓存模块,用于:检测每个分块区间的用户数据上执行每次读操作时读取出的数据量和用户访问到的数据量;计算读取出的数据量与用户访问到的数据量之间的比值,得到每次读操作的读放大比;将目标时间窗口内读放大比的累加和确定为读放大系数。
[0143] 由于并不是所有的文件,都能够准确预知其访问时的空间局部性特征,因此,本实施例中引入读放大系数作为动态判断文件是否应该压缩的辅助手段,举例说明,图12是根据本申请实施例的一种文件压缩的判断过程的示意图,如图12所示,假设文件以4KB作为页面,以4个页面作为分块压缩长度,数据压缩为2:1,T2‑T4表示一段时间窗口内(如5秒钟),发了3次缓存失效,每次缓存有效期间,数据的读写访问过程,T1时刻,进行文件的写入操作,(a)与(b)分块均使用压缩存储,所需存储空间都为8KB;T2时刻,(a)与(b)分块均只访问了一个4KB页面,读放大比都为2;T3时刻,(a)分块只访问了4KB,读放大比为2;(b)分块访问了8KB,读放大比为1;T4时刻,(a)分块只访问4KB,读放大比为2;(b)分块访问了16KB,读放大比为0.5;T5时刻,发生文件的再次写入操作,此时(a)分块读放大系数为6,(b)分块读放大系数为3.5,同时读取了3次,写入了2次,读取与写入的比例为1.5。代价估计模块中,接收到参数后,会根据压缩计算带宽与IO读写带宽,估计该文件块是否压缩存储。由于(a)分块读放大系数较高,每次读取操作中无效的磁盘读取与解压计算比例高,而且文件的读取操作大于文件的写入操作,因此(a)分块会被代价估计模块标记为不压缩,压缩模块将不进行压缩计算,采用非压缩存储,以适应该分块的读写局部性特征,减少不必要的磁盘读取与解压计算。
[0144] 在一个示例性实施例中,代价评估模块,还用于:根据文件系统的硬件资源属性预测逻辑文件的每个分块区间的用户数据的压缩性能收益;按照压缩性能收益控制压缩模块对每个分块区间的用户数据进行压缩。
[0145] 对于代价估计模块,本实施例可以针对的硬件平台,除了常规存储服务器中的CPU、内存、磁盘外。还可以具有专用硬件压缩加速卡以及不同的存储介质。图13是根据本申请实施例的一种硬件平台的示意图,如图13所示,用户层的各种应用程序(MySQL、PostgreSQL、Oracle等)会向存储层发起读写操作。由于不同数据的存储需求不同(优先节省存储空间、优先考虑访问延迟),系统负载不同(CPU(中央处理器)、加速卡、存储设备IO),数据的访问特征不同(顺序访问、随机访问),存储介质的存储特性不同(机械盘与SSD盘(固态硬盘)读写带宽差异巨大,同时SSD盘又存在写放大与读写寿命问题)。
[0146] 在压缩存储中,如何在复杂的硬件配置与负载环境中选择最优的存储策略,是本领域亟待解决的问题。本实施例中在代价估计模块中,会评估压缩计算与存储代价,对不同缓存块进行优先级分类处理,进而将压缩任务分配到专用硬件或通用处理器进行压缩计算,同时读写过程中,对数据的缓存方式与压缩编码存储方式进行动态的调整适配。
[0147] 值得说明的是,本实施例中通过Fuse的VFS接口模块,用户可以设置文件系统的硬件配置参数,文件进行读写是的存储性能参数,用于代价估计模块进行计算,相关参数如下:
[0148] 1)所有可用存储设备的顺序读写带宽( )与随机读写带宽 。例如:固态盘的顺序带宽( ),U盘的随机读写带宽( )。
[0149] 2)所有可用压缩计算设备及压缩算法的算力带宽 ,例如:CPU执行gzip算法的带宽( ),FPGA执行lz77算法的带宽(
)等。
[0150] 3)文件落盘时的优先级( )。用户在mount文件系统时会设置文件系统的落盘优先级 ,同时,也可以通过vfs的扩展属性设置某个文件的落盘优先级( 可以覆盖 )。
[0151] 4)存储偏置值 ,读偏置值 ,写偏置值 。在压缩存储场景下,用户通过偏置值,设定数据存储时是偏向节省存储空间,读写时是偏向读延迟还是偏向写延迟。
[0152] 5)优化存储模式 ,选择主动优化还是被动优化。
[0153] 在本实施例中,代价估计模块,具备如下功能:
[0154] 功能1,对应用层发出的读写请求,进行优先级分类。服务器中会有大量的应用程序,时刻进行着不同的数据读写访问,需要设置合理的评估机制,对哪些数据进行优先处理。传统方式中,当用户数据需要落盘时,操作系统内核会将内存里所有的脏页数据逐个传输到对应存储介质中,缺少优先级策略的管理,往往带来较差的用于体验。举例来说:当用户插入U盘到电脑工作一段时间,进行了向本地磁盘以及U盘的数据写入操作,当用户需要将U盘拔出时,需要将内存的数据回写到U盘中。传统方式条件下,不会优先处理U盘数据的落盘,而是将当前时刻所有的内存脏页数据,回写到各自的存储介质中,其中就包括了写入本地磁盘的数据页面。U盘数据落盘往往需要等待磁盘与U盘数据全部落盘后才可以拔出,造成用户需要较长的等待时间。相似场景还有,电力系统通知还有5分钟断电,用户需要在这5分钟内,尽量保存高优先级的重要数据,如:PPT,Word文档;最后却保存了不重要的数据,如:下载的电影,浏览器记录。本实施例中,代价估计模块对于上述情况,可以按照文件优先级对文件进行先后落盘,保证对用户更加重要的数据优先落盘。
[0155] 功能2,数据的存储格式选择,包括:压缩存储、非压缩存储、压缩结合补丁页面存储,压缩分块大小。并不是所有的场景下,都适合将数据进行压缩存储。首先,低圧缩比数据块进行压缩,不仅无法获得存储空间收益,反而会降低读写性能;其次,将多个页面放在一起压缩,而用户实际仅读取少量页面的场景下,所产生的读放大效应,也会增加读取延迟;再次,对于IO带宽较高的场景下,虽然压缩能够获得存储空间收益,但写入延迟会比非压缩存储低;最后,并不是所有场景下,用户都能够明确知道文件访问的局部性特征,对文件的读写特征在访问的过程中才能够得知,采用默认分块大小进行压缩,并不能取得理想效果。
因此,本实施例中代价估计模块,会根据获得的压缩比、缓存模块对数据的读写特征,估计不同方式的性能收益,结合用户通过扩展属性对文件读写需求的设定,决定文件采用的存储格式。
[0156] 功能3,压缩计算与存储任务规划。不同的压缩算法有着不同的压缩比与计算耗时,同时系统中包含了用于压缩的计算单元与用于IO的存储单元,由于系统某一时刻下的计算单元与IO存储单元的负载是动态变化的,单纯的采用固定算法,而不考虑当时的负载状态,会导致需要紧急落盘的数据在计算单元或IO存储单元中排队等待,产生不必要的延迟。同时,硬件加速卡往往具备不同压缩算法并行计算的能力,能够极大提升压缩效率。因此,代价估计模块会根据当前系统的复杂状况,以及用户的落盘需求,选择合理的压缩算法,将缓存块的落盘任务分配到合理的计算单元与存IO存储器中。
[0157] 功能4,存储空间分配。不同存储介质的顺序读取性能与随机读取性能差异较大,但通常顺序读取性能优于随机读取性能。当数据进行频繁修改时,由于压缩比的变动,原有位置可能无法存放,此时压缩块是分散存放在已有空闲空间中,还是新分配一块连续的存储空间,需要代价估计模块根据对文件的访问特征做出平衡。
[0158] 功能5,存储空间整理与优化。随着对压缩文件的不断修改,由于压缩块是变长的,因此会在存储空间中产生大量的零碎的空闲空间,数据块被随机的存放在磁盘中,会导致数据的读写性能减低与压缩存储的收益降低。本发明中,代价估计模块,根据缓存模块对用户读写访问的监控信息,以及编码模块的编码信息,估算对文件进行重新编码的代价与收益。
[0159] 对于用户的写入数据请求,会先在缓存模块中进行缓存,在合适的时机,将数据批量的写入到存储设备。在本实施例中,如下4种情况下会触发落盘操作:
[0160] 情况一,强制落盘指令,对应于用户对某个文件执行强制落盘命令。例如:编写word文档时点击保存按钮,对应于文件操作vfs的flush接口。
[0161] 情况二,释放空间指令,当缓存模块中内存不足时,需要释放部分缓存,以载入新数据,释放过程中用户写入的数据会回写到磁盘中。
[0162] 情况三,定时回写指令,缓存模块按定时周期,将用户写入的数据回写到磁盘中。
[0163] 情况四,优化存储指令,代价估计模块发起对文件的优化存储。将数据进行重新整理后写入磁盘。
[0164] 在本实施例中还提供了一种文件的压缩存储方法,图14是根据本申请实施例的文件的压缩存储方法的流程图,如图14所示,该流程包括如下步骤:
[0165] 步骤S1402,在接收到第一指令的情况下,检测第一指令所指示落盘的第一文件的第一落盘参数和第一压缩参数,其中,第一指令是数据的落盘延迟时间的落盘优先级高于数据的落盘存储空间的落盘优先级的落盘指令,第一落盘参数用于指示在目标时间内能够落盘的缓存块数量,第一压缩参数用于指示在目标时间内能够压缩的缓存块数量;
[0166] 步骤S1404,对第一文件中符合第一落盘参数的第一组缓存块进行落盘,同时对第一文件中符合第一压缩参数的第二组缓存块进行压缩得到第一压缩块集合;
[0167] 步骤S1406,对第一压缩块集合进行落盘。
[0168] 通过上述步骤,当接收到数据的落盘延迟时间的落盘优先级高于数据的落盘存储空间的落盘优先级的落盘指令,即第一指令,对其指示落盘的第一文件的第一落盘参数和第一压缩参数进行检测,从而检测出在目标时间内能够落盘的缓存块数量以及在所述目标时间内能够压缩的缓存块数量,同时对第一文件中符合第一落盘参数的第一组缓存块进行落盘,以及对第一文件中符合第一压缩参数的第二组缓存块进行压缩得到第一压缩块集合,再对第一压缩块集合进行落盘。从而在数据的落盘延迟时间的落盘优先级高于数据的落盘存储空间的落盘优先级的情况下,对需要落盘的文件中的部分数据进行压缩,同时对另一部分数据直接进行落盘,由于二者使用的时间均为目标时间,因此直接落盘的数据落盘结束后,进行压缩的数据也压缩结束了,从而继续进行落盘,不会出现空闲时间被浪费的情况。因此,可以解决文件的压缩存储效率较低的技术问题,达到提高文件的压缩存储效率的技术效果。
[0169] 其中,上述步骤可以但不限于由上述代价估计模块执行,但不限于此。
[0170] 在本实施例中,上述第一指令是数据的落盘延迟时间的落盘优先级高于数据的落盘存储空间的落盘优先级的落盘指令,第一指令可以但不限于包括上述强制落盘指令,这种指令对于落盘延迟时间的要求更高,比如:用户手动点击保存按钮的指令,用户关闭文件触发的自动保存文件的指令等等。
[0171] 对于适用于强制落盘指令的缓存,以数据的落盘延迟时间为最高优先级,尽快完成数据的落盘任务。该场景下,用户需要尽快完成数据的落盘操作,不考虑数据的存储空间优化或者读取性能优化等因素。
[0172] 对于用户发出的落盘指令,可能同时包含多个文件,通常相同的文件中的文件块有类似的压缩比。硬件加速卡可以并行执行多种压缩算法,不同的压缩算法获得的压缩比与所需的压缩时间不同。在文件进行IO存储操作时,加速卡可以同时进行压缩计算操作。
[0173] 在一个示例性实施例中,可以但不限于通过以下方式检测第一指令所指示落盘的第一文件的第一落盘参数和第一压缩参数:确定落盘缓存块的第一耗时,以及确定使用第一压缩算法压缩缓存块的第二耗时;根据第一耗时和第二耗时确定能够同时完成缓存块的落盘和压缩的目标时间;计算在目标时间内能够落盘的缓存块数量作为第一落盘参数,并计算在目标时间内能够压缩的缓存块数量作为第一压缩参数。
[0174] 在本实施例中,可以但不限于通过落盘缓存块的第一耗时,以及第一压缩算法压缩缓存块的第二耗时确定同时进行压缩和落盘的缓存块的数量。第一压缩算法可以但不限于是所支持的压缩算法中的一种压缩算法,比如:随机选取的一个压缩算法,或者压缩速度最慢的压缩算法等等。
[0175] 在一个示例性实施例中,可以但不限于采用以下方式确定落盘缓存块的第一耗时,以及确定使用第一压缩算法压缩缓存块的第二耗时:计算n个缓存块的落盘耗时作为第一耗时,并计算使用第一压缩算法压缩n个缓存块的压缩耗时作为第二耗时,其中,第一压缩算法是允许使用的多个压缩算法中计算速度最慢的压缩算法;可以但不限于采用以下方式根据第一耗时和第二耗时确定能够同时完成缓存块的落盘和压缩的目标时间:将第一耗时与第二耗时的最小公倍数确定为目标时间;计算在目标时间内能够落盘的缓存块数量作为第一落盘参数,并计算在目标时间内能够压缩的缓存块数量作为第一压缩参数,包括:将第一落盘参数确定为n与目标时间之间的乘积与第一耗时的商值,以及将第一压缩参数确定为n与目标时间之间的乘积与第二耗时的商值。
[0176] 在本实施例中,n可以但不限于是压缩过程中一次压缩的缓存块数量。比如:如果压缩算法每次将4个缓存块压缩为压缩块,n可以但不限于为4。计算最慢的压缩算法计算4个缓存块的耗时 ,计算顺序存储一个缓存块的落盘耗时 ,计算与 的最小公倍数 。第一个分组中的缓存块个数为
,第二个分组中的缓存块个数为 。经过
上述分组后,第一个分组进行直接IO存储的耗时,等于第二个分组进行压缩计算的耗时。
[0177] 举例说明,假设GZIP算法为可用算法中计算最慢的算法(算法带宽由用户挂载文件系统时通过扩展属性设定),计算4个1MB缓存块的耗时为9ms,顺序存储4个1MB缓存块耗时21ms,两者公倍数为63ms,因此第一个组内分块个数为12个,第二个组内个数为28个。两个分组的IO消耗时间与压缩计算时间耗时相同。
[0178] 在一个示例性实施例中,可以但不限于采用以下方式对第一文件中符合第一落盘参数的第一组缓存块进行落盘:从第一文件中提取符合第一落盘参数的第一组缓存块;将第一组缓存块插入存储器输入输出队列中,其中,在存储器输入输出队列中第一组缓存块优先被落盘。
[0179] 在本实施例中,将第一组缓存块插队存入到存储器IO队列中,使存储器优先处理该缓存块。由于采用插队方式优先处理该类型的缓存块,因此该场景下不考虑存储设备的当前动态负载。
[0180] 在一个示例性实施例中,可以但不限于通过以下方式对第一文件中符合第一压缩参数的第二组缓存块进行压缩得到第一压缩块集合:从第一文件中提取符合第一压缩参数的第二组缓存块;采用第一压缩算法集合中的压缩算法并行对第二组缓存块进行压缩运算,得到多个压缩块集合,其中,第一压缩块集合包括多个压缩块集合,第一压缩算法集合中包括N种压缩算法,N大于1。
[0181] 在本实施例中,将第二组缓存块插入所有可用压缩计算单元的任务队列,所有可用计算单元采用并行计算方式进行压缩计算,获取不同方式的压缩比与计算耗时。比如使用硬件加速方式执行GZIP/LZ77/Snappy算法的压缩比与计算耗时,使用CPU计算GZIP/LZ77/Snappy算法的压缩比与计算耗时。
[0182] 在一个示例性实施例中,可以但不限于通过以下方式对第一压缩块集合进行落盘:在允许使用的压缩算法为第一压缩算法集合的情况下,将第一压缩块集合中采用第二压缩算法得到的压缩块进行落盘,其中,第一压缩算法集合中包括N种压缩算法,N大于1,第二压缩算法是N种压缩算法中落盘时间最短的压缩算法,第一压缩块集合包括多个压缩块集合,多个压缩块集合是采用N种压缩算法并行对第二组缓存块进行压缩运算得到的。
[0183] 在本实施例中,N种压缩算法并行对全部的第二组缓存块进行压缩,将落盘时间最短的压缩算法得到的压缩块落盘,从而更加保障落盘时间的缩短,提高落盘效率。举例说明:假设一个12MB的缓存块,磁盘的顺序写入带宽为120MB,不同压缩方式的耗时为:GZIP耗时100ms,Snappy耗时为40ms。压缩比分别为:GZIP压缩比4:1,Snappy压缩比为2:1。则各种方式的落盘延迟为:非压缩方式100ms,GZIP方式100ms+25ms=125ms,Snappy方式40+50=90ms。尽管Gzip算法可以获得更高的存储空间收益,然而在强制落盘指令场景下,需要的是低的落盘延迟,因此Snappy算法评估为具有压缩收益。同时经过前期采样判断,文件中各部分的压缩比基本一致,因此后续数据都采用该压缩存储方式,可获得更短的落盘延迟。
[0184] 在一个示例性实施例中,在将第一压缩块集合中采用第二压缩算法得到的压缩块进行落盘之后,可以但不限于通过以下方式继续对第一文件进行落盘:采用第二压缩算法对第一文件中剩余未落盘缓存块进行压缩落盘。
[0185] 在本实施例中,对于第一文件中的其他文件可以采用上述落盘时间最短的第二压缩算法进行压缩落盘,最大限度的提高落盘时间的收益。
[0186] 在一个示例性实施例中,可以但不限于通过以下方式将第一压缩块集合中采用第二压缩算法得到的压缩块进行落盘:检测N种压缩算法中每种压缩算法得到的压缩块的压缩比;在N种压缩算法的压缩比一致的情况下,将第一压缩块集合中采用第二压缩算法得到的压缩块进行落盘。
[0187] 在本实施例中,采用落盘时间最短的第二压缩算法的方式进行落盘可以但不限于是在每种压缩算法对于文件的压缩比一致的情况下。执行到了对压缩比进行比较的步骤,可以说至少有一种压缩算法,对于某个缓存块是可以获得存储延迟的收益的。但由于文件块中的数据并不一定都有相同的压缩比,可能有的块收益高,有的收益低甚至没有收益。本实施例中采用分块采样的方式,确定文件分块后的缓存块是否具备类似的压缩比,从而采取不同的存储策略。
[0188] 举例说明,多个文件缓存块分为一个组,一个组内的缓存块使用相同的压缩方式进行压缩,比较一个组内的各个缓存块所获得的压缩比,计算方差δ,方差较小意味着文件内容本身具有相似性,可以获得相似的压缩比。否则表示文件块的内容不具备相似性,文件块中的内容不同位置有着不同的压缩比。
[0189] 在一个示例性实施例中,在检测N种压缩算法中每种压缩算法得到的压缩块的压缩比之后,可以但不限于通过以下方式继续对第一文件进行落盘:在N种压缩算法的压缩比不一致的情况下,从第一压缩块集合中获取第二组缓存块中每个缓存块对应的落盘时间最短的压缩块,得到第二压缩块集合;将第二压缩块集合进行落盘。
[0190] 由于数据分块的压缩比方差δ较大,各种不同的压缩方式对数据块无法获得统一的收益比例。因此该场景下,本实施例采用多算法并行计算,计算完成后只保留有整体收益的算法。举例说明,假设分组2内有28个缓存块,采用Gzip、LZ77、Snappy三种不同压缩算法。比较每一个数据块采用不同算法的计算耗时与压缩后的存储耗时,得到该压缩块最短落盘时间的压缩算法。如果28个缓存块都没有使用Gzip作为最优算法,则后续计算中剔除GZIP算法。
[0191] 将不同压缩方式中,最小IO延迟的数据进行落盘。由于当前时刻分组2已经付出了压缩计算的代价,因此对于分组2的落盘,只考虑最小的IO代价,将数据进行落盘。
[0192] 在一个示例性实施例中,在将第二压缩块集合进行落盘之后,可以但不限于通过以下方式继续对第一文件进行落盘:检测第一文件中除第一组缓存块合第二组缓存块之外的剩余缓存块的第二落盘参数和第二压缩参数,其中,第二落盘参数用于指示在参考时间内能够落盘的缓存块数量,第二压缩参数用于指示在参考时间内能够压缩的缓存块数量;对剩余缓存块中符合第二落盘参数的第三组缓存块进行落盘,同时对剩余缓存块中符合第二压缩参数的第四组缓存块进行压缩得到第三压缩块集合;对第三压缩块集合进行落盘。
[0193] 在本实施例中,第一文件中的剩余数据可以继续采用重新分组的方式,采用存储与压缩计算并行方式落盘。在压缩集合中所保留的算法中,选择最慢的算法,采用上述分组方式,对剩余数据进行重新分组。对第X个集合存储的时候,并行对第X+1个集合进行压缩计算,使得当第X个集合完成存储操作时,第X+1个集合完成多种压缩算法的并行计算,选择最小IO耗时的缓存块进行落盘操作。
[0194] 在一个示例性实施例中,可以但不限于通过以下方式对剩余缓存块中符合第二压缩参数的第四组缓存块进行压缩得到第三压缩块集合:从剩余缓存块中提取符合第二压缩参数的第四组缓存块;采用第二压缩算法集合中的压缩算法并行对第四组缓存块进行压缩运算,得到第三压缩块集合,其中,第二压缩算法集合中包括第一压缩算法集合中N‑m种压缩算法,m大于或者等于1,m种压缩算法是第二压缩块集合中的压缩块均未使用的压缩算法。
[0195] 在本实施例中,假设计算4个1MB缓存块的耗时为4ms,顺序存储4个1MB缓存块耗时16ms,两者公倍数为16ms,因此第一个组内分块个数为4个,第二个组内个数为16个,两个分组的IO消耗时间与压缩计算时间耗时相同为16ms;16ms时刻,第一个分组数据完成落盘,假设第二个分组的最优压缩比为4:1,则需要落盘的压缩块为4个1MB缓存块,所需存储耗时为
4ms,由于计算耗时为16ms,因此第二个组内再添加12个1MB缓存块,第三个组内分配16个缓存块;32ms时刻,第二个分组数据以压缩结合非压缩的格式完成落盘,同时第三个分组的数据完成计算。本实施例的方案,在无法确定文件中分块压缩比的情况下,优先保障存储IO的满负荷运转,同时插入压缩计算,以获取可能的收益。
[0196] 在一个示例性实施例中,可以但不限于通过以下方式对第一压缩块集合进行落盘:检测第一压缩块集合的压缩收益信息,其中,压缩收益信息用于指示对第一压缩块集合进行落盘相对于对第二组缓存块进行落盘是否存在落盘延迟的收益;在压缩收益信息用于指示存在落盘延迟的收益的情况下,对第一压缩块集合进行落盘;在压缩收益信息用于指示不存在落盘延迟的收益的情况下,对第二组缓存块以及第一文件中除第一组缓存块和第二组缓存块之外的剩余缓存块进行非压缩落盘。
[0197] 在本实施例中,对第一压缩块集合进行落盘时可以计算所有压缩结果是否有压缩收益。方法可以为:记录不同方式压缩的耗时与压缩比,根据用户设置的磁盘顺序读写带宽( ),计算非压缩与不同压缩算法得到的存入磁盘的耗时,评估使用压缩存储是否能够获得落盘延迟的收益。对于任何压缩算法都无法取得压缩收益的情况,后续所有的该文件的缓存块均使用非压缩存储。从而节省压缩时间,提高落盘效率。举例说明:如果所有的缓存块,在任何压缩算法下,压缩耗时和压缩后的存储耗时之和都大于直接存储耗时,则该文件内容压缩比过小,判定为不适合压缩存储,所有的缓存块采用非压缩存储方式。
[0198] 基于上述过程,本实施例按照文件为单位进行缓存块落盘处理,利用磁盘IO与加速卡可以并行计算的特性,以最大程度降低缓冲块落盘的延迟,图15是根据本申请实施例的一种文件的压缩存储过程的示意图,如图15所示,该过程可以但不限于包括如下步骤:
[0199] 步骤1:获取同一文件索引的缓存块。从红黑树的最左侧开始遍历,按照加权后的落盘优先级依次获取文件索引,找到文件索引所指向的缓存块。
[0200] 步骤2:将缓存块取样后分组。得到落盘耗时和压缩耗时相同的第1组缓存块和第2组缓存块。
[0201] 步骤3:将第1组缓存块插队存入到存储器IO(输入输出)队列中,使存储器优先处理该缓存块。由于采用插队方式优先处理该类型的缓存块,因此该场景下不考虑存储设备的当前动态负载。
[0202] 步骤4:将第2组缓存块,插入所有可用压缩计算单元的任务队列,所有可用计算单元采用并行计算方式进行压缩计算,获取不同方式的压缩比与计算耗时。
[0203] 步骤5:计算步骤4中,所有计算结果是否有压缩收益。对于任何压缩算法都无法取得压缩收益的情况,执行步骤9。
[0204] 步骤6:判断压缩比是否一致。执行到步骤6,证明至少有一种压缩算法,对于某个缓存块是可以获得存储延迟的收益。但由于文件块中的数据并不一定都有相同的压缩比,可能有的块收益高,有的收益低甚至没有收益。本实施例中采用分块采样的方式,确定文件分块后的缓存块是否具备类似的压缩比,从而采取不同的存储策略。
[0205] 步骤7:将最短落盘时间的数据块落盘。当压缩存储具备落盘延迟的收益,而且文件内容具有一致的压缩比时,会执行到步骤7。第1组缓存块,以非压缩格式顺序存储的方式插队进入磁盘IO队列中;第2组缓存块以不同的压缩方式,得到了压缩数据的压缩比与压缩耗时 。计算最快落盘的方式对应的压缩方案。根据不同压缩算法的压缩耗时、压缩比、磁盘延迟获取最短时间落盘方案。将采用最短时间落盘方式计算的压缩块进行落盘操作。
[0206] 步骤8:剩余未落盘数据,全部按照最短时间落盘方式,进行计算后落盘。
[0207] 步骤9:后续所有的该文件的缓存块均使用非压缩存储。
[0208] 步骤10:计算第2组缓存块内不同压缩方法的计算耗时与IO存储延迟。由于数据分块的压缩比方差δ较大,各种不同的压缩方式对数据块无法获得统一的收益比例。因此该场景下,本发明采用多算法并行计算,计算完成后只保留有整体收益的算法。
[0209] 步骤11:将不同压缩方式中,最小IO延迟的数据进行落盘。由于当前时刻第2组缓存块已经付出了压缩计算的代价,因此对于第2组缓存块的落盘,只考虑最小的IO代价,将数据进行落盘。
[0210] 步骤12:剩余数据采用步骤2方式,重新分组后,采用存储与压缩计算并行方式落盘。图16是根据本申请实施例的一种文件的压缩落盘过程的示意图,如图16所示,在步骤10中所保留的算法中,选择最慢的算法,采用步骤2的方式,对剩余数据进行重新分组。对第X组缓存块存储的时候,并行对第X+1组缓存块进行压缩计算,使得当第X组缓存块完成存储操作时,第X+1组缓存块完成多种压缩算法的并行计算,选择最小IO耗时的缓存块进行落盘操作。
[0211] 在一个示例性实施例中,可以但不限于通过以下方式处理数据的落盘存储空间的落盘优先级高于数据的落盘延迟时间的落盘优先级的落盘指令:在接收到第二指令的情况下,检测第二指令所指示落盘的第二文件中每个缓存块的存储参数,其中,第二指令是数据的落盘存储空间的落盘优先级高于数据的落盘延迟时间的落盘优先级的落盘指令,存储参数用于指示对每个缓存块进行存储的性能;根据存储参数从多种存储方式中查找与每个缓存块匹配的目标存储方式;采用目标存储方式对每个缓存块进行落盘。
[0212] 在本实施例中,第二指令是数据的落盘存储空间的落盘优先级高于数据的落盘延迟时间的落盘优先级的落盘指令,第二指令可以但不限于包括上述的定时回写指令,这种指令对于落盘存储空间的要求更高,比如:操作系统的定时保存的指令,应用程序的定时保存的指令等等。
[0213] 对于定时回写指令,该场景下为定时触发用户数据的落盘,对数据落盘的延迟要求不高,本实施例在该场景下,兼顾用户对文件读写扩展属性的设定,侧重考虑存储空间的节省以及之后数据读取的延迟。
[0214] 在一个示例性实施例中,可以但不限于通过以下方式检测第二指令所指示落盘的第二文件中每个缓存块的存储参数:检测每个缓存块在多种存储方式中的每种存储方式下的存储代价参数和读写代价参数,其中,存储代价参数用于指示使用对应的存储方式在存储空间上的收益,读写代价参数用于指示使用对应的存储方式在读写性能上的收益,多种存储方式至少包括:非压缩存储,多种压缩算法中每种压缩算法存储。
[0215] 在本实施例中,多种存储方式至少包括:非压缩存储,多种压缩算法中每种压缩算法存储,可以但不限于以存储的收益和读写的收益结合来选取出使用的存储方式。选取出的存储方式更加符合各个缓存块的情况和需求。
[0216] 在一个示例性实施例中,可以但不限于通过以下方式检测每个缓存块在多种存储方式中的每种存储方式下的存储代价参数和读写代价参数:检测每个缓存块在每种存储方式下所占用的存储空间作为存储代价参数;检测每个缓存块在每种存储方式下的写入代价和读取代价作为读写代价参数,其中,写入代价用于指示将数据写入磁盘的耗时,读取代价用于指示从磁盘中读取数据的耗时。
[0217] 在本实施例中,存储代价参数用于指示使用对应的存储方式在存储空间上的收益,比如:占用存储空间,压缩比等。读写代价参数用于指示使用对应的存储方式在读写性能上的收益,比如:写入耗时,读取耗时等等。
[0218] 以非压缩存储,Gzip压缩存储和Snappy压缩存储为例,非压缩存储对应的存储代价参数为存储空间1MB,读写代价参数为写入耗时10ms和读取耗时5ms。Gzip压缩存储对应的存储代价参数为压缩后100KB,读写代价参数为写入耗时4ms和读取耗时3ms。Snappy压缩存储对应的存储代价参数为压缩后200KB,读写代价参数为写入耗时5ms,读取耗时2ms。
[0219] 在一个示例性实施例中,可以但不限于通过以下方式检测每个缓存块在每种存储方式下的写入代价和读取代价作为读写代价参数:检测每个缓存块在每种存储方式下的单次写入耗时和单次读取耗时;获取每个缓存块在当前时间之前的目标时间段内的写入次数和读取次数;将单次写入耗时与写入次数的乘积确定为写入代价,并将单次读取耗时与读取次数的乘积确定为读取代价。
[0220] 在本实施例中,根据读写次数统计计算不同存储方式的缓存块读写代价估计值。缓存模块会进行读写次数统计,考虑不同存储方案下,多次读写的累加时间,得到不同方式的读写代价估计值。举例说明:假设需要处理1MB的大小缓存块。硬件条件为:IO写入带宽
100MB/s、IO读取带宽200MB/s;某个压缩算法的压缩带宽500MB/s、解压带宽100MB/s。获得的压缩比2:1。一定时间周期内,缓存模块监控到,写入2次,读取10次,同时读放大系数为2:
1。非压缩存储的代价包括:写入10ms, 读取2.5ms(整个1MB数据读取耗时5ms,由于读放大系数为2:1,表示实际只读取了一半的数据,在非压缩存储条件下,可只读取需要的数据,因此耗时2.5ms)。读写累加后,代价估计值为:写入20ms,读取25ms。压缩存储的代价包括:压缩耗时2ms、压缩后500KB、IO写入耗时5ms、写入总耗时7ms,文件读取耗时2.5ms,解压耗时
5ms,读取总耗时7.5ms。读写累加后,代价估计值为:写入14ms,读取75ms。
[0221] 在一个示例性实施例中,可以但不限于通过以下方式根据存储参数从多种存储方式中查找与每个缓存块匹配的目标存储方式:获取每个缓存块的存储偏置值和读写偏置值,其中,存储偏置值用于指示用户对于节省存储空间的要求,读写偏置值用于指示用户对于节省写入时间和读取时间的要求;根据存储偏置值,读写偏置值以及存储参数确定每种存储方式的存储总收益;将多种存储方式中存储总收益最高的存储方式确定为目标存储方式。
[0222] 在本实施例中,根据文件的存储偏置值,确定缓存块的落盘格式。文件存储偏置值,表达了用户期望数据在存储中,偏向存储空间节省,还是偏向读写性能,在读写中是偏向读还是写,本实施例根据用户设置的偏置值进行最终存储格式的选择。压缩后的大小乘以存储偏置值与原始数据进行比较用于决策是否忽略压缩收益。不同方式的读写代价估计值乘以读写偏置值用于决策采用哪种压缩方案。
[0223] 举例说明:从用户的角度,能够即节省空间也提高读写性能,固然是最好的选择,但无法同时满足条件时,便需要进行权衡取舍。比如,用户的数据量少或经费充足,并不太关心磁盘空间的占用,可以接收数据修改时的写入延迟,但对于数据的读取延迟极为敏感。则用户设置的偏置值如下:存储偏置为10,写入偏置值为10,读取偏置值为6。对于1MB数据块,假设不同存储方式的代价估计值如下:
[0224] 非压缩存储:存储空间1MB,写入耗时10ms,读取耗时5ms。
[0225] Gzip压缩存储:压缩后100KB,写入耗时4ms,读取耗时3ms。
[0226] Snappy压缩存储:压缩后200KB,写入耗时5ms,读取耗时2ms。
[0227] 不同压缩方式乘以存储偏置值后均大于原始值,因此代价估计策略中,忽略存储空间收益。判断读写性能收益,各种不存储方式的总代价为:
[0228]
[0229] 综合后,Snappy的代价值最小,因此该缓存还是用Snappy压缩算法进行存储。
[0230] 图17是根据本申请实施例的一种定时回写指令触发的压缩存储过程的示意图,如图17所示,该过程可以但不限于包括如下步骤:
[0231] 步骤1:将缓存块传输到加速卡中,并行执行不同压缩算法。比如:将缓存块传输到FPGA内存中,并行执行可用的压缩算法,获取不同压缩算法的压缩比。
[0232] 步骤2:从编码模块获取可用存储空间信息。从编码模块中获取当前数据块是否可能分配到离散的存储空间。由于数据不断的修改,编码模块中会产生大量的碎片空间,虽然对这些离散的存储空间读写性能较低,但可以节省存储空间。
[0233] 步骤3:计算不同存储格式单次写入耗时与读取耗时。根据获得的压缩比,计算使用非压缩格式、压缩格式、压缩+补丁格式、在连续空间存放与离散空间存放的写入与读取耗时。举例说明:假设需要处理1MB的大小缓存块。硬件条件为:IO顺序写入带宽100MB/s、IO顺序读取带宽200MB/s;某个压缩算法的压缩带宽500MB/s、解压带宽100MB/s。文件非压缩存储代价:IO写入耗时10ms,读取耗时5ms。
[0234] 假设获得的压缩比5:1,那么压缩存储代价:压缩耗时2ms、压缩后200KB、IO写入耗时2ms、写入总耗时4ms,文件读取耗时1ms,解压耗时2ms,读取总耗时3ms。该场景下,读取和写入采用压缩存储均能获得较好的收益,因此该缓存块中可以从压缩获取读写两方面的收益。
[0235] 假设获得的压缩比2:1,那么压缩存储代价:压缩耗时2ms、压缩后500KB、IO写入耗时5ms、写入总耗时7ms,文件读取耗时2.5ms,解压耗时5ms,读取总耗时7.5ms。该场景下,写入获得了性能收益,但读取性能反而会下降,后续会根据文件的读写次数进行进一步的代价估计。
[0236] 假设在1MB缓存块在磁盘中已经存储过,压缩比为5:1,实际占用200KB的存储空间,用户修改了64KB的数据,此时计算压缩存储+补丁页面的方案的代价,不修改原有压缩块,只落盘64KB修改的页面所需的耗时,用于后续步骤的代价估计。
[0237] 步骤4:根据读写次数统计计算不同存储方式的缓存块读写代价估计值。缓存模块会进行读写次数统计,考虑不同存储方案下,多次读写的累加时间,得到不同方式的读写代价估计值。
[0238] 步骤5:根据文件的存储偏置值,确定缓存块的落盘格式。文件存储偏置值,表达了用户期望数据在存储中,偏向存储空间节省,还是偏向读写性能,在读写中是偏向读还是写,本发明根据用户设置的偏置值进行最终存储格式的选择。压缩后的大小乘以存储偏置值与原始数据进行比较,用于决策是否忽略压缩收益。不同方式的读写代价估计值,乘以读写偏置值,用于决策采用哪种压缩方案。
[0239] 在一个示例性实施例中,可以但不限于通过以下方式处理对内存空间进行释放的指令:在接收到第三指令的情况下,从目标内存空间中获取待落盘的目标缓存块,其中,第三指令用于指示对目标内存空间进行释放;对目标缓存块进行压缩并检测目标缓存块的压缩比;根据目标缓存块的压缩比对目标缓存块进行落盘并释放目标缓存块占用的内存空间。
[0240] 在本实施例中,第三指令用于指示对目标内存空间进行释放,第三指令可以但不限于包括上述的释放空间指令,这种指令用于对于内存空间进行整理,其可以是用户触发的,也可以是系统自动触发的。
[0241] 对于释放空间指令,以快速释放内存空间为最高优先级,侧重于释放更多的空闲内存。当系统内存空间不足,剩余内存低于低水位标记时,便可以触发释放空间指令,期望释放更多的内存空间。由于硬件压缩算法的传输耗时与计算耗时通常远快于磁盘IO,同时硬件压缩卡自身有一定容量的内存空间,可作为临时的备份缓存。
[0242] 在一个示例性实施例中,可以但不限于通过以下方式对目标缓存块进行压缩并检测目标缓存块的压缩比:采用最高压缩比的压缩算法对目标缓存块进行压缩,得到压缩缓存块;检测压缩缓存块的实际压缩比。
[0243] 在本实施例中,对待释放内存空间的目标缓存块所采用的压缩方式可以但不限于为最高压缩比的压缩算法,从而尽可能释放更多的内存空间。
[0244] 在本实施例中,压缩过程可以但不限于由FPGA执行。
[0245] 在一个示例性实施例中,可以但不限于通过以下方式根据目标缓存块的压缩比对目标缓存块进行落盘并释放目标缓存块占用的内存空间:根据实际压缩比将目标内存空间中的目标缓存块替换为压缩缓存块,并释放目标缓存块相比于压缩缓存块多余占用的内存空间;将压缩缓存块按照落盘优先级传输至存储器输入输出队列进行落盘;在压缩缓存块完成落盘的情况下,释放压缩缓存块所占用的内存空间。
[0246] 在本实施例中,根据实际压缩比将目标内存空间中的目标缓存块替换为压缩缓存块,并释放目标缓存块相比于压缩缓存块多余占用的内存空间,从而尽快释放出部分内存。
[0247] 在一个示例性实施例中,可以但不限于通过以下方式根据实际压缩比将目标内存空间中的目标缓存块替换为压缩缓存块:将实际压缩比与压缩比阈值进行比对;在实际压缩比大于或者等于压缩比阈值的情况下,将目标内存空间中的目标缓存块替换为压缩缓存块;在实际压缩比小于压缩比阈值的情况下,将目标缓存块插入存储器输入输出队列中,其中,在存储器输入输出队列中目标缓存块优先被落盘;在目标缓存块完成落盘的情况下,释放目标缓存块所占用的内存空间。
[0248] 在本实施例中,对于压缩比较低的目标缓存块以未压缩的缓存块直接进行落盘,也就是说,对于这种压缩收益不大的缓存块尽快的落盘从而尽快释放出内存空间。
[0249] 基于上述过程,本实施例对于释放空间指令的落盘场景,先将待落盘数据放入FPGA中,执行最高压缩比算子;计算完成后,对于高压缩比的缓存块,使用临时替换的策略释放部分主机侧缓存;对于低压缩比的缓存块,使用插队方式尽快完成数据落盘后,释放主机侧与FPGA侧缓存。图18是根据本申请实施例的一种释放空间指令触发的压缩存储过程的示意图,如图18所示,该过程可以但不限于包括如下步骤:
[0250] 步骤1:将缓存块传输到FPGA(现场可编程逻辑门阵列)的DDR内存(双倍速率同步动态随机存储器)中,同时启动最高压缩比算子。从最高落盘优先级的缓存块开始,将缓存块放入到FPGA的最高压缩比算子任务队列中。直到FPGA没有可分配内存。
[0251] 步骤2:替换主机侧高压缩比缓存块,释放多余的主机侧缓存,释放FPGA缓存块内存。对于高压缩比缓存块,将FPGA中压缩缓存块传输到Host一侧,使用压缩后的缓存块替换原缓存块,释放多余的主机侧缓存,释放FPGA对应的缓存块内存。
[0252] 步骤3:将压缩后的缓存块分类插入IO(输入输出)存储队列,释放IO完成缓存块。如果缓存块压缩比较低,将该原始缓存块插队插入到IO存储队列;如果缓存块压缩比较高,将压缩后的缓存块放入IO存储队列尾部。对于IO存储队列中,执行完成的缓存块,释放对应的主机侧与FPGA侧缓存。
[0253] 步骤4:重复执行步骤1,直到主机侧剩余内存空间高于低水位标记。
[0254] 图19是根据本申请实施例的一种释放空间过程的示意图,如图19所示,主机侧缓存块1至5所占用的是需要释放的内存空间,将缓存块1至5发送至FPGA(现场可编程逻辑门阵列)的DDR内存中,同时启动最高压缩比算子进行压缩,压缩比由高到低依次是缓存块1,缓存块5,缓存块2,缓存块4,缓存块3,其中,缓存块3几乎为1:1的压缩比。将缓存块3直接进行落盘并释放其占用的内存空间,将缓存块1,缓存块5,缓存块2,缓存块4替换为对应得到的压缩块,并释放多余的内存空间,在完成落盘后,将全部的内存空间释放。
[0255] 在一个示例性实施例中,可以但不限于通过以下方式处理优化存储空间的指令:在接收到第四指令的情况下,从目标存储空间中获取存储数据,其中,第四指令用于指示优化目标存储空间,存储数据是落盘时数据的落盘存储空间的落盘优先级低于其他落盘维度的文件数据;以数据的落盘存储空间的落盘优先级为最高优先级对存储数据进行重新落盘。
[0256] 在本实施例中,第四指令用于指示对存储空间的优化整理,第四指令可以但不限于包括上述的优化存储指令,这种指令用于对于存储空间进行整理,其可以是用户触发的,也可以是系统自动触发的。
[0257] 对于优化存储指令,由于在强制落盘指令与缓存释放指令中,为了实现尽快落盘与释放缓存的首要任务,并不考虑用户对文件访问的偏置值设定与缓存模块对数据块的读写跟踪。本实施例在计算单元与存储单元空闲时,数据的访问过程中,通过缓存模块对数据访问特征的统计,对数据的存储做出进一步的优化。优化存储指令的优先级最低,其插入到计算单元与存储单元的任务,放在任务队列的末端,当FPGA任务队列满时,优先撤销优化存储指令发出的任务。
[0258] 在一个示例性实施例中,可以但不限于通过以下方式从目标存储空间中获取存储数据:从目标存储空间中获取通过第一指令落盘的第三文件,和/或,从目标存储空间中获取通过第三指令落盘的第四文件,其中,第三指令是用于指示对目标内存空间进行释放的指令;从获取到的文件中提取存储数据。
[0259] 在本实施例中,执行优化存储指令的数据可以但不限于包括强制落盘指令落盘的文件,释放空间指令落盘的文件等等。
[0260] 在一个示例性实施例中,可以但不限于通过以下方式从获取到的文件中提取存储数据:检测获取到的文件中散列存储的数据在获取到的文件中所占的目标比重;在目标比重大于或者等于比重阈值的情况下,将获取到的文件的全部数据确定为存储数据;在目标比重小于比重阈值的情况下,从获取到的文件中提取存储性能允许提高的数据作为存储数据。
[0261] 在本实施例中,对于散列存储的比重较大的文件全部进行优化存储,对于散列存储的比重较小的文件对存储性能允许提高的数据进行优化存储。
[0262] 在一个示例性实施例中,可以但不限于通过以下方式以数据的落盘存储空间的落盘优先级为最高优先级对存储数据进行重新落盘:将存储数据读取至系统的内存空间中,得到内存数据;对内存数据执行第二指令,其中,第二指令是数据的落盘存储空间的落盘优先级高于数据的落盘延迟时间的落盘优先级的落盘指令。
[0263] 在本实施例中,首先将需要优化存储的存储数据读取至内存空间中,再执行数据的落盘存储空间的落盘优先级高于数据的落盘延迟时间的落盘优先级的落盘指令进行优化,比如调用定时回写指令的定时回写函数。
[0264] 对于优化存储指令,在主动模式下,当计算单元与存储单元中任务队列较少时启动,扫描磁盘中未压缩的存储数据与散列存储数据,根据缓存模块中的历史访问记录,提取最近访问最频繁的文件,计算重新压缩与改为顺序存储的代价与收益。
[0265] 在被动模式下,当文件数据读取到缓存模块时,对于访问较为频繁的文件,载入该文件的其它缓存块到缓存模块,扫描文件中的非压缩数据块比重,以及离散存储块比重,计算将重新存储的代价与收益。
[0266] 两种模式下,都是以逻辑文件文单位进行处理。
[0267] 由于数据访问的空间局部性特性,系统中大部分文件很少访问到,而少部分文件会在一段时间内被经常访问,对该类文件进行优化处理能够得到更好的用户体验。基于上述特征,本实施例提出面向文件的优化存储策略,可在系统空闲时,对用户经常访问的文件进行存储优化。图20是根据本申请实施例的一种优化存储指令触发的压缩存储过程的示意图,如图20所示,该过程可以但不限于包括如下步骤:
[0268] 步骤1:从编码模块载入文件的元信息。主动模式下,在计算单元与存储单元空闲时,主动对缓存模块中访问频次最高的文件进行存储优化处理。被动模式下,当一个文件载入到缓存模块时,判断其访问频次,对文件进行存储优化处理。
[0269] 步骤2:统计文件强制落盘数据块数量。强制落盘命令执行时,较少考虑存储的综合性能优化,只考虑尽快落盘。因此这部分数据也具有较大的优化价值,判断强制落盘数据块的方法为:判断数据块中对应的元信息标记。
[0270] 步骤3:统计文件缓存释放指令落盘的数据块数量。缓存释放时,统一使用最高压缩比算法,以实现释放更多缓存,并不考虑读写性能以及存储空间优化。因此,这部分数据可以做进一步优化。
[0271] 步骤4:统计文件中散列存储块所占比重。散列存储会导致对磁盘的随机访问,降低IO存储器读取性能。因此对于文件散列存储较多的情况下,因考虑将文件存储优化为连续空间。
[0272] 步骤5:根据上述统计信息决策文件是部分优化还是全部优化。对于文件散列存储比重较大的情况下,将所有数据全部读取出来后进行重新组织,能更好的提升文件存储空间收益与访问性能。对于文件散列存储比重较少的情况下,只进行部分优化更为合理。
[0273] 步骤6:读取目标数据块到缓存模块,调用定时回写函数。部分优化时批量读取可优化数据块,全部优化时,读取所有数据到缓存模块。按照定时回写指令落盘规则,对数据进行重新落盘。
[0274] 在一个示例性实施例中,可以但不限于通过以下方式按照文件优先级记录待落盘的文件的落盘顺序:按照文件优先级记录待落盘的文件,其中,文件优先级用于指示文件落盘的紧急程度,文件优先级是根据文件类型和文件对应的指令类型确定的,指令类型为指示文件落盘的指令的类型。
[0275] 在本实施例中,文件优先级可以但不限于考虑文件本身的落盘需求以及上述各种指令下触发的落盘操作的落盘需求。可以根据文件类型和文件对应的指令类型确定文件优先级。
[0276] 在一个示例性实施例中,可以但不限于通过以下方式按照文件优先级记录待落盘的文件:采用红黑树结构记录待落盘的文件,其中,红黑树结构以文件优先级为索引,每个红黑树节点为文件链表,文件链表中每个链表节点为对应的文件优先级下的一个待落盘的文件的inode索引,inode索引指向对应的待落盘的文件的缓存。
[0277] 在本实施例中,可以但不限于采用红黑树的结构记录待落盘的文件,红黑树结构可以但不限于以文件优先级的由高到低为索引,一方面能够记录并查找到文件,另一方面也能够提高查找的效率。
[0278] 本实施例中,提供了一种待落盘的文件的记录方式,图21是根据本申请实施例的一种待落盘的文件记录方式的示意图,如图21所示,使用该容器结构管理需要落盘的数据块,使用红黑树存放不同优先级的数据块,插入时以加权后的文件落盘优先级( )为索引。红黑树节点为链表,链表中的节点为文件的inode索引(索引节点),不同文件的inode索引不同,因此链表上每一个节点代表一个文件。每一个inode索引指向文件的缓存,缓存为一个二叉树结构,以文件的分区号为索引。代价估计模块,可能将缓存块直接放入存储器的IO队列中,或者先将缓存块分配到可用计算单元的任务队列中,如:FPGA(现场可编程逻辑门阵列)中的算子,CPU(中央处理器)的运算核心,进行压缩计算,之后将压缩计算的数据提交到IO(输入输出)任务队列中。所有方式提交的磁盘的IO任务,均会进行合并后再批量写入到磁盘中,以提高写入性能。
[0279] 文件落盘优先级( )取值范围为0‑10;在插入红黑树时,按照不同场景进行优先级加权,比如加权规则可以但不限于为:强制落盘指令加100000,释放空间指令加10000,定时回写指令加1000,优化存储指令加100。缓存块落盘时,先从红黑树的右侧获取目标缓存块,通过加权操作,使落盘优先级按照场景分类,同时保留了相同场景下,不同文件落盘优先级的处理顺序。由于红黑树的自平衡特性,减少了高优先级缓存块的查找时间。
[0280] 对于文件系统中的编码模块,其可以进行对文件分块压缩后的编码,将缓存模块中的文件缓存块编码为连续的物理文件。逻辑空间中的用户文件,会按照指定的分块区间进行分块,分块压缩后的数据,由编码模块编码为连续的物理文件。物理文件在创建时,首先创建12KB的文件头,其中包含3个4KB大小的区域用于记录创建时的元信息,分别为:文件管理块,空闲空间管理块,索引块。经过各种访问操作后会进行元信息的动态更新和插入,图22是根据本申请实施例的一种文件的元信息的示意图,如图22所示,元信息中包括的文件管理块,空闲空间管理块,索引块中的信息动态适应访问操作对于文件的调整,比如:窗口号为1的分块区间中的数据可能经过了少量的修改,变为压缩块和补丁块结合的方式进行了落盘。
[0281] 在一个示例性实施例中,物理文件中包括索引块,其中,索引块用于记录物理文件所在的物理空间与逻辑文件所在的逻辑空间之间的映射关系。
[0282] 在一个示例性实施例中,索引块中包括:具有对应关系的窗口号字段和物理块字段,其中,窗口号字段用于指示逻辑文件的分块区间的编号,物理块字段用于指示逻辑文件的分块区间在物理文件中对应的物理块。
[0283] 在一个示例性实施例中,物理块字段,包括:物理块数字段,压缩块数字段,块编号字段和压缩算法字段,其中,物理块数字段用于表示对应的分块区间占用的物理块数量,压缩块数字段用于表示对应的分块区间占用的物理块中压缩块的数量,块编号字段用于表示对应的分块区间占用的物理块的编号,压缩算法字段用于表示对应的分块区间所采用的压缩算法。
[0284] 在一个示例性实施例中,物理文件中还包括空闲空间管理块,其中,空闲空间管理块用于记录物理文件中的每个物理块是否空闲。
[0285] 在一个示例性实施例中,物理文件的头部还包括文件管理块,其中,文件管理块用于记录物理文件中每个索引块的位置以及空闲空间管理块的位置。
[0286] 在本实施例中还提供了一种文件的压缩编码方法,图23是根据本申请实施例的文件的压缩编码方法的流程图,如图23所示,该流程包括如下步骤:
[0287] 步骤S2302,检测对目标逻辑文件执行的目标数据的目标访问操作;
[0288] 步骤S2304,根据初始元信息对第一物理文件中目标数据对应的第一文件数据进行解压并执行目标访问操作,得到第二文件数据,其中,初始元信息用于记录目标逻辑文件中的分块区间与第一物理文件中数据物理块之间的对应关系;
[0289] 步骤S2306,在对第二文件数据进行压缩落盘的情况下,采用第二文件数据对应的目标压缩方式对第二文件数据进行压缩编码,得到第三文件数据以及第三文件数据的参考元信息;
[0290] 步骤S2308,将第三文件数据和参考元信息插入第一物理文件,得到目标逻辑文件对应的携带了目标元信息的第二物理文件,其中,目标元信息用于记录目标逻辑文件中的分块区间与第二物理文件中数据物理块之间的对应关系。
[0291] 通过上述步骤,当检测到对目标逻辑文件执行的目标数据的目标访问操作,依据初始元信息对目标逻辑文件对应的第一物理文件中目标数据相关的第一文件数据进行解压并执行目标访问操作,从而实现文件的随机读写访问,对于访问操作后得到的第二文件数据,在其需要压缩落盘时,采用相应的目标压缩方式进行压缩编码,形成第三文件数据以及参考元信息,将第三文件数据和参考元信息插入第一物理文件中,从而实现物理文件的元信息的动态生成和插入。因此,可以解决文件的访问灵活性较差的技术问题,达到提高文件的访问灵活性的技术效果。
[0292] 其中,上述步骤的可以但不限于由上述编码模块等执行,但不限于此。
[0293] 在本实施例中,目标访问操作可以但不限于为随机的读操作或者随机的写操作等等。用户可以随时通过写操作对文件进行修改,通过读操作对文件进行调用。
[0294] 在本实施例中,目标逻辑文件是逻辑空间的文件,目标数据是用户期望访问的目标逻辑文件中的部分或者全部数据,第一物理文件是在执行目标访问操作前目标逻辑文件在物理空间对应的物理文件,初始元信息是第一物理文件的元信息,其记录了目标逻辑文件与第一物理文件之间的关系,第一文件数据是第一物理文件中目标数据对应的部分,第二文件数据是执行了解压和目标访问操作后的文件数据,第三文件数据是执行了压缩编码后的文件数据,参考元信息是为第三文件数据动态生成的元信息,第二物理文件是执行了目标访问操作后目标逻辑文件在物理空间对应的物理文件,目标元信息是第二物理文件的元信息,其记录了目标逻辑文件与第二物理文件之间的关系。
[0295] 在一个示例性实施例中,可以但不限于通过以下方式采用第二文件数据对应的目标压缩方式对第二文件数据进行压缩编码,得到第三文件数据以及第三文件数据的参考元信息:采用第二文件数据对应的目标压缩方式对第二文件数据进行压缩,得到参考压缩数据;根据参考压缩参数与初始压缩参数之间的关系对参考压缩数据进行编码,得到第三文件数据以及第三文件数据的参考元信息,其中,参考压缩参数是参考压缩数据的压缩参数,初始压缩参数是第一文件数据解压前的初始压缩数据的压缩参数。
[0296] 在本实施例中,目标压缩方式可以但不限于包括不压缩,某种压缩算法,压缩结合补丁的方式等等。
[0297] 在本实施例中,参考压缩参数是参考压缩数据的压缩参数,初始压缩参数是第一文件数据解压前的初始压缩数据的压缩参数。根据参考压缩数据的压缩情况和初始压缩数据的压缩情况之间的关系为文件数据进行编码,逻辑文件中同一部分的数据在访问前后的压缩情况可能会由于访问发生变化,根据这种变化对数据进行编码并动态生成元信息。
[0298] 在一个示例性实施例中,可以但不限于通过以下方式根据参考压缩参数与初始压缩参数之间的关系对参考压缩数据进行编码,得到第三文件数据以及第三文件数据的参考元信息:获取参考压缩数据中每个压缩数据块所在的分块区间的窗口号;根据参考压缩参数与初始压缩参数之间的关系在第一物理文件的物理空间中为在每个分块区间中的压缩数据块分配数据物理块得到第三文件数据,并获取每个数据物理块的块编号;记录具有对应关系的窗口号和块编号,得到第三文件数据对应的参考索引信息,其中,参考元信息包括参考索引信息。
[0299] 在本实施例中,根据参考压缩数据的压缩情况和初始压缩数据的压缩情况之间的关系为每个分块区间分配符合其当前压缩情况的数据物理块,并记录具有对应关系的窗口号和块编号作为参考元信息中的参考索引信息。
[0300] 在一个示例性实施例中,可以但不限于通过以下方式记录具有对应关系的窗口号和块编号,得到第三文件数据对应的参考索引信息:创建具有对应关系的窗口号字段和物理块信息字段;根据每个分块区间中压缩数据块的属性和块编号按照物理块信息字段生成每个分块区间的窗口号对应的物理块信息;将具有对应关系的窗口号和物理块信息添加到具有对应关系的窗口号字段和物理块信息字段中,得到参考索引信息。
[0301] 在本实施例中,窗口号字段可以但不限于用于记录窗口号,物理块信息字段可以但不限于用于记录物理块对应的各种信息,比如:物理块位置相关的信息,压缩相关的信息,物理块类型相关的信息等等。
[0302] 在一个示例性实施例中,可以但不限于通过以下之一方式创建具有对应关系的窗口号字段和物理块信息字段:
[0303] 方式一,创建具有对应关系的窗口号字段,物理块数字段,块类型字段和块编号字段,物理块数字段用于记录对应窗口号中包括的物理块的数量,块类型字段用于记录对应窗口号中包括的物理块的类型;
[0304] 方式二,创建具有对应关系的窗口号字段,区间数字段,块类型字段,块起始字段和块结尾字段,其中,区间数字段用于记录对应窗口号中连续的物理块区间的数量,块类型字段用于记录对应窗口号中包括的物理块的类型,块起始字段用于记录对应窗口号中一个物理块区间内的起始块编号,块结尾字段用于记录对应窗口号中一个物理块区间内的结尾块编号。
[0305] 在一个示例性实施例中,块类型字段包括压缩块数字段,其中,压缩块数字段用于记录通过压缩得到的数据块的数量;和/或,在对第二文件数据进行压缩允许采用多种存储方式的情况下,具有对应关系的窗口号字段和物理块信息字段中还包括具有对应关系的窗口号字段和存储方式字段,其中,多种存储方式至少包括:非压缩存储,一种或者多种压缩算法中每种压缩算法存储,存储方式字段用于记录对应窗口号所采用的存储方式的标识。
[0306] 在本实施例中,索引块用于管理文件分块后的窗口号与物理文件块之间的映射关系,以及物理块属性,根据用户指定的分块大小,一个索引块管理一段逻辑空间与物理空间的映射,当索引块内索引不足时,可以从空闲块中分配一个物理块作为索引块。
[0307] 一种索引块的形式如图22所示,包含等长大小的索引,索引大小等于:窗口号(4B)+物理块数(4B)+压缩块数(4B)+压缩算法(4B)+(窗口长度/4KB),使用窗口号进行查找。索引中包含如下字段:
[0308] 窗口号:将逻辑文件进行分块后,形成压缩窗口,以压缩窗口为单位对逻辑文件进行压缩核解压。当用户读写某个窗口内的数据时,以窗口号为索引查找到对应的物理块。
[0309] 物理块数:分块压缩后的数据与补丁块一共占用的存储块个数。
[0310] 压缩块数:用于记录文件压缩后压缩块数量,补丁块的数量为物理块数与压缩块数的差值。也可以在有少量修改的情况下,在索引块中记录补丁块数,补丁块在物理上位于压缩块的后面存放,压缩块的数量为物理块数与补丁块数的差值。
[0311] 块编号1‑N:块编号的第0比特位用来表示块的类型:原始块,压缩块、段补丁块,页补丁块。块编号的第1‑4比特,用来表示页补丁页面对应的逻辑页面号;其余比特位用于表示该窗口内压缩后对应的物理块号。
[0312] 压缩算法:第0‑1比特表示压缩窗口落盘时的场景:强制落盘指令、缓存释放指令、定时回写指、优化存储指令。其余比特位,表示该窗口内数据使用的压缩算法ID号,当非压缩存储时使用0表示。
[0313] 在一个示例性实施例中,在对应窗口号中连续的物理块区间的数量为1的情况下,块起始字段用于记录对应窗口号中一个物理块区间内的起始块编号,块结尾字段用于记录对应窗口号中一个物理块区间内的结尾块编号;在对应窗口号中连续的物理块区间的数量大于1的情况下,块起始字段用于指向对应窗口号的区间索引信息,区间索引信息用于记录多个物理块区间中每个物理块区间,块结尾字段用于记录对应窗口号中最后一个物理块区间内的结尾块编号。
[0314] 本实施例中,索引块中对逻辑块与物理块采用了等量分配元数据的方法,一两个逻辑块对应一个物理块,需要一个8B的元数据。技术实现上,可以扩展使用区间块的方法,用一个区间表达块的起始与结尾,减少所需要的元数据。空闲空间优先分配连续区间,当没有连续空间可分配时,分配多个区间块,区间块内部是连续的。图24是根据本申请实施例的另一种文件的元信息的示意图,如图24所示,使用区间数表示该分块区间压缩后,有几个连续的物理块区间,当只有一个区间时,使用本索引块中的块起始、块结尾,由于会尽量分配连续的空间,因此该场景为绝大部分场景。当大于一个区间时,块起始指向另一个索引块,该索引块包含多个不定长的区间,块结尾表示最后一个区间的最后一个数据块。使用块起始、块结尾表示一个区间内的起始与结尾。
[0315] 在一个示例性实施例中,在获取每个数据物理块的块编号之后,还可以但不限于通过以下方式生成空闲空间管理信息作为参考元信息:记录具有对应关系的块编号和空闲标识,得到第三文件数据对应的空闲空间管理信息,其中,参考元信息还包括空闲空间管理信息,空闲标识用于指示对应的物理块是否空闲。
[0316] 在本实施例中,可以但不限于采用空闲空间管理信息作为参考元信息,通过空闲标识管理物理块的空闲情况。空闲标识可以是0和1,0标识空闲,1标识占用。
[0317] 在一个示例性实施例中,可以但不限于通过以下方式记录具有对应关系的块编号和空闲标识,得到第三文件数据对应的空闲空间管理信息:在为分块区间中的压缩数据块重新分配了数据物理块的情况下,记录具有对应关系的原数据物理块的块编号和第一空闲标识,以及具有对应关系的重新分配的数据物理块的块编号和第二空闲标识,其中,原数据物理块是分块区间在第一物理文件中所占用的数据物理块,第一空闲标识用于指示对应的物理块为空闲,第二空闲标识用于指示对应的物理块为非空闲。
[0318] 在本实施例中,如果为第三文件数据重新分配了新的数据物理块,则可以释放其原本占用的物理块并将其标记为空闲。
[0319] 在一个示例性实施例中,可以但不限于通过以下方式根据参考压缩参数与初始压缩参数之间的关系在第一物理文件的物理空间中为在每个分块区间中的压缩数据块分配数据物理块得到第三文件数据:比对第一存储空间和第二存储空间,其中,参考压缩参数包括第一存储空间,初始压缩参数包括第二存储空间,第一存储空间为参考压缩数据中当前分配数据物理块的参考分块区间中的压缩数据块所需的存储空间,第二存储空间为参考分块区间在第一物理文件中所占的存储空间;在第一存储空间大于第二存储空间的情况下,清除参考分块区间在第一物理文件中的数据,并从第一物理文件中获取符合第一存储空间的空闲块;将参考分块区间的压缩数据块的数据添加至获取到的空闲块中;在第一存储空间小于或者等于第二存储空间的情况下,清除参考分块区间在第一物理文件中的数据;将参考分块区间的压缩数据块的数据添加至清除了数据的数据物理块中。
[0320] 在本实施例中,如果文件数据原本占用的物理空间不足以存储访问后的文件数据,则可以为访问后的文件数据重新分配空闲块来存储。
[0321] 在一个示例性实施例中,可以但不限于通过以下方式从第一物理文件中获取符合第一存储空间的空闲块:从第一物理文件中查找符合第一存储空间的第一连续空闲块;在查找到第一连续空闲块的情况下,将第一连续空闲块确定为获取到的空闲块;在未查找到第一连续空闲块的情况下,在第一物理文件之后申请符合第一存储空间的第二连续空闲块;将第二连续空闲块确定为获取到的空闲块。
[0322] 在本实施例中,优先为物理文件分配连续的存储空间,从而提高数据的读写效率。
[0323] 在一个示例性实施例中,可以但不限于通过以下方式从第一物理文件中查找符合第一存储空间的第一连续空闲块:确定参考分块区间的操作热度,其中,操作热度用于指示参考分块区间被操作的频率;在操作热度大于热度阈值的情况下,从第一物理文件中查找符合第一存储空间的第一连续空闲块。
[0324] 在本实施例中,根据分块区间的操作热度分配连续的存储位置,如果操作热度大于热度阈值则表示参考分块区间被操作的频率较高,优先为其分配连续的空间进行存储,以保证经常访问的数据能够流畅高效的进行访问。
[0325] 在一个示例性实施例中,在确定参考分块区间的操作热度之后,可以但不限于通过以下方式优化数据的存储方式:在操作热度大于热度阈值的情况下,确定第一存储空间与第二存储空间之间的存储量差值;从第一物理文件中查找符合存储量差值的目标空闲块;将参考分块区间在第一物理文件中所占的数据物理块和目标空闲块确定为获取到的空闲块。
[0326] 在本实施例中,根据分块区间的操作热度分配连续的存储位置,如果操作热度小于或者等于热度阈值则表示参考分块区间被操作的频率较低,优先考虑将其原本占用的存储空间占满后占用其他的存储空间。
[0327] 在一个示例性实施例中,可以但不限于通过以下方式将第三文件数据和参考元信息插入第一物理文件,得到目标逻辑文件对应的携带了目标元信息的第二物理文件:将第三文件数据按照参考元信息插入第一物理文件所在的物理空间,并使用参考元信息更新初始元信息,得到携带了目标元信息的第二物理文件。
[0328] 在本实施例中,动态将文件数据插入到物理文件所在的物理空间中,并使用动态生成的参考元信息更新原本的初始元信息,从而得到携带了目标元信息的第二物理文件。
[0329] 在一个示例性实施例中,可以但不限于通过以下方式使用参考元信息更新初始元信息:使用参考元信息所包括的参考索引信息更新第一物理文件中的初始索引块所包括的初始索引信息,得到目标索引块,其中,初始元信息包括初始索引信息,参考索引信息用于记录具有对应关系的第三文件数据中所包括的分块区间的窗口号和第三文件数据在物理空间中所占数据物理块的块编号。
[0330] 在本实施例中,元信息的更新包括对索引块中索引信息的更新。
[0331] 在一个示例性实施例中,可以但不限于通过以下方式使用参考元信息所包括的参考索引信息更新第一物理文件中的初始索引块所包括的初始索引信息:在初始索引块中查找参考索引信息中所记录的目标窗口号;使用参考索引信息中所记录的块编号替换初始索引块中目标窗口号下的块编号。
[0332] 在本实施例中,以窗口号为索引进行查找,替换查找到的窗口号下的信息。
[0333] 在一个示例性实施例中,在使用参考元信息所包括的参考索引信息更新第一物理文件中的初始索引块所包括的初始索引信息之后,可以但不限于通过以下方式动态更新元信息中的空闲空间管理信息:使用参考元信息所包括的空闲空间管理信息更新第一物理文件中的空闲空间管理块所包括的初始空闲空间管理信息,得到目标空闲空间管理块,其中,初始元信息包括初始空闲空间管理信息,空闲空间管理信息用于记录具有对应关系的第三文件数据在物理空间中所占数据物理块的块编号和空闲标识,空闲标识用于指示对应的物理块是否空闲。
[0334] 在本实施例中,元信息的更新还包括对空闲空间管理信息的更新。图25是根据本申请实施例的一种文件的元信息中空闲空间管理块的示意图,如图25所示,记录了空闲空间管理信息的空闲空间管理块,用于管理物理文件中的空闲空间,文件打开时会通过链表载入所有的空闲块到内存中,作为文件的元数据。空闲空间管理块的形式如下:空闲块中使用1bit表示一个4KB大小的物理块是否被使用。除第一个空闲块外,其它空间块为物理文件中空闲空间不足时,动态生成,通过增加物理文件的大小,将空闲块插入到文件的尾部。空闲块的尾部使用16个字节,存放下一个空闲块的偏移位置及长度,当文件一次性写入大量数据时,可连续生成多个空闲块,相邻空闲块之间尾部16字节为空。通过读取物理文件中的空闲块,可形成空闲块链表,用于管理空闲空间。
[0335] 在一个示例性实施例中,在使用参考元信息所包括的空闲空间管理信息更新第一物理文件中的空闲空间管理块所包括的初始空闲空间管理信息之后,可以但不限于通过以下方式更新元信息中的文件管理信息:根据目标索引块和目标空闲空间管理块更新第一物理文件中的文件管理块,得到目标文件管理块,其中,初始元信息包括文件管理块,文件管理块用于记录第一物理文件的文件信息,初始索引块的位置和空闲空间管理块的位置,目标文件管理块用于记录第二物理文件的文件信息,目标索引块的位置和目标空闲空间管理块的位置。
[0336] 在本实施例中,元信息的更新还包括对文件管理信息的更新。图26是根据本申请实施例的一种文件的元信息中文件管理块的示意图,如图26所示,物理文件中文件管理块的编码规则如下:文件管理块,用于管理管理文件块的总体信息,以及索引块的位置。其中包含:幻数:用于管理块标记。版本号:用于版本管理。空闲空间块收地址:标记空闲空间块在物理空间中的首地址。索引块地址:用于标记物理文件中索引块所在的地址,管理方式类似ext3,使用3级索引,一级索引直接指向索引块,用于逻辑空间与物理空间之间的映射关系查找,二级索引块指向多个一级索引块,三级索引块指向多个二级索引块。
[0337] 在一个示例性实施例中,可以但不限于通过以下方式根据初始元信息对第一物理文件中目标数据对应的第一文件数据进行解压并执行目标访问操作,得到第二文件数据:根据初始元信息从第一物理文件中提取目标数据对应的第一文件数据;对第一文件数据进行解压,得到解压数据;对解压数据执行目标访问操作,得到第二文件数据。
[0338] 在一个示例性实施例中,可以但不限于通过以下方式根据初始元信息从第一物理文件中提取目标数据对应的第一文件数据:确定目标数据在目标逻辑文件的分块区间中所在的目标分块区间;从初始元信息中查找目标分块区间所对应的目标数据物理块;从第一物理文件中提取目标数据物理块作为第一文件数据。
[0339] 在本实施例中,按照分块区间提取相应的数据,首先确定出目标数据在目标逻辑文件的分块区间中所在的目标分块区间,从初始元信息中查找目标分块区间所对应的目标数据物理块,比如:对应的物理块编号,按照目标数据物理块从第一物理文件中提取文件数据。
[0340] 为了支持对文件的随机访问,索引块与空闲空间管理块的使用方法如下:
[0341] 读取操作时,缓存模块中会按照分块区间,将读写请求进行拆分。从编码模块中获取索引块,读取索引块的索引,获取各个分块区间对应的物理块,读取物理块后进行解压打补丁操作。
[0342] 举例说明,图27是根据本申请实施例的一种文件的读取操作过程的示意图,如图27所示,用户随机读取文件12KB‑20KB范围内的数据;缓存模块,发现编码模块中以16KB为分块区间,便将请求拆分为2个读请求,分别为0KB‑16KB,16KB‑32KB,其对应的压缩窗口号为0,1;读取索引块,获取0,1压缩窗口对应的物理块;对于0‑16KB,读取3,4物理块,对3物理块解压,之后使用4物理块打补丁。对于16KB‑32KB,读取5,6物理块,解压即可;通过编码模块,缓存模块获取0‑32KB的缓存数据;VFS接口模块从0‑32KB缓存中提取12KB‑20KB之间的数据。
[0343] 写入操作时,缓存模块按照编码模块定义的分块区间,对读写请求进行拆分处理。将数据写入到缓存模块,编码模块在对缓存模块内修改的数据进行编码时,如果数据只是少量修改,代价估计模块估计为补丁方式记录修改,使用补丁页面标记修改位置;如果数据修改较多,将分块区间重新压缩后,寻找空闲块进行写入,如果压缩后由于压缩比发生变化,导致原有空间不足,则释放原有空间,寻找新的空闲空间块存放;如果修改的区间为非压缩存储,则只修改物理空间中对应位置数据块,不进行压缩计算。
[0344] 举例说明,图28是根据本申请实施例的一种文件的写入操作过程的示意图,如图28所示,用户向8KB‑9KB之间写入数据,由于修改内容较少,代价估计模块发现原有区间内压缩比较高,采用补丁页面方式记录修改内容。用户向20KB‑24KB之间写入数据,由于修改内容较多,同时原有区间压缩比较少,因此采用了重新压缩该区间的方式,压缩后的压缩比由原来的2:1变为4:3,原有位置无法存放,因此从空闲块中释放原有位置,从其它位置找到连续的3个空闲块存放修改后的压缩数据。同时修改索引中的字段信息,标记该窗口区间对应的物理块。值得说明的是:这里选择释放2个原有空间,申请3个新空间,而不采用原有位置覆盖,再申请1个新空闲块的方式,是由于通常存储介质的连续读取性能由于非连续读取,因此尽量分配连续的存储空间。用户向40KB‑44KB之间写入数据,由于该区间采用非压缩存储方式(由代价估计模块决定),因此直接按照块大小写入修改数据,不进行压缩计算。
[0345] 本实施例提出的一套文件分块压缩编码方式,动态插入空闲空间管理块,用于物理存储空间的分配;动态插入索引块,用于管理分块压缩前后映射关系;引入补丁块,用于出现少量修改的场景下,减少IO与压缩计算延迟。
[0346] 在编码模块中,通过动态插入元信息管理变长数据块以及空闲空间,以支持对文件分块压缩后随机读写访问。通过在文件中插入空闲空间管理块,管理一定容量的空闲空间。当文件中空闲空间不足时,会在空闲空间块尾部插入索引,指向新生产的空闲空间块,新生成的空闲空间块,管理文件新增部分的存储空间。通过在文件中插入索引块,管理一定范围内文件逻辑空间与物理空间的映射关系,文件逻辑空间为定长,物理空间为变长。索引块中的条目,还管理物理空间的标记,包括:是否压缩存储、采用的压缩算法、压缩块与补丁块的个数。通过在文件中插入管理块,管理文件中的:索引块位置、空闲块位置、文件逻辑大小与物理大小、压缩算法标记、读写访问统计值。通过补丁块作用于少量修改的压缩块,减少IO消耗与重复IO计算。支持不同压缩算法的混合存储,也可以文件块内的非压缩存储,对于读放大较多或压缩比不高的文件块进行非压缩存储,提升读取性能。空闲块的分配允许突发写入下的连续分配,以减少非连续读取空闲块导致的性能延迟。根据不同存储介质的连续访问性能与随机访问性能,选择连续存储空间与非连续存储空间。根据空闲空间碎片阈值,触发碎片整理,将物理文件块连续存放。记录文件块的访问热度,将访问热度较高的文件块,优先在物理上连续存放,提升读取性能。为了提高数据的顺序访问性能,所有写入的数据统一以追加的方式写入到文件中,标记原有位置为失效位置(空闲空间块需要2bit表示状态),待系统空闲,采用块回收方式,重新进行碎片整理。
[0347] 对于文件系统中的回写模块,其用于对编码后的数据进行回写操作,写入底层文件系统,从回写的实际上分为:强制回写与周期回写,用户输入的强制同步调用(flush),表示用户需要将数据立即落盘,此时侧重用户的相应延迟,而不是整体吞吐率。因此,缓存模块、压缩模块、编码模块会对当前已经缓存的文件数据执行操作,回写模块对此类数据写入到底层文件系统后阻塞等待底层文件系统执行完成。用户没有输入强制同步调用,此时侧重于整体吞吐率,等待缓存中需要回写的数据量较多或间隔时间较长时,执行批量的回写操作,提高整体的吞吐率。
[0348] 本实施例在用户态实现文件系统的透明压缩与解压,兼容现有文件系统无需重新格式化硬盘后,进行数据重新拷贝来实现压缩存储;无需修改操作系统内核,不引入系统宕机风险;无需用户态应用程序修改代码进行适配兼容。通过提出动态插入元数据的方法,对压缩存储块的索引管理与空闲空间管理,支持对压缩文件的随机访问。用户可通过VFS接口,设置文件系统参数,实现定制化的压缩、读写性能优化,比如:可配置的压缩分块大小、压缩比阈值、压缩算法选择。通过用户态缓存管理策略,缓存常用页面,跟踪页面的读写局部性特征,对局部性较差的页面非压缩存储,减少随机访问造成的读放大效应,降低IO消耗。对已压缩页面采用补丁页面方式,降低重复压缩计算以及IO操作。通过延迟压缩策略,减少随机写入导致的频繁压缩与写入问题。通过代价估计策略,对不同场景下的压缩计算进行分别处理,对压缩收益小的数据块不进行压缩存储,添加对非压缩数据的管理策略,提高随机读写性能。
[0349] 本实施例中,上述的文件系统可以但不限于适用于如下场景:
[0350] 用户所安装的文件系统不支持透明压缩,但用户有节省存储空间,提升读写性能的需求,同时需要支持对文件的随机访问。
[0351] 用户不愿更换为支持透明压缩的内核文件系统,原因可能包括:存储介质或使用场景并不适用、数据重新拷贝的时间成本、原有文件系统特性的丢失、迁移到新文件系统的未知风险。
[0352] 用户不愿付出额外成本购买价格昂贵的计算型存储硬件,更期望以较低成本实现数据的压缩存储。
[0353] 用户数据并非都能获得理想的压缩比,期望能够更为灵活的控制文件的压缩方式,包括:只对部分文件夹中的文件进行压缩存储、对不同文件设置压缩窗口大小达到最优的访问效率、对不同的文件可以指定不同的压缩算法、支持外接压缩解压缩硬件加速卡等。
[0354] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
[0355] 在本实施例中,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0356] 需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
[0357] 本申请的实施例还提供了一种操作系统,该操作系统包括应用层和本地文件系统层,在应用层与本地文件系统层之间还添加了中间层,中间层被允许跟踪应用层对文件的读写特征,中间层部署了上述的文件系统。
[0358] 本申请的实施例还提供了一种电子设备,包括存储器和处理器,该存储器中存储有计算机程序,该处理器上部署了上述的文件系统,该处理器执行计算机程序时实现上述文件系统的运行。
[0359] 在一个示例性实施例中,上述电子设备还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
[0360] 本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
[0361] 显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
[0362] 以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。