多维Web服务网关的高并发问题研究*
2014-11-10尼四凯钟明旸
尼四凯 ,王 勇 ,钟明旸
(1.桂林电子科技大学 电子工程与自动化学院,广西 桂林541004;2.桂林电子科技大学 计算机科学与工程学院,广西 桂林541004;3.桂林电子科技大学 信息与通信学院,广西 桂林541004)
在信息化、数字化的今天,计算机网络已经完全融入了人类的生活、生产当中[1]。人与人之间可以通过网络进行信息传递和资源共享,人与物、物与物之间也可以通过网络进行交流。多维Web服务网关就是在这种背景下提出的。多维Web服务网关是融合了当前互联网技术、嵌入式技术、无线传感网技术和Web Service技术的一种可以为互联网用户提供所监测环境的实时数据并可以对其进行控制的网关。该网关最大的特点是使用了Web Service技术,这种技术给互联网用户提供了一种平台独立、松耦合、自包含、基于可编程的Web应用程序,可以使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序。多维Web服务网关的关键核心技术是处理来自互联网用户的请求,并从底层的传感网中读取相应的数据并反馈给用户。
由于多维服务网关提供的是开放的可供查询的服务,因此很可能遭遇到瞬时大量用户访问的情况(高并发情况)。针对该情况,传统的基于多线程和Select机制的并发服务器由于受到系统硬件资源的限制,已经不能满足高实时性、高可靠性的要求了。另外由于多维网关有WiFi、千兆以太网端口、3G、ZigBee等多种信道,各种信道的传输速率不同,这也会增加服务器出现拥塞状况。
针对多维网关所出现的各种问题,本文设计了一种改进的线程池解决方案。该方案对经典的线程池设计模式进行改进后,首次应用在多维网关上,并作为多维网关处理消息转发的一种核心技术,有效地解决了多维Web服务网关在高并发情况下的拥塞问题。
1 传统的多线程高并发服务器的原理及实现技术
早期的服务器采用多进程来解决高并发问题,但是进程的创建开销很大,对服务器性能要求比较高,相比较而言线程的资源开销比进程小得多,而且子线程的创建速度快,同一进程内的子线程之间进行切换花费也小,子线程之间的通信也易实现,所以多线程技术很快取代了多进程用于高并发服务器的设计上[2]。
多线程技术虽然比多进程在一定程度上改善了服务器性能,但却存在着致命的缺陷。首先大量用户请求所带来的线程不停地创建和销毁,将会消耗CPU大量的处理时间,也会造成响应的时延,从而使得网络拥塞[3-4]。线程池技术的利用大大改善了服务器在高并发情况下的性能下降问题,该技术通过在程序开始时创建一批线程来处理到来的用户请求,用户请求多于线程池线程数目时可以把请求任务暂时放在任务队列中,等线程池中有了空闲的线程再从任务队列中取出任务交给空闲线程去处理;当用户请求少于线程池线程数目时,空闲线程挂起等待[5]。
2 改进的线程池算法的提出
2.1 传统线程池应用与多维Web服务网关的缺陷
简单线程池存在的问题是:如果有大量的客户要求服务器为其服务,但由于线程池的工作线程是有限的,服务器只能为部分客户服务,其他客户提交的任务只能在任务队列中等待处理。这种状况直接增加了服务网关的响应时间,所以调整优化线程池尺寸是高级线程池要解决的一个问题。另外,由于多维Web服务网关要与底层的无线传感网通信来获取实时数据,假设服务器解析用户请求的时间为T1,服务器从传感网中相应的节点获取数据的时间为T2,请求和响应在互联网中的传输时间为T3,完成单次用户请求任务的总时间为T,则有:
所以,对于多维网关来说,降低T2和T3的时间也是比较有效的策略。综上,本文对简单的线程池提出了如下两点改进:
(1)优化工作线程数目。根据统计学的原理来统计客户的请求数目,比如高峰时段平均1 s内有多少任务要求处理,并根据系统的承受能力及客户的忍受能力来平衡估计一个合理的线程池尺寸。
(2)给线程池添加瞬时同类请求合并模块。由于网络用户对多维网关的请求大部分为数据请求,控制请求比较少,并且控制请求在时间上不太集中,因此将短时间T1内的大量同类数据请求合并为一个请求,而对于控制请求则不予合并直接通过该模块。根据式(1)~式(3)可知,减少对底层传感网的访问能有效地降低整个网络时延。假设:网关收到的请求中数据请求占90%,控制请求和服务描述请求各占5%,网关对底层的无线传感网访问一次耗时为Tw;网关提供了10个服务,其中提供数据的服务和提供控制的服务各占一半;网关1 s内收到了N个服务请求,那么使用简单线程池的服务网关完成N个请求要花费在底层传感网访问的时间为Tb,使用添加了合并模块的线程池服务网关所花费时间为Ta,其中 Tl设置为 1 s,则有:
当 N=100 时 ,Tb=95 Tw,Ta=10 Tw; 当 N=500 时 ,Tb=475 Tw,Ta=30 Tw。所以当访问量越多时,改进后的算法优势越明显。
2.2 改进后的线程池设计流程
如图1所示,改进后的算法分为两大部分,添加了瞬时同类请求合并模块,线程池中每个工作线程中的任务都要经过该模块的过滤才可以访问底层的传感网。
图1 改进后的线程池算法流程图
图2给出了瞬时同类请求合并模块的详细流程图,算法的基本思想是对实时性要求比较高的控制类请求进行直接转发,对于数据请求在允许的时间内对其进行合并。也就是在瞬时Tl内对首个数据请求直接转发给传感网络,读取数据后把结果返回给客户端,同时在服务器数据库中插入该条数据和请求类型,并设置一个时间为Tl的定时器,定时器到时间后即删除该条数据。新到的同类请求不再访问传感网络,而是直接检查数据库是否有同类请求,有则直接从数据库读取数据并返回给客户端;否则重复以上步骤。该设计使用了SQLite数据库,由于SQLite是一个使用C代码编写的小型数据库,大小不足270 KB,读写速度非常快,特别适合嵌入式设备。
图2 瞬时同类请求合并模块算法流程图
Tl是从数据获取到失效的生存时间,每个生存时间与请求的优先级有关。每个服务请求都设置一个用户时间容忍度ρ。网络请求超时极值为T(T的值为50 s)。则Tl的取值为:
容忍度ρ的取值范围为0~1,实时性要求越高的服务其ρ的取值越小,控制类的ρ取值一律为0。当某个请求量很大时,其ρ的取值也会增大。ρ的计算公式为:
其中,n为在30 min内的请求总数。
3 对比测试及结果分析
本文使用C语言在Linux系统下实现了改进后线程池算法,并对其性能进行了测试。下面是使用jmeter压力测试工具对改进前后的线程池算法服务器和多线程服务器进行的对比测试,测试环境均为Linux(2.6内核),Inter Pentium Dual E2180处理器,512 MB内存。
(1)选择最优线程池尺寸测试
改变线程池的大小,任务数设置为2 000,对多线程的服务器进行测试。
如图3所示,线程池容量在32之前一直比较稳定,并维持在非常好的效果,明显优于多线程服务算法。容量在32之后线程池算法服务器性能开始下降,特别是在128之后,性能下降明显,在300之后性能差于多线程服务器。线程池尺寸可以选择8~32个线程。
(2)3种算法对比测试结果
根据第一次测试结果选取线程池大小固定为16个线程,改进后的线程池算法的瞬时同类请求合并模块时间参数设置为0.5 s。改变任务数对3种服务器进行再次测试。
图3 多线程和线程池对比图
图4 3种算法对比图
如图4所示,线程池算法表现比较稳定。在任务数为64个之前,3种算法服务器的性能差别不明显;在任务数为128之后性能开始出现差异,特别是任务数在256之后,改进后的线程池算法明显优于多线程算法服务器;在任务数达到512个之后,改进后的线程池算法开始体现出明显的优势。
[1]黄冬泉.高并发事件驱动服务器研究[J].计算机工程与科学,2007,29(1):138-141.
[2]许永达.基于线程池的高并发访问考试系统设计[J].计算机与现代化,2013,4(3):232-234.
[3]孙旭东,韩江洪,刘征宇,等.基于分段的线程池尺寸自适应调整算法[J].计算机工程,2013,37(2):43-44.
[4]杨开杰,刘秋菊,徐汀荣.线程池的多线程并发控制技术研究[J].计算机应用与软件,2010,27(1):168-170.
[5]唐富强,于鸿洋,张萍.Linux下通用线程池的改进与实现[J].计算机工程与应用,2012,48(28):77-83.