GPS车载监控系统并发服务器的设计策略
2012-08-01齐跃,刘浏
齐 跃,刘 浏
(1.江苏顺天海运集团有限公司综合办公室,江苏 南京 210016;2.武汉理工大学计算机科学与技术学院,湖北 武汉 430070)
GPS(global positioning system)凭借其高精度、全天候、高效率及全球性等特点在各领域发挥着重要的作用。在互联网与移动通信交叉的领域尤其能显示出其优越性[1-5]。GPS车载监控系统是依托卫星定位、地理信息及无线通信等技术手段,实时掌握车辆位置和状态数据,为物流运输企业提供调度管理信息的软硬件综合系统。
然而车载终端必须与服务器程序和客户端程序相融合才能发挥其作用。由于客户连接数和数据量庞大,使服务器程序承受的压力也很大[6-7]。高性能服务器程序的主要作用是能够高效地处理大量并发客户的请求,并且快速及时地处理客户的数据,同时将部分应答信息回传给客户端。设计一个性能优良的服务器程序,需要考虑很多方面的因素,如CPU的使用率、Memory的开销等。要想高效处理并发用户的请求,服务器程序就需要解决两个主要问题,一是处理并发客户的连接请求,二是处理并发数据。解决这些问题,可以根据处理器内核的数量来创建等量的工作线程,并结合I/O完成端口(input/output completion port,IOCP)模型,以及操作系统的线程调度机制[8-9]。笔者基于多线程并结合IOCP模型设计和实现了高性能的服务器程序。
1 整体框架
基于车载终端的并发服务器系统结构图如图1所示。客户通过车载终端使用GSM通信设备向服务端程序发送信息。由服务端程序对数据信息进行分析处理,并将部分处理结果反馈给客户,同时将数据存储到数据库作为备份以供网站使用,客户可以通过网站查询汽车的相关信息[10]。
图1 基于车载终端的并发服务器系统结构图
2 服务器程序的设计
2.1 IOCP模型原理
IOCP是一种能够合理利用与管理多线程的机制。它是迄今为止Windows平台上最为复杂的一种I/O模型。当应用程序必须一次管理多个套接字时,I/O完成端口模型提供了最好的系统性能,也提供了最好的伸缩性,非常适合用来处理上百、上千个客户请求。
IOCP模型提供了一个高效复杂的内核对象,该对象通过指定线程的数量,可以在套接字上投递重叠发送和接收请求处理I/O。
2.2 采用IOCP模型处理并发用户
2.2.1 多线程的并发处理
高并发的大型服务器程序一直面临着架构复杂、线程众多、难以管理及并发性能提升困难等问题。对于Windows平台,通过IOCP的内核对象,可以方便地创建高并发、高性能和可伸缩的网络服务器程序。图2为IOCP模型用来解决大量用户同时请求连接服务器问题的示意图。
图2 IOCP模型图
秉承低耦合的原则,在服务器程序设计中,创建了4个独立的线程来进行调度处理客户的连接请求。采用这种4个线程(双核处理器)处理的机制处理用户连接请求的建立,能够较好地解决大量并发用户的连接请求。
2.2.2 并发客户缓冲链表策略
在该服务器程序的设计中,采用链表缓冲策略进一步解决这个问题。该策略的原理图如图3所示。
图3 缓冲链表图
把已经建立的客户插入到缓冲链表中以供其他线程接收客户端发送过来的数据。在这种模式下,这4个线程只需与客户建立连接,而不必处理客户的其他请求,也不必因为等待客户端的数据而阻塞在建立连接的线程中,从而提高了服务器程序处理客户请求的速度。
2.2.3 并发互斥的控制
为处理好这几个服务器程序中的几个线程之间的互斥问题,笔者采用了临界段,通过临界段来控制线程之间对共享数据(数据缓冲链表)的操作。该机制在很大程度上可以解决服务器程序因访问同一内存地址,而导致的内存访问冲突[11-12]。
2.2.4 懒惰资源的智能回收机制
在服务器程序设计过程中还需考虑到系统的资源有限,不能把系统宝贵的资源分配给一些长时间没有任何操作的客户。在该服务器程序中把分配给这些用户的资源称为懒惰资源。为了充分利用系统资源,服务器程序采用了清理策略,即模拟线程池机制,先在系统中申请一块连续的内存空间,之后的内存申请就在这些已经申请好的内存中进行分配;另外,只要客户在规定的时间内不进行任何相关的操作如未发送数据,线程则强制关闭该客户并将其所占的懒惰资源回收到内存池重新利用。
然而,采用链式的处理思想存在一定的误差,即不能够很准确地在规定的时间内将所有符合条件的客户连接断开,但是这种方法能够减少系统宝贵资源的消耗。
2.3 大量并发数据的处理
在该服务器程序中客户端每隔一定的时间便向服务器发送指定格式的信息,因此数据信息量是非常庞大的。为了解决这个问题,采用了双缓冲机制的策略,通过使用两个缓冲区实现对大量数据的接收和处理。其原理图如图4所示。
图4 双缓冲区原理图
2.3.1 数据的接收
采用单独的线程接收来自客户端的数据。在数据接收线程中用while(true)来判断,使该线程不断地接收来自客户端的数据,从而避免缓冲区的数据没有得到及时的处理。但若只是采用while(true),那么该线程将会消耗大量的系统资源。为解决该问题,采用事件通知机制,使得该线程只有当客户端有可以接收的数据时才进行工作,从而避免了系统资源的消耗。
2.3.2 数据的处理
为了缓解缓冲区的压力,应及时处理缓冲区的数据。同样,为了提高系统的性能,降低系统资源的开销,采用了事件通知机制,即只有SQL处理队列中有SQL语句,才使该线程做相关的工作。这种机制在很大程度上提高了服务器程序的性能。
2.4 智能线程重启
由于服务器程序中存在若干个线程,只要一个线程因异常或者运行结束而退出,那么其他线程基本上做的都是无用功。因而该系统必须解决线程退出或者因异常而结束的问题,从而确保整个系统能够良好运行。因此创建了一个检测线程,在该线程中不断地检测各线程是否正常运行;另外,由于考虑到服务器程序性能的问题,并不是使该线程一直使用时间片,而是采用在指定的时间间隔内对服务器程序中的所有线程进行检测,如若发现线程异常或退出则重新启动线程,从而使服务器程序能够继续正常工作。
3 试验结果分析
为了检测使用IOCP模型设计的服务器程序的性能,将从CPU利用率和内存的使用率两个方面进行分析。并将其与Select模型的结果进行对比,得出IOCP模型在服务器程序设计上具有较佳的性能。比较结果如表1和表2所示。
表1 IOCP与Select模型CPU利用率比较
表2 IOCP与Select模型内存利用率比较
4 结论
GPS车载终端要求服务端程序能够高效地处理并发数据和并发客户的连接请求,同时要求服务端程序能够及时地对客户的操作做出响应,笔者使用IOCP模型并结合多线程对服务器程序进行设计,能够较好地满足GPS车载终端的要求。还采用了双缓冲机制、懒惰资源回收机制、事件通知机制,以及智能线程启动策略,对服务器程序性能进行优化。
该服务器程序在设计过程中虽然结合了多种算法和模型,但尚有很多需要改进的地方,如在缓冲链表使用中可用哈希表来替换,以节约查询时间。另外该服务器程序可以采用并行架构,使服务器上的处理器能够被充分地利用,从而提高服务器程序性能。
[1] 王艳平.网络与通信程序设计[M].北京:人民邮电出版社,2006:56-98.
[2] 马金鑫,袁丁.基于IOCP的高并发通信服务器的设计与实现[J].通信技术,2009,42(7):248 -250.
[3] 陈和平,周静宁,顾晋广.IOCP机制与网络代理服务器实现方法[J].计算机应用,2003,23(4):109 -114.
[4] 冯林,彭尉,滕弘飞.车辆监控系统中通信服务器性能优化设计与实现[J].计算机工程与应用,2005,23(6):199-201.
[5] 翟战强,蔡少华.基于GPRS/GPS/GIS的车辆导航与监控系统[J].测绘通报,2004(2):34-36.
[6] 宋薇.基于GPS-GSM车辆监控系统服务器设计与实现[D].长春:吉林大学图书馆,2006.
[7] 孙丰金.车辆监控系统中通信服务器的设计与研究[D].济南:山东大学图书馆,2006.
[8] 何小兵,韩雪琴,文亚星.基于GIS/GPRS的城市交通决策指挥系统模型研究[J].重庆交通学院学报,2005,24(2):105 -108.
[9] 沈雪松,刘建业,孙永荣.新型车辆导航监控系统研究[J].重庆交通学院学报,2005,24(6):137-140.
[10] 颜伏伍,王攀,胡杰,等.基于车载总线的PC式汽车故障诊断系统[J].武汉理工大学学报:信息与管理工程版,2011,33(5):758 -762.
[11] 朱聪,刘济林,李培弘.GPRS设备的被动访问[J].江南大学学报:自然科学版,2006,5(3):265-269.
[12] 王晓强,冯永祥.基于VC+MapX的保险理赔车辆监控调度系统的设计与开发[J].内蒙古大学学报:自然科学版,2005,36(3):324 -327.