组态软件内存实时数据库性能测试
扫描二维码
随时随地手机看文章
引言
伴随着分布式控制系统DCS(DistributedControlSystem)的出现,以及其在工控领域的广泛应用,组态软件开始逐渐被广大技术人员所熟悉。“组态”的概念最早来自英文Configuration,其含义是使用软件工具对计算机及软件的各种资源进行配置(包括进行对象的定义、制作和编辑,并设定其状态特征属性参数),达到使计算机或软件按照预先设置,自动执行特定任务,满足使用者要求的目的。
组态软件是应用在数据采集和过程控制层面的一种专用软件,应用在分布式控制系统数据监控层一级。通过使用组态软件,可以为DCS工控系统提供良好的用户开发界面以及简洁的使用方法,可以非常容易地实现和完成对分布式工业控制系统各个模块的模拟和监控功能,使计算机图形界面与工控系统真实设备联系起来;通过集成各个硬件厂家的I/O接口以及设备接口,组态软件能够采集到工控设备的现场数据,通过实时数据库进行处理,并存储到历史数据库供查询使用;通过设置,可以对采集数据提供报警和报表功能;同时,组态软件应该能支持各种工控设备和常见的通信协议,并且通常应提供分布式数据管理和网络功能。
组态软件产品于上世纪80年代初出现,并且得到了良好的发展,目前世界上的组态软件有几十种之多,其中主要包括美国Wonderware的Intouch、美国Intellution公司的Fix、澳大利亚Cit公司的Citech、德国Simens的Wince、北京亚控自动化软件有限公司开发的组态王(Kingview)、大庆三维公司的ForceControl以及北京昆仑通态自动化软件科技有限公司开发研制的MCGS等。伴随着国家对工控领域的支持不断加大,
收稿日期:2014-01-14
组态软件将在工控信息化中扮演越来越重要的角色,未来发展的空间也会不断扩大。
1内存实时数据库
大批量生产、连续加工过程、高度自动化程度是流程工业的特点,这需要在过程监控时提供高速的数据处理、长期的数据存储。工业控制系统是一个实时系统,它实时地从外界采集数据进行运算、判断后输出控制量,因此对数据的管理呈现出实时特点[3]。因此,实时数据库是组态软件处理数据、组织数据和管理数据的核心,它能够高效地处理和存储工控系统生产过程中的实时数据,为优化过程控制和企业的经营决策提供完整的实时数据和完备的历史信息叫
根据工控系统的特点,在工业组态软件中需要应用内存实时数据库,分以下几种情况:内存实时数据库整个数据库常驻内存,对数据的存取不需要I/O操作;整个数据库不用常驻内存,但存取数据时,应先进入内存,即数据库的存取在内存中进行;数据库常驻磁盘,增大缓冲区,在一个事务执行之前,所有的数据都已经取到内存,经适当的缓冲区管理减少甚至消除I/O[5],这些特点决定了内存实时数据库能够及时有效地处理和维护大量的共享数据和控制数据,满足工业组态软件对于事务时间性方面的要求。
对于内存实时数据库来说,由于已不再涉及I/O,所以在时间和空间矛盾的处理上,空间是第一位,系统的算法设计目标应该是内存空间和CPU的高效使用。为了达到这一目标,应该对内存实时数据库的数据组织结构、事务处理和数据管理、并发控制及恢复技术、内存置换页面以及缓存大小等方面进行研究与测试[5],使其能够提供更好的性能,满足工业控制组态软件的需求。
2内存实时数据库性能测试
2.1测试目的
针对内存实时数据库的特点和研究与测试方面的要求,设置内存实时数据库的数据组织形式、内存置换页面大小以及缓存大小,通过测试数据,得出不同的配置组合对内存实时数据库性能上的影响,为下一步的研究工作打下基础。2.2测试环境
测试对象采用BerkeleyDB内存实时数据库系统。BerkeleyDB历史悠久,主要应用在Unix/Linux操作系统上,其设计思想是简单、小巧、可靠、高性能。它可为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。同时BerkeleyDB为数据的存取和管理提供了一组简洁的函数调用API接口。BerkeleyDB对接收到的实时数据采用关键词(Key)和数据(Value)的存储结构,这两者构成的Key/Value对组成了数据库中的一个基本结构单元,而整个数据库实际上就是由许多这样的结构单元所构成的。通过使用这种方式,简化了实时数据的存储逻辑关系,同时,简便的数据库查询和访问方式也能够满足工业组态软件的需求。所以,在此测试中,所有的数据插入的都是Key=int,Value=int,在循环中递增的。
本机配置如下:
OS为Windows7旗舰版;RAM=8GB;CPU=IntelCorei7-3770CPU3.4GHz;Disk=500GB;NTFS的默认簇大小为4KB。
测试的实际数据量为:
300*10000*2*sizeof(int)/1024/1024丝22.89MB;编译器:VisualC++6.0;BerkeleyDB内存实时数据库版本为db-5.3.21.NC2.3测试方法
循环插入int类型的数据,同时设置BerkeleyDB的参数,测试在不同存储方循环插入int类型的数据,同时设置BerkeleyDB的参数,测试在不同数据组织形式、内存置换页面大小以及Cache缓存大小的设置下,数据库读写的性能,以确定组态软件实时数据库部分的存储方式。
2.4测试代码
内存实时数据库性能的测试代码如下:
#include“stdafx.h”
#include"db.h”
#include“db_cxx.h”
#include“windows.h”
#include“winbase.h”
intmain(intargc,char*argv[])
{
size_tpsize=1;//设置页面大小,单位为KBsize_tcsize=10;//设置cache大小,单位为MBinttcount=300;//设置数据插入数量,单位为万次Dbdb(NULL,0);
db.set_pagesize(1024*psize);
db.set_cachesize(0,1024*1024*csize,0);u_int32_toFlags=DB_CREATE;try
{
db.open(NULL,"test.db",NULL,DB_
BTREE,oFlags,0);
}
catch(DbException&e)
{
}
catch(std::exception&e)
{
}
//实时数据插入
Dbtkey,data;
inti,ret,count=10000*tcount;
longt1=GetTickCount();//开始时间
for(i=0;i<count;i++)
{
Dbtkey(&i,sizeof(int));
Dbtdata(&i,sizeof(int));
db.put(0,&key,&data,DB_
NOOVERWRITE);
}
longt2=GetTickCount();//结束时间
printf("插入结束%d万记录,全部用时:%.2f秒\r\n",
tcount,(t2-t1)/(float)1000);
longtick1=GetTickCount();
try
{
Dbc*dbcp;
db.cursor(NULL,&dbcp,0);
Dbtkey;
Dbtdata;
while(dbcp->get(&key,&data,DB_NEXT)==0)
{
key.get_data();
data.get_data();
}
dbcp->close();
printf("遍历结束%d万记录,全部用时:%.2f秒\r\n",tcount,(GetTickCount()-tickl)/(float)1000);
db.sync(0);
}
catch(DbException&dbe){}
db.close(0);
return0;
}
2.5测试结果
代码运行界面如图1所示。
代码运行后所得到的结果如表1――表3所列。
表1页尺寸列表
(记录数量:300万,缓存尺寸:0MB单位:s)
读写 |
1KB |
2KB |
4KB |
8KB |
16KB |
32KB |
B+写 |
33.71 |
30.28 |
26.85 |
28.30 |
34.09 |
50.59 |
HASH写 |
50.92 |
46.32 |
48.64 |
54.10 |
67.44 |
91.39 |
B+读 |
2.03 |
2.00 |
2.03 |
2.11 |
2.20 |
2.34 |
HASH读 |
4.24 |
4.51 |
3.85 |
3.70 |
3.67 |
3.32 |
表2Cache缓存大小列表(1)
(记录数量:300万;页尺寸:4KB;数据库文件大小:80.2MB;单位:s)
读写 |
0MB |
10MB |
20MB |
40MB |
80MB |
160MB |
320MB |
B+写 |
31.78 |
17.04 |
16.04 |
15.12 |
11.50 |
11.37 |
11.33 |
HASH写 |
46.85 |
30.39 |
22.2 |
16.49 |
12.65 |
12.92 |
13.39 |
B+读 |
2.46 |
2.65 |
2.61 |
2.65 |
2.59 |
2.54 |
2.56 |
HASH读 |
3.73 |
3.54 |
3.2 |
3.21 |
3.12 |
3.18 |
3.25 |
表3Cache缓存大小列表(2)
Cache缓存大小(记录数量:600万;页尺寸:4KB;数据库文件大小:160MB;单位:s)
读写 |
0MB |
10MB |
20MB |
40MB |
80MB |
160MB |
320MB |
B+写 |
71.07 |
44.60 |
43.41 |
41.95 |
36.13 |
24.77 |
24.49 |
HASH写 |
102.21 |
85.82 |
67.00 |
52.56 |
43.51 |
28.24 |
27.75 |
B+读 |
5.21 |
5.48 |
5.51 |
5.49 |
5.41 |
5.30 |
5.24 |
HASH读 |
8.24 |
8.22 |
7.91 |
7.52 |
7.11 |
6.74 |
6.75 |
4 结 语
根据以上运行结果,可以看出组态软件内存实时数据库BerkeleyDB在采用B+树存储方式的时候,其写入和读取性能明显高于HASH存储方式;当页面尺寸为4KB时,BerkeleyDB的存储效率最高,随着页面尺寸的不断增大,效率反而逐渐降低;当确定了页面尺寸为4KB后,逐渐改变Cache缓存大小,比较300万与600万两种记录数量,发现无论是B+树的存储方式还是HASH的存储方式,当缓存很小的时候,效率都很差,而当缓存大小大于等于数据库文件大小时,效率最高,之后随着缓存逐渐增大,对效率的影响很小。
通过该测试可以得出,不同的数据组织形式、内存置换页面大小以及Cache缓存大小对内存实时数据库的效率性能影响很大,本文只针对B+树和HASH存储方式进行了测试,测试的内容并不完善,下一步应该对数据的组织形式进行深入的研究,挖掘更适合键值对形式的工业组态软件内存实时数据组织结构。
20211120_6197d95914a30__智能家居虚拟场景设1计与实现