一种用于异常日志转储的LZO压缩方法及系统与流程

文档序号:15492515发布日期:2018-09-21 20:54阅读:387来源:国知局

本发明涉及文件压缩技术领域,特别是一种用于异常日志转储的lzo压缩方法及系统。



背景技术:

linux下目前存在多种压缩算法库,针对不同的应用场景,不同的算法有各自不同的特点。当需要在项目中引入一种解压缩算法需求时,需要从解压缩速度、压缩率以及是否需要占用额外内存等多个方面来进行选择最合适的算法。

目前,较新的linux内核已经移植了多种解压缩算法库,从内核使用情况来看,842没有解压接口,lz4只有zram模块用到,xz用于解压.xz文件,而zlib和lzo更常规些。

zlib是一个开源的算法库,很多软件均采用此种压缩算法,可以作为一种标准、通用的算法库。该算法支持无损压缩,对于线程也是安全的,提供了友好的解压缩函数接口,并且也提供了gzip文件的函数读写接口,使用上简单易行,没有多余的复杂操作。另外,该算法库还考虑了处理器和内存资源的适配控制操作,在计算性能有限或者内存资源受限的情况下,可以给解压缩操作配置不同的参数,降低其对处理器或者内存的占用。且zlib压缩率非常高,达到13.4%的压缩率,压缩速度为21mb/s,解压缩速度为118mb/s,适用于绝大多数的应用场景。

lzo是一种实时数据压缩库(areal-timedatacompressionlibrary),此种算法库更加重视数据的压缩速度,更加适用于需要快速完成压缩操作的场景。lzo同样遵循gun的gpl使用许可。lzo也是一种无损压缩算法,压缩率也比较理想,最高可达到20.5%的压缩率,压缩速度为135mb/s,解压缩速度为410mb/s。但在压缩率和压缩速度间,存在一个制约关系,使用更高的压缩率,也就意味着势必降低压缩速度。另外,解压缩速度不受压缩率的影响,保持不变。

在异常日志转储的应用场景中,要求在系统出现异常报错甚至宕机时,能以最快的速度将异常日志转储出去,同时又要考虑bmc等外部存储介质可能存在的存储空间有限的情况,因此需要对异常日志做先压缩后转储的操作。异常日志的读取操作没有对速度的要求,因此解压缩速度这一因素不在考虑的范围内。针对异常日志转储这一应用场景的需求,lzo压缩算法具有比其他算法更高的压缩速度,同时压缩率比较理想,符合应用场景的需求。

鉴于lzo算法本身特点,如果直接使用现有的函数接口,不仅需要在原有代码逻辑中进行额外内存申请以及相关的逻辑判断,而且还要考虑线程安全性问题,大大降低了原有代码的可读性,不利于代码的长期维护,易用性差。



技术实现要素:

本发明的目的是提供一种用于异常日志转储的lzo压缩方法及系统,旨在解决当前lzo算法在异常日志转储应用场景中易用性差以及降低使用者原有代码逻辑性的问题,为内核异常日志转储提供友好易用的函数接口,易用性高且不降低使用者原有代码逻辑。

为达到上述技术目的,本发明提供了一种用于异常日志转储的lzo压缩方法,包括以下步骤:

s101、接收内核异常信息反馈;

s102、调用封装的lzo数据压缩函数接口,将异常信息进行压缩;

s103、将压缩后的异常信息数据转储到存储介质;

s104、当异常信息服务层需要获取异常日志时,调用封装的lzo数据解压缩函数接口,对异常信息数据进行解压缩;

s105、将解压缩后的异常信息反馈给异常信息服务层。

优选地,在所述调用封装的lzo数据压缩函数接口之前以及调用封装的lzo数据解压缩函数接口之前均需调用内存资源申请函数,所述内存资源申请函数执行的操作内容具体为:

申请8k的额外内存,并且压缩数据或解压缩数据时也需要申请一块数据内存用于存放中转数据。

优选地,在所述调用封装的lzo数据压缩函数接口之后以及调用封装的lzo数据解压缩函数接口之后均需调用内存资源释放函数。

优选地,所述封装的lzo数据压缩函数执行的操作内容具体为:

通过一个互斥锁对压缩过程加以线程保护,然后调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据压缩处理,压缩后的数据保存在内存资源申请函数申请获得的数据内存中,并保存压缩后数据的长度,随后对数据长度进行判断,即压缩后的数据大小是否大于调用方预留的用于保存压缩后数据的大小,如果是则作异常处理,否则直接将得到的压缩数据拷贝到数据内存中,并返回压缩数据大小。

优选地,所述调用封装的lzo数据解压缩函数执行的操作内容具体为:

通过一个互斥锁对解压缩过程加以线程保护,调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据解压缩处理,并对函数返回的解压后数据大小进行判断,只有在解压后数据大小等于原始数据大小时,解压缩数据才会成功。

