摘 要: 在C/S模式下,车载终端的并发接入量是检验GPS车辆监控系统服务器性能的重要因素。为了满足大量终端的并发连接请求并快速响应用户操作,首先采用三层体系结构设计服务器,增强系统的可扩展性,实现模块间高内聚低耦合。其次对服务器接入模块部分应用IOCP模型进行优化,针对实际应用中信息定位、多类型终端接入、资源优化管理、数据正确性等问题,分别采取缓冲链表、内存池以及分包策略等方法进行有效解决。最后在实际应用项目中进行测试,实验结果均表明优化后的服务器性能和稳定性具有明显的改善。
关键词: GPS车辆监控;IOCP;线程池;内存池
近年随着社会经济的快速发展,城市交通紧张的状况不断地加剧,为了实现有效的、科学的车辆信息管理,GPS车辆监控系统应运而生。GPS车辆监控系统通过无线网络,根据需要将车载终端GPS数据包括当前车辆的运行状况、位置信息和速度等接入服务器,并通过客户端向用户提供监控服务[1]。该监控系统主要由服务器、客户端和GPS车载终端三部分组成[2]。
其中,服务器部分是整个车辆监控系统的核心,主要完成车辆GPS车载终端定位信息和报警信息的采集、处理、转发,对客户端软件的指令快速响应与处理以及实现平台数据的管理,并且需要满足7×24小时为大规模的GPS车载终端提供接入服务。然而由于终端连接数目庞大,使服务器程序负载量大,无法快速地响应并处理海量终端的连接请求,造成系统不稳定。本文设计了一种性能和稳定性良好的服务器软件平台,采用三层体系结构实现模块高内聚低耦合,并结合IOCP网络通信模型来优化服务端,快速响应并处理海量车载终端的并发接入请求,在此基础上改善系统资源的优化管理,从而有效提高系统的性能和稳定性。
1 服务器设计
1.1 服务器体系结构
本文设计的服务器采用三层体系结构,如图1所示,分为数据接入层、处理分析层和业务服务层,目的是实现交通信息接入规范化、功能模块化、系统可扩展性强和模块间高内聚低耦合化等特点;并且在不影响业务正常运行情况下,各个模块可独立升级,符合定位业务不断发展的需求。
数据接入层通过各种数据接入与转换手段,实现数据的统一接入,具体通过Socket接口由车载终端连接到设备接入服务,实现双向数据通信,并在接入服务中实现数据的转换与统一,数据最后在网关进行汇总。
处理分析层实现模块化的统一处理,便于系统的扩展。不同类型的终端信息在经过数据接入层的处理后,由处理分析程序进行加工,实现业务功能。同时处理分析层也处理从用户端发送的业务请求,并将其通过终端操作完成后返回。
业务服务层基于处理分析层的数据处理结果,以及数据接入层采集并保存在数据库中的原始数据,向用户提供显示的平台业务功能。服务器体系结构如图1所示。
1.2 总体逻辑结构设计
服务器部分主要由设备接入服务、数据转发、GPS信息服务、命令服务、业务信息服务和数据处理应用、网络监控等模块共同组成。其逻辑结构图如图2 所示。
2 设备接入服务模块
在服务器设计过程中,设备接入服务模块需要快速响应和处理高并发终端的连接请求,设备接入服务模块设计的优劣直接影响到整个系统的稳定性和性能。为了进一步提高系统的性能,本节针对该模块的网络通信模型进行了优化,通过完成端口(IOCP)通信模型设计并实现海量终端的连接请求,并通过优化系统资源管理使性能得到提高。
2.1 IOCP机理
IOCP(Input Output Completion Port)也称完成端口,是微软提供的一种高效异步I/O通信模型。它摒弃了普通通信模型在接收到一个客户端连接请求时就对应地创建一个线程来应答,而是通过创建一定数量的工作线程,对重叠I/O操作完成处理[3-6]。
实际上,将完成端口看作系统维护的一个消息队列,系统将所有用户的I/O请求都放入该消息队列中,并且从起先创建好的一定数量的工作线程中唤醒某一个线程来从I/O完成队列中取出消息,完成数据的处理。
2.2 线程管理
由于数据收发的处理对系统资源和处理器时间的消耗极为巨大,而本文所采用的完成端口通过使用线程池技术对所创建的线程进行有效的管理,从而较好地解决并发用户连接的请求以及并发处理数据。一般系统线程池中工作线程可以归纳为3种状态:运行中的状态、被挂起的状态以及在完成端口上等待的状态[7]。
默认情况下,线程池中的所创建的线程数目等于CPU的数目,但是一旦线程处于被挂起状态,CPU就会处于空闲的状态。因此定义线程数目对系统效率也有很大的影响。然而过多数目的线程不一定换来系统的高处理能力,因为如果过多的线程并行运行在操作系统中,那么任何一个线程都有可能获得时间运行分片,使得CPU疲于线程之间的上下文切换,造成CPU时间浪费,从而降低系统的处理能力。而根据实际应用的效果,可以得出合理的工作线程的数目=CPU的个数×2+2。
2.3 GPS车载终端接入管理
2.3.1 监听优化管理
对于终端接入的管理,主要采用缓冲链表策略处理。当终端连接上系统,先将其插入到缓冲链表中,然后对此链表中终端进行2 min的判断。若2 min内终端连接并且发送数据,就将其从缓冲链表中删除;若终端连接却不发送数据,就将其连接断开,目的是用来防止长时间连接的Socket不发数据却一直霸占着系统资源,造成资源浪费。
2.3.2 多类型车载终端的接入管理
由于各地GPS车载终端厂商不一样,导致设备终端的生产设计标准各异。在实际应用中,需要在设备接入模块中考虑解决多类型的车载终端接入问题,本文在设计接入模块时,为每一种类型的终端建立一个对应的协议类,并且为每一类型的终端建立单独的监听端口。在监听之前事先根据端口进行注册协议,即将协议与监听端口相绑定,当终端接入时,根据Socket所连接的端口映射到对应的协议解析类中进行解析。如果有新类型的GPS车载终端,就对应的构造一个对应的协议解析类,这样不仅增加了系统的可扩展性,也解决了车载终端设备多样化的问题。
2.4 内存资源优化管理
作为设备接入服务端的开发,合理地管理内存是一个极其重要的问题。在处理数据的过程中,必定不断地进行内存申请和释放的操作。由于系统的资源有限,如果频繁对内存进行new和delete,势必造成系统堆栈变得杂乱无序,产生很多内存碎片,造成系统不稳定,降低性能。在此本文采取内存池的方法来解决,首先根据实际应用需求,事先创建好一定数量的单IO操作数据块,并将其一并放入到一个空闲链表中。当需要进行单IO操作数据空间的申请时,就从空闲链表检查是否有满足的空间,若满足,则分出一部分内存空间进行使用;若不满足,则继续申请新的内存空间。当使用完这个单IO操作数据空间时,并非直接销毁掉,而是将其保存到空闲链表中,供下次使用。这样就会消除因为频繁申请和释放内存带来的碎片,减少了系统资源的浪费,使系统性能得到提高。
2.5 数据处理
在开发接入模块时,传输层通信的协议采用TCP协议。由于TCP字节流的特性以及网络状况,在进行数据传输时可能出现TCP粘包现象。假设接收端接收数据时,可能出现图3所示的4种情况,白色表示Package1,黑色表示Package2。
第一种情况是所需要的。而后3种情况属于TCP粘包现象,需要对数据进行拆包,拆成如第一种情况一样的独立的数据包。
针对以上现象给出分包算法。假设接收到的数据长度为N,首先将数据转换成自定义的结构体形式,并获取结构体中数据长度字段的值L进行对比判断。
(1)如果L<N,则说明所接收到的数据是多包数据,按照长度字段的值截取L字节数据进行数据处理,而后继续按照如此做法截取,直至结束;
(2)如果L=N,则说明所接收到的数据是一个完整的数据包大小,直接进行数据处理;
(3)如果L>N,则说明所接收到的数据不足一个数据包大小,存进临时缓冲区中,等待接收下一个数据包进行合并后再进行判断。
通过分包算法能很好地解决TCP粘包的现象,并正确执行数据处理。
3 实验结果与分析
针对设备接入服务模块的性能测试,本文主要从最大可支持终端的连接数目、车载终端饥饿数目(在指定时间内无法得到设备接入服务模块响应的终端数目)、系统CPU和内存使用情况等4个方面来测试。为了更好地验证本文应用IOCP模型对终端响应进行优化的效果,在测试阶段实现了基于线程模型的性能对比测试。
3.1 实验环境
使用5台处于同一个局域网的台式机,其中接入模块所在的主机配置为:Intel I3 双核处理器,主频2.66 GHz,2 GB内存。另外4台客户机配置为:Intel Pentium双核处理器,主频2.20 GHz,1 GB内存。每台客户机上运行一个模拟车载终端程序,能创建5 000个Socket连接模拟实际GPS车载终端的连接情况。
3.2 实验结果分析
通过实验验证,可以得出基于IOCP模型的设备接入服务模块最大可支持终端的连接数目可达20 000个。从图4(a)可以明显看出,随着终端数目的增加,即随着Socket连接数的增多,基于线程模型的服务端饥饿的终端数量也随之增多,而基于IOCP模型的服务端没有出现终端连接请求得不到响应的情况。
图4(b)、图4(c)为基于IOCP模型接入模块的系统资源消耗情况。可以看出,虽然刚启动程序,内存资源就消耗了100 MB,但随着终端数目的增加,CPU和内存的消耗情况并没有随之而快速增长,而是缓慢地增长,因此可以得出基于IOCP模型的设备接入服务模块具有良好的伸缩性能。
基于上述设备接入服务模块实现了GPS车辆监控系统,该系统已在福州某出租车公司接近500辆车在线运营监控管理应用。在实际运行过程中,系统都能快速、及时地响应GPS车载终端的接入请求,并且呈现出良好的稳定性和性能。
针对需要快速响应并处理高并发量的GPS车载终端的连接请求,本文对GPS车辆监控系统的服务器进行优化。一方面本文优化服务器架构设计,将服务器结构划分成三个层次,避免单个服务器程序压力太大,实现高内聚低耦合。另一方面结合IOCP通信模型对设备接入服务模块进行性能优化。通过采用线程池、内存池等方法较好地解决海量终端并发接入请求、信息定位和资源浪费等问题。其次,采用缓冲链表对终端接入进行监听优化,避免恶意连接消耗系统资源。对多类型的终端协议进行统一管理,解决多类型终端接入问题。最后,为了确保数据的正确性,在报文数据处理部分结合分包策略使得TCP粘包现象得到有效解决。另外,经过实际项目的应用,表明该服务器具有较好的性能和稳定性。
参考文献
[1] Liu Dan,Liang Zongwen,Li Yichao,et al.Research and design of a high performance GPS vehicle monitoring system[C].2010 International Conference on Future Information Technology and Management Engineering,2010.
[2] 齐跃,刘浏.GPS车载监控系统并发服务器的设计策略[J]. 武汉理工大学学报(信息与管理工程版),2012,34(4):471-473.
[3] Wang Xinyu.A method using IOCP model to improve the performence of network equipment management systems[J]. Journal of Guangxi Academy of Sciences,2012(1):9.
[4] Zhang Weiguo,Shi Donghui,Li Lifeng.The design of the underlying network communication module based on IOCP[M]. Communications and Information Processing.Springer Berlin Heidelberg,2012:17-24.
[5] 廖宏建,杨玉宝,唐连章.完成端口实现高性能服务端通信层的关键问题[J].计算机应用,2012,32(3):812-815.
[6] GAO W,WU H,ZHANG Q,et al.An agricultural information transmission system based on smart display terminal and IOCP[J].Intelligent Automation and Soft Computing,2010,16(6):935-943.
[7] 陈怀松,陈家琪.IOCP写服务程序时的关键问题研究[J]. 计算机工程与设计,2010,31(17):3793-3796.