周 帆
(中国兵器工业第203研究所,西安 710065)
随着精确制导武器的信息化程度不断提高,制导部件、控制系统以及火控、侦指系统之间相互交换的数据量也随之激增。半实物仿真中需要对过程变量进行实时记录并存储,便于设计人员进行事后分析。目前,一般的做法是,整个仿真实验系统部署一台数据库服务器,数据采集单元将采集到的数据以文件形式保存,在实验完成后将所有的数据文件通过特定的格式转换脚本或转换软件导入数据库。
这种应用模式的问题是:1)应用复杂度高。目前系统中一般都采用微软的SQL Server、MySQL等数据库产品,但这些产品都是面向大型企业级应用,虽然其功能非常强大、成熟度很高,但配置复杂、使用难度较高以及需要专门的维护人员等约束使得部分实验系统中的数据库利用率极低,没有起到应有的作用。2)操作流程复杂。各种数据采集节点将数据按一定的格式保存,在导入数据库时,需要针对不同的格式提供专门的工具进行数据抓取后录入,增加了操作复杂度。3)价格昂贵,性价比低。考虑到半实物仿真实验系统中一般只能用到数据库系统相当小的一个功能子集,其性价比是相当低的。
鉴于以上三点,文中提出了采用轻量级的嵌入式数据库系统SQLite为基础的半实物仿真系统设计方案。
SQLite是一款轻量级的开放源码数据管理系统,支持绝大多数SQL92标准操作。最初是由D.Richard Hipp为美国海军舰载反导系统设计,提供免安装、免维护的数据存储、管理能力,用于取代反导系统中庞大、复杂的Informix后端数据库服务器。2000年夏天SQLite推出1.0版本,到目前为止,SQLite已经发布3.7.11 版。
1)免维护。SQLite数据库管理系统无需安装即可直接使用,用户可以直接对数据库进行操作,不需要专门的数据库管理员首先去创建相应的数据库实例。系统宕机或断电不会导致数据丢失的问题。
2)无需服务器,通常使用的各种数据库产品都有一个服务器进程,用户需要对数据库操作时都要用到一些进程间通信的方式来访问数据库。而对于SQLite来说,用户进程可以对存储在硬盘上的数据库文件直接进行操作,不需要任何中间环节。
3)单一数据库文件。SQLite数据库和硬盘上的一个普通文件没有任何区别,可以直接删除,或移动到其它任何目录或载体中。而普通的数据库管理系统一般都把数据库文件放在一个特定的目录下,只有数据库管理系统可以访问它,虽然这增加了数据的安全性,但是随之而来的建立和维护复杂度却大大提高。
4)稳定的跨平台支持能力。SQLite数据库文件格式是跨平台的,一旦数据库文件创建后,不论是Windows、类Unix平台,32位或64位平台都可以直接使用。
5)占用资源少,处理速度快,经过优化的SQLite仅为350KiB左右。
某型精确制导武器半实物仿真系统中,采用SQLite取代原先的SQL Server 2000数据库,系统部署图如图1所示。
图1 SQLite在仿真系统中的部署图
SQLite数据库直接部署在数据采集节点上,采集节点的业务逻辑不用发生任何改变,只需要将对文件的操作替换为对本地SQLite数据库的操作即可。下面给出使用SQLite实现采集节点业务逻辑的代码片段:
至此,数据库就已准备就绪可以通过SQL语句进行操作了。在数据记录线程中,首先从数据总线或数据缓冲区读取一帧数据,然后将数据组帧到一条SQL的insert语句中,再通过SQLite3_exec执行这条insert语句即可数据的入库操作:
最后,使用SQLite3_close(db)关闭数据库即完成了一次数据记录与入库的操作。
在该半实物仿真系统中,需记录的过程变量为60~80个,这里以80个为例,即每次向数据库中插入80个变量,进行100次插入操作考察数据录入的时间。图2给出了将数据写入数据库的时间测试结果(测试平台:硬件:Intel Pentium Dual 2.2GHz,1GB DDR2内存,7200RPM SATA-II硬盘,软件:Windows XP sp2 ,visual studio C++6.0 sp6,SQLite 3.7.11)。
图2 数据库插入操作时间
从图2可以看出,直接使用SQLite执行一条SQL的插入语句时延范围在78~157ms,均值为98.29ms。数据表明这样的数据录入效率将严重影响记录节点的运行,对于项目采样频率为1kHz的需求而言,一次数据录入将导致丢失100帧的数据。这种情况下,如果要使用SQLite数据库,只能在采集任务开始前,开辟足够的内存空间,所有的数据先记录在内存中,待一次采集任务完成后将所有数据再插入数据库中。这种方案有两个问题:1)采集任务完成后的数据录入过程耗时过长,这里还是以每帧80个变量为例,数据采集时间为20s,采集完成后的数据入库时延如图3所示,横坐标为测试次数,纵坐标为数据录入时间(单位:min)。虽然对数据采集与保存本身没影响,但30min左右的数据入库时间是无法容忍的。2)对于长时间的数据采集任务,有内存耗尽的潜在问题。
这里提出两种解决方案。1)对大批量数据入库操作进行优化,缩短数据录取时间;2)优化数据库单次插入数据的延时,采用多线程技术在数据采集的同时完成数据的入库工作。
图3 批量数据入库时间
在数据库管理系统中,事务(Transaction)被定义为对特定数据库的一组SQL操作,这组对数据库的操作要么全部执行,要么都不执行。在SQLite中每一条INSERT/UPDATE语句都默认的被当作一个事务被执行,每一次执行就涉及一次数据库的打开-写数据库-关闭数据库的操作,因此大大延长了数据库操作的时间。因此,可以将批量的INSERT/UPDATE语句显式的定义为一组事务,代码如下所示:
图4为使用事务处理批量插入后的系统数据录入所需的时间。
对比图3可以看出,使用事务处理后,系统的数据录入时间缩短到优化前的约1/900。以达到用户可接受的范围。
图4 采用事务后批量数据入库时间
SQLite的同步(synchronous)选项相当于一种同步IO机制,所有对数据库的修改都必须等待本次操作写入到磁盘上后才返回。当频繁的对数据库进行INSERT/UPDATE时,可以选择关闭同步选项,进一步提高数据入库的速度:
图5是关闭同步选项前后,批量数据录入时间的对比。
可以看到关闭同步选项后,数据录入操作时间可再缩短100ms左右。
图5 同步选项对批量数据录入时间影响对比
上面针对数据采集完成后,数据批量入库时的性能进行了优化。如果希望在数据采集的同时进行数据的入库工作,那么可以组合使用关闭同步选项以及更改 SQLite默认日志模式的方式来提高单次INSERT操作的效率。SQLite中日志是在系统遇到宕机或断电时用来恢复数据库,保持数据库完整性的措施,默认情况下日志是随着对数据库的操作一起写入磁盘的,这里可以将其修改为内存记录模式:
图6 优化后单次数据插入时间对比
);
图6为针对单次插入数据库操作使用不同优化选项的测试结果。
结合以上提到的集中优化策略,向SQLite中单次插入数据的时间可以控制在0.2ms以内,是优化前的1/500。对于采样周期为1ms的采集节点,完全能够实现边采样边入库的操作模式。
SQLite的内存数据库模式就是直接将数据库创建在主存中,相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大的提高应用的性能。图7是采用内存数据库模式时,数据入库的时间与优化后的磁盘数据库单次插入数据时间对比曲线。
采用内存数据库,在不进行任何优化时的单次数据录入时间与优化后的磁盘数据库基本相当。因此在采集节点也可采用内存数据库的模式实现数据的边采集边录入。
图7 内存数据库模式数据入库时间
以上几点优化方法都是通过对SQLite本身进行各种优化选项的组合,从而提高其数据录入效率来满足实际需求。磁盘数据库之所以操作时延长,其瓶颈在于硬盘的访问速度。如果更换为SSD固态硬盘,其操作效率将大大提高,图8为在SSD固态硬盘上相应的测试曲线。
使用SSD硬盘后,同样在未经任何优化的条件下,SSD硬盘上的插入性能较传统硬盘提高了近200倍。而经过优化后,SSD硬盘上的插入性能也提高了近2倍多。可见SSD硬盘的使用对数据库访问性能的提高还是很明显的。
图8 SSD与普通硬盘数据录入时间对比
文中通过5点优化策略切实的提高SQLite数据库访问速度的方案,使SQLite数据库的性能满足半实物仿真实验中实时数据录入需求。同时也证明了SQLite在功能和性能上可以很好的取代目前使用传统商业数据库,解决半实物仿真系统中数据库投入大、维护难、利用率低的问题。
[1](美)Grant Allen,Mike Owens.SQLite权威指南[M].2版.北京:电子工业出版社,2012:21-137.
[2]http://www.sqlite.org,SQLite[OL].
[3]蔡勇,王勇.嵌入式数据库SQLite在测控系统设计中的应用[J].电子测试,2011(10):89-93.
[4]万玛宁,关永,韩相军.嵌入式数据库典型技术SQLite和Berkeley DB 的研究[J].微计算机信息,2006,22(1/2):91-93.