本发明还提供了一种用于异常日志转储的lzo压缩系统,包括:

异常信息监测模块,用于接收内核异常信息反馈;

异常信息压缩模块,用于调用封装的lzo数据压缩函数接口,将异常信息进行压缩;

异常信息存储模块,用于将压缩后的异常信息数据转储到存储介质;

异常信息解压缩模块,用于当异常信息服务层需要获取异常日志时,调用封装的lzo数据解压缩函数接口,对异常信息数据进行解压缩;

异常信息反馈模块,用于将解压缩后的异常信息反馈给异常信息服务层。

优选地,所述系统还包括:

内存资源申请模块,用于申请8k的额外内存,并且压缩数据或解压缩数据时也需要申请一块数据内存用于存放中转数据。

优选地,所述系统还包括:

内存资源释放模块,用于释放内存资源。

优选地,所述异常信息压缩模块包括:

压缩线程保护单元,用于通过一个互斥锁对压缩过程加以线程保护;

数据压缩单元,用于调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据压缩处理;

数据保存单元,用于将压缩后的数据保存在内存资源申请函数申请获得的数据内存中,并保存压缩后数据的长度;

异常判断处理单元,用于对数据长度进行判断,即压缩后的数据大小是否大于调用方预留的用于保存压缩后数据的大小,如果是则作异常处理,否则直接将得到的压缩数据拷贝到数据内存中,并返回压缩数据大小。

优选地,所述异常信息解压缩模块包括:

解压缩线程保护单元,用于通过一个互斥锁对解压缩过程加以线程保护;

数据解压缩单元,用于调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据解压缩处理;

数据判断单元,用于对函数返回的解压后数据大小进行判断,只有在解压后数据大小等于原始数据大小时,解压缩数据才会成功。

发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:

与现有技术相比,本发明通过针对异常日志转储而将原生lzo数据压缩接口进行重新封装,将原本复杂的接口算法封装至四个函数接口中,由于封装了原生lzo接口算法本身的复杂操作,使用者不必关心lzo算法本身,没有学习成本,不需要清楚知道压缩算法的技术细节,使用步骤简洁,且利于维护。

通过封装,最大限度的保证了调用方原有的代码逻辑,提高了代码的可读性,且对加入线程安全保护,保证数据压缩的可靠性。

附图说明

图1为本发明实施例中所提供的一种用于异常日志转储的lzo压缩方法流程图;

图2为本发明实施例中所提供的一种用于异常日志转储的lzo压缩系统结构框图。

具体实施方式

为了能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。应当注意,在附图中所图示的部件不一定按比例绘制。本发明省略了对公知组件和处理技术及工艺的描述以避免不必要地限制本发明。

下面结合附图对本发明实施例所提供的一种用于异常日志转储的lzo压缩方法及系统进行详细说明。

如图1所示,本发明实施例公开了一种用于异常日志转储的lzo压缩方法,包括以下步骤:

s101、接收内核异常信息反馈;

s102、调用封装的lzo数据压缩函数接口,将异常信息进行压缩;

s103、将压缩后的异常信息数据转储到存储介质;

s104、当异常信息服务层需要获取异常日志时,调用封装的lzo数据解压缩函数接口,对异常信息数据进行解压缩;

s105、将解压缩后的异常信息反馈给异常信息服务层。

本发明的压缩模块以内核移植的lzo1x-1为蓝本,将lzo所有的复杂操作封装在四个函数接口中,分别是内存资源申请函数、内存资源释放函数、数据压缩函数以及数据解压缩函数。

内存资源的申请:

在原生lzo接口中,进行数据压缩前需要进行繁琐的准备工作,例如额外内存的申请等,需要使用者熟悉接口中所有相关算法函数,对于使用者对算法的熟悉度要求较高。

因此,将数据压缩前的准备工作集成到一个函数中,lzo算法在压缩数据时需要额外的一块工作内存,具体到内核移植的lzo1x-1需要8k的额外内存,编码时需要对这块内存进行申请,并且压缩数据时也需要申请一块数据内存用于存放中转数据。通过上述操作,使用者只需调用一个函数,即可完成对数据压缩前的准备工作。

内存资源的释放:

将数据压缩或解压缩后的处理操作封装在一个函数,即在操作完成后,将工作内存释放掉,并释放掉原本用于存放中转数据的内存块。

数据压缩:

在内核移植的lzo1x-1中,实现压缩接口的函数如下:

intlzo1x_1_compress(constunsignedchar*in,size_tin_len,unsignedchar*out,size_t*out_len,void*wrkmem);

其中,第一个参数是待压缩数据的buffer指针;第二个参数是待压缩数据的长度;第三个参数是用于保存压缩后数据的buffer指针;第四个参数传进去的值是用来指示存放压缩后数据的缓冲区大小,执行成功之后通过指针返回的结果是压缩后的数据实际使用的缓冲区大小,即压缩后的数据大小;第五个参数是指向lzo额外需要的8k工作内存的指针。

