工业实时数据库采用内存池技术实现动态内存管理的方法
技术领域
本发明是一种工业实时数据库采用内存池技术实现动态内存管理的方法。涉及信息的存储、数据的识别和控制技术领域。
背景技术
工业实时数据库为大型SCADA系统中的核心组件,一般应用于大型控制中心,对容量、吞吐量、并发性和实时性等性能指标有苛刻的要求,例如:北京油气调控中心,预计系统容量超过50万个信号量,每秒处理为10万以上事件,100个左右的客户端并发访问。这样的系统在运行时,涉及频繁的大小不等的内存分配释放的,采用C或C++语言开发,通常是调用C运行库的内存管理函数。这样做带来的问题有:C运行库的内存管理函数是整个进程共用,多线程并发访问对性能有较大影响;进程访问的内存分配释放,在测试中发现,其性能受系统其它运行程序影响较大,在要求实时性比较高的应用中,这种不确定性给性能优化带来一定困难;工业实时数据库通常是运行于后台的服务程序,需要高效的传递复杂数据类型,在网络数据流和内存数据结构之间转化必然涉及内存分配释放,这要求客户端和服务端对内存有统一的处理方式;C运行库要求程序开发人员成对进行分配和释放,给开发人员带来较大负担,很容易造成内存泄露,而且这样的缺陷极不容易发现。
如错误!未找到引用源。为工业实时数据库体系结构,实时存储引擎是一个高速的嵌入式数据管理引擎,存放的所有信息数据,支持整个系统运行。其重要的数据处理流程是,数据采集器把一批(如50个)采集的信号量发送给工业实时数据库,工业实时数据库在内存或磁盘上检索这些信号量的配置信息,根据配置信息处理这些信号量,如报警、计算,处理完成后保存数据,并把数据推送给需要的客户端。
从逻辑上讲,工业实时数据库按“点”(信号量)组织数据,由于采用实时存储引擎存储全局信息,任务之间的数据关联性比较小,调用的上下文关系简单,因此比较容易把工业实时数据库处理逻辑划分为相对独立的“任务”,以这样任务考虑和优化动态内存的管理方法是非常合适的。同样,工业实时数据库还有其它处理任务,如客户端查询,对配置信息的修改,后台的统计分析,都适用于这样的特点。
目前,一般编程方法中使用内存分配和释放不足
CN101799773A公开了一种并行计算的内存访问方法;CN102053872A公开了一种终端交易性能测试方法;US2009/0006502A1公开了一种基于特定应用的堆管理方法。它们都没有公开对每个任务创建一个或多个缓冲池并在完成任务后统一销毁内存池的技术,当然也就没有由此带来的提高服务程序运行效率、简化动态内存变成负担的技术效果。
发明内容
本发明的目的是发明一种能提高工业实时数据库动态内存管理性能、运行效率以及简化动态内存使用方法的工业实时数据库采用内存池技术实现动态内存管理的方法。
在大型工业实时数据库系统中使用内存池技术管理和组织动态内存的方法,通过把工业实时数据库的处理逻辑或业务划分为相对独立任务,每个任务使用一个或多个内存池用于管理该任务中的内存分配,实现内存多次分配,统一释放。
本发明在分析工业实时数据库特点的基础,为了克服采用一般编程方法中使用内存分配和释放的不足,提出采用内存池管理动态内存的方法,可以大大提高服务程序的运行效率,简化开发人员动态内存编程的负担,并且具有一定普遍性。
工业实时数据库体系结构如图1所示,在网络调用及任务调度层实现网络调用,在实时报警、实时计算、订阅发布、数据下行、采集管理层实现业务逻辑处理,在实时数据关系逻辑表示层和实时数据存储管理层实现实时存储引擎。
其方法如下:
1.提出从按“任务”的角度看待工业实时数据库对动态内存的使用过程;通过对工业实时数据库典型应用场景、功能、运行模式等进行分析,合理规划任务以及内存使用情况;
2.对每个任务创建一个或多个内存池,生成内存池句柄作为参数传递给后续处理模块,并根据该任务的功能,预先分配一定的内存大小(缺省4K),以提高使用效率;
3.在任务运行过程中,根据需要使用内存池进行需要分配和释放,对于返回参数或模块之间传递的数据,可以不用释放,直接在内存池中分配并赋值返回给调用方即可;
4.当任务完成后,不需要逐一释放返回参数或传递的数据,统一销毁内存池,在内存池中分配的内存一次性释放。
具体步骤如图2所示:
1)客户端应用创建内存池;
2)发起网络调用,传入内存池句柄;
3)输入参数打包发给远程工业实时数据库,等待应答;此步与等待客户端请求均转下步;
4)接收客户端请求,创建内存池;
5)把输入参数和内存池句柄作为参数传递给业务处理模块;
6)在若干业务模块中处理客户端请求,使用内存池管理动态内存,同时在内存池分配动态内存保存输出参数;
7)内存池中的输出参数打包转化为网络字节流,回传给客户端调用;
8)后一路销毁内存池,本次请求过程使用的内存释放;另一路为收到服务器应答数据流,解包后,在内存池里分配内存保存返回参数;
9)客户端应用根据业务需要使用返回数据;
10)销毁内存池,所有远程调用使用的内存释放。
本发明指的任务是工业实时数据是完成一定功能的运行逻辑。任务可以是一次或多次网络调用,现场采集信号量的实时数据的入库,一条SQL语句的执行过程,客户端查询或数据下行,后台实时统计分析等。任务之间相对隔离,全局共享信息都由实时存储引擎维护,基本可以避免任务之间数据交叉访问的情况。任务的执行时间比较短,大概在几十毫秒到几秒的数据量级,不会长时间占用过多的内存。
本发明采用的内存池是一种非常轻量级的内存池,存在的生命周期也比较短,不必过多考虑内存空间优化的问题,因而可以采用效率极高的动态内存分配算法,并且内存池本身很容易创建和销毁;内存池创建时预先向系统申请一块大小适当的内存块(如4K),当内存不够用时,内存池自动向系统申请一块较大的内存块补充到内存池中进行管理;在程序运行过程中,当需要动态内存时,内存池在内部分配一块可用的空间给任务,程序不需要逐一释放在内存池中分配的内存,在任务完成后,销毁内存池,所有分配的内存全部释放给操作系统;在程序调试阶段,很容易跟踪到内存使用情况,为系统优化提供重要依据。
在任务的执行过程用内存池管理动态内存优势在于:在一个局部范围内根据程序执行的功能最大程度的优化动态内存管理效率;把程序运行过程,把大小不等的内存请求转化为大小适当,并且按操作系统内存页面对齐的内存块请求和释放;通常任务都是在一个线程中完成,避免了内存使用过程中的并发操作,不同任务之间使用的内存是相互隔离的;开发人员不必小心翼翼处理内存分配和释放,可以根据需要在任务过程中只分配,不释放,在任务完成后销毁内存池,所有分配的内存都被释放;在远程调用过程中,可以用于分配复杂的数据类型,规范网络调用的数据传输,为客户端开发人员提供逻辑上一致的内存管理视图。
如错误!未找到引用源。所示为客户端程序在调用工业实时数据库功能时,内存池应用的一个示例,在远程调用过程中,客户端和服务端各自创建了一个内存池,用于处理本次调用请求的“任务”。可以看到,在这种环境下应用内存池,巧妙的处理了输入输出参数传递时动态内存的分配和释放,无论在客户端还是工业实时数据库服务端,内存池的创建和销毁是由网络调度层完成,实际业务逻辑开发人员可以不关心参数的传递和内存池创建销毁等细节,这对于简化开发工作,提高代码质量有极大的帮助。
附图说明
图1工业实时数据库体系结构图
图2内存池应用图
具体实施方式
实施例.本方法在某油气管道SCADA系统软件国产化项目中,作为该项目验证关键技术之一,进行了大量的实验和测试,并且作为核心技术固化到系统整个架构之中,经过测试,性能有明显的提升,同时该发明很大程度简化动态内存使用,提供代码开发效率。
如下步骤:
1.提出从按“任务”的角度看待工业实时数据库对动态内存的使用过程;通过对工业实时数据库典型应用场景、功能、运行模式等进行分析,合理规划任务以及内存使用情况;
2.对每个任务创建一个或多个内存池,生成内存池句柄作为参数传递给后续处理模块,并根据该任务的功能,预先分配一定的内存大小(缺省4K),以提高使用效率;
3.在任务运行过程中,根据需要使用内存池进行需要分配和释放,对于返回参数或模块之间传递的数据,可以不用释放,直接在内存池中分配并赋值返回给调用方即可;
4.当任务完成后,不需要逐一释放返回参数或传递的数据,统一销毁内存池,在内存池中分配的内存一次性释放。
以下给出两组比较有代表的测试对比。测试机器为工作站,4核CPU(IntelCore 2 Q66002.4GHz),2G内存,Windows Server 2003企业版。
性能对比1,单纯内存分配性能比较。
定义2000个指针的数组,依次分配从1个字节到10K字节的内存,在下一次循环过程中释放再分配,共计循环10000次,统计时间,测试10次取平均值。
采用内存池技术用时平均3.5秒。
使用CRT运行库用时平均24.7秒。
性能对比2,模拟工业实时数据库数据处理性能比较。
模拟测试工业实时数据库处理实时数据(信号量)的流程,包括查询该点的配置信息,逻辑处理,数据入库的过程。调用开发测试程序直接调用工业实时数据库接口。其中配置信息查询和实时数据入库涉及较多动态内存分配,尤其对于复杂不定长数据类型的处理。
在测试场景中,分别定义2个表,其中一个是含有20个复杂数据类型字段的表(实际上,工程应用中不会用到很多复杂数据类型),模拟配置信息,另一个是定义4个字段的表,模拟实时数据,分别生成100万条记录。在这两个表上开发测试程序,用于模拟实时数据库对数据的处理过程。测试结果为:
采用内存池技术,平均每秒处理7.0万条实时数据。
采用CRT内存分配,平均每秒处理5.8万条实时数据。
可以看出,在测试1中,采用内存池技术,比全局的CRT内存管理效率高了一个数量级;测试2中,在实时数据引擎的性能优化到极致的情况下,采用内存池优化处理过程动态内存的使用,又使得性能提高20%左右。