改进后的函数首先通过一个互斥锁对压缩过程加以线程保护,然后调用内核已有的函数封装lzo1x_1_compress,并传入适当的参数,发起数据压缩处理,压缩后的数据保存在内存资源申请函数申请获得的数据内存中,并保存压缩后数据的长度,随后对数据长度进行判断,即压缩后的数据大小是否大于调用方预留的用于保存压缩后数据的大小,如果是则作异常处理,否则直接将得到的压缩数据拷贝到数据内存中,并返回压缩数据大小。

通过对原生lzo接口中的相关数据压缩函数进行封装,使用者没有学习成本,不需要清楚知道压缩算法的技术细节,使用步骤简洁。另外,加入线程安全保护,保证数据压缩的可靠性。

数据解压缩:

在内核移植的lzo1x-1中,实现解压缩接口的函数如下:

intlzo1x_decompress_safe(constunsignedchar*in,size_tin_len,unsignedchar*out,size_t*out_len);

其中,第一个参数是指向待解压数据buffer的指针;第二个参数是待解压数据的长度;第三个参数是指向存放解压后数据的buffer指针;第四个参数传进去的值是原始的未压缩数据的大小,执行成功之后通过指针返回的是实际解压缩后的数据的大小,因此,数据压缩时需要保留原始数据大小信息,否则解压缩时将无法进行解压。

改进后的函数首先通过一个互斥锁对解压缩过程加以线程保护,调用内核已有的函数封装lzo1x_1_compress,并传入适当的参数,发起数据解压缩处理,并对函数返回的解压后数据大小进行判断,只有在解压后数据大小等于原始数据大小时,解压缩数据才会成功。

在异常日志转储时,异常信息核心处理模块在接收到内核异常场景的异常信息反馈时,首先调用封装的lzo数据压缩函数接口,对异常信息进行快速压缩处理,随后将压缩后的数据转储的bmc或其他存储介质中,上层的异常信息服务要获取异常日志时,读取请求会首先传递给异常信息核心处理模块,由其发起对bmc等存储介质的实际读操作,异常信息核心处理模块通过调用封装的lzo数据解压缩函数接口,将数据进行解压缩,最后将解压后的数据反馈给上层的异常信息服务程序。

在所述调用封装的lzo数据压缩函数接口之前以及调用封装的lzo数据解压缩函数接口之前均需调用内存资源申请函数;且在所述调用封装的lzo数据压缩函数接口之后以及调用封装的lzo数据解压缩函数接口之后均需调用内存资源释放函数。

本发明实施例通过针对异常日志转储而将原生lzo数据压缩接口进行重新封装,将原本复杂的接口算法封装至四个函数接口中,由于封装了原生lzo接口算法本身的复杂操作,使用者不必关心lzo算法本身,没有学习成本,不需要清楚知道压缩算法的技术细节,使用步骤简洁,且利于维护。

通过封装,最大限度的保证了调用方原有的代码逻辑,提高了代码的可读性,且对加入线程安全保护,保证数据压缩的可靠性。

如图2所示,本发明实施例还公开了一种用于异常日志转储的lzo压缩系统,包括:

异常信息监测模块,用于接收内核异常信息反馈;

异常信息压缩模块,用于调用封装的lzo数据压缩函数接口,将异常信息进行压缩;

异常信息存储模块,用于将压缩后的异常信息数据转储到存储介质;

异常信息解压缩模块,用于当异常信息服务层需要获取异常日志时,调用封装的lzo数据解压缩函数接口,对异常信息数据进行解压缩;

异常信息反馈模块,用于将解压缩后的异常信息反馈给异常信息服务层。

所述异常信息压缩模块包括:

压缩线程保护单元,用于通过一个互斥锁对压缩过程加以线程保护;

数据压缩单元,用于调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据压缩处理;

数据保存单元,用于将压缩后的数据保存在内存资源申请函数申请获得的数据内存中,并保存压缩后数据的长度;

异常判断处理单元,用于对数据长度进行判断,即压缩后的数据大小是否大于调用方预留的用于保存压缩后数据的大小,如果是则作异常处理,否则直接将得到的压缩数据拷贝到数据内存中,并返回压缩数据大小。

所述异常信息解压缩模块包括:

解压缩线程保护单元,用于通过一个互斥锁对解压缩过程加以线程保护;

数据解压缩单元,用于调用内核已有的函数封装lzo1x_1_compress,并传入参数,发起数据解压缩处理;

数据判断单元,用于对函数返回的解压后数据大小进行判断,只有在解压后数据大小等于原始数据大小时,解压缩数据才会成功。

所述系统还包括内存资源申请模块,用于申请8k的额外内存,并且压缩数据或解压缩数据时也需要申请一块数据内存用于存放中转数据。

所述系统还包括内存资源释放模块,用于释放内存资源。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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