《电子技术应用》
您所在的位置:首页 > 通信与网络 > 业界动态 > 基于主动队列管理的Linux并发服务器模型及负载均衡算法的研究

基于主动队列管理的Linux并发服务器模型及负载均衡算法的研究

2008-05-05
作者:黄伟志1,汤 莉2,刘 军3

  摘 要: 提出了一种基于主动队列管理的并发服务器模型,在主动队列管理的并发服务器模型下,研究了服务器对各队列、各线程运用负载均衡" title="负载均衡">负载均衡的策略和算法。
  关键词: 并发服务器 负载均衡 主动队列管理


  互联网用户数和网络流量的几何级数增长对网络服务器的可用性提出了更高要求。当网络数据流不能在各服务器之间有效分配时,会出现负载失衡。
  针对该问题,本文在单服务器模式下,通过合理分配线程、协调队列、采用单服务器主动管理队列等方法实现了多线程多任务下的负载均衡。
1 基于主动队列管理的并发型服务器模型
1.1 服务器的分类和简介

  在实际的网络程序中,通常都是许多客户机对应一台服务器。为处理客户机的请求,对服务端的程序提出了特殊要求。目前最常用的服务器模型分为两种:(1)循环服务器,在同一个时刻仅响应一个客户端" title="客户端">客户端的请求;(2)并发服务器,在同一个时刻可响应多个客户端请求。
  循环服务器包括数据报协议(UDP)服务器和传输控制协议(TCP)服务器。实现非常简单:数据报协议服务器每次从套接字上读取一个客户端的请求进行处理,然后将结果返回给客户机;传输控制协议服务器接受一个客户端的连接请求,然后处理,完成了该客户的所有请求后,断开连接。
  并发服务器的思想是每个客户机的请求不由服务器直接处理,而是服务器创建一个子进程来处理。这样可以使服务器进程在同一时间有多个子进程与不同的客户程序连接和通信。在客户程序看来,服务器可以并发地处理多个客户的请求。
  一般TCP/IP服务器通信软件" title="通信软件">通信软件均为并发型,即由一个守护进程负责监听客户机的连接请求,并生成一个或多个子进程与客户机建立连接,以完成通信。其缺点是随着连接客户机数量的增多,生成的通信子进程数量也会随之增多,在客户机数量较多的应用场合势必影响服务器的运行效率。一般的循环服务是指服务器在接收客户机的连接请求后即与之建立连接,只有处理完与客户机的通信任务后,才能再去接收另一客户机的请求连接。其优点是不必生成通信子进程。缺点是客户机在每次通信之前都要与服务器建立连接,开销过大,不能用于随机的数据通信和繁忙的业务处理。
1.2 模型的提出
  本文提出了一种新型的基于主动队列管理的并发型服务器通信软件的设计方法,不同于一般的并发型服务器和循环型服务器通信软件,它摒弃了上述两类服务器的缺点,综合其优点。该软件的优点是:生成子进程数目少;设定了子线程的上限值;继承了并发通信的优点,容易对客户机与服务器的连接进行管理;适用于客户机数量较多和随机数据通信的情况,能够有效地提高服务器的运行效率。服务器系统模型图如图1所示。


  这种设计方法的基本思想是:首先设置服务器子线程数的上限值TNMAX,避免子线程数过多,影响效率。然后将服务器设为监听状态。当第一台客户机C1向服务器请求连接时,服务器的守护进程与之建立初始连接L0,客户机利用L0向服务器发送IP地址和端口号" title="端口号">端口号,守护进程将客户机的IP地址和端口号登记在共享内存的记录中,然后关闭L0。由守护进程生成的一个通信子进程Pc1,从共享内存中获得客户机IP地址及端口号后,建立一个与客户机的连接L1,准备进行读写,并分配可用的线程数,同时设置当前与服务器连接的客户端数,设置分配给它的线程数。守护进程继续监听来自客户端的连接。当另一台客户机C2请求连接时,将客户机IP地址和端口号同样登记在共享内存中。守护进程再生成一个通信子进程Pc2,建立与客户机的连接L2,然后添加队列,分配可用线程数,同时更新服务器记录的客户端数和各自对应分配的线程数。这样逐一连接客户端,生成通信子进程,添加队列,直至达到子线程数的上限值。当达到上限值TNMAX时,若再有客户机连接,则服务器回复消息令其等待,客户机轮询直至被分配到线程。当某个客户端传输完毕时,删除队列,删除分配的线程数,终止子进程,并更新服务器的记录。这样做不仅发挥了并发服务器的优点,且避免了子进程过多的缺点。服务器通过主动的队列管理机制实现对多个客户端的协调和处理,极大地提高了运行效率。
1.3 进程管理的实现
  在本系统中,服务器采用基于主动消息队列管理的并发服务器模型。并发服务器的引入是与进程密切相关的,且Linux的进程管理也非常符合并发服务器的工作原理。本系统实现Linux服务器端的通信和进程管理,步骤如下:
  (1)服务器端打开一个已知的监听端口;
  (2)在监听端口上监听客户机的连接请求,当有一客户机请求连接时,建立连接线路并返回通信文件描述符" title="描述符">描述符;
  (3)父进程创建一子进程,父进程关闭通信文件描述符,并继续监听端口上的客户机连接请求;
  (4)子进程通过通信文件描述符与客户机进行通信,通信结束后终止子进程,并关闭通信文件描述符。
  系统服务器端管理流程图如图2所示。


2 多线程多队列的负载均衡算法研究
2.1 研究现状

  多线程之间的负载均衡问题是系统的一个研究重点。
  一般地,负载均衡机制主要包括两大部分:信息策略和定位策略。
  (1)信息策略可描述网络存储资源的使用状况。描述负载信息所采用的参数有:运行队列中的任务数和存储占用情况等。
  (2)定位策略:指如何选择网络存储服务器来接受客户端的网络存储任务请求。即调度算法,如轮转调度、加权轮转、最少链接和目标地址散列等。
  本系统主要运用信息策略、主动管理和分配运行的队列和线程,从而实现对各线程之间的负载均衡,并达到限制网速和带宽的目的。此外,本系统采用的是单服务器端,而不是集群服务器。所以在算法和设计上不能遵循传统的集群服务器关于负载均衡的理论和思想。
2.2 本系统采用的负载均衡算法
  目前负载均衡技术采用的算法有:轮循均衡、权重轮循均衡、随机均衡、响应速度均衡、最少连接数均衡和处理能力均衡等[2]。本文提出一种基于队列管理的负载均衡算法。其算法思想如下。
  对于来自每个客户端的请求消息,根据队列的数量进行响应:
  (1)当客户端数为0时,设新客户端为A,则A的线程数为TNMAX,A的带宽为BLMAX
  (2)当客户端数为1时,B的线程数为A的线程数的一半取下限,A的线程数为其本身的线程数一半取上限;客户端数增为2;
  (3)当客户端数为2时,C的线程数为A,B线程数的最大值的一半取下限,修改A的值;客户端数增为3。其他情况类似;
  (4)当客户端数为5时,则回应等待。
  计算公式:TNi=f(CN,TNMAX,BL)
  其中,参数TNi是分配给客户端的线程数;BL是服务器端Linux操作系统安装的带宽,这里为100 Mbps;TNMAX=5,是线程总数的上限值(根据环境影响和实际情况等,可扩充);标志位CN用来显示当前连接的客户端数目,设定初值为0。
  下面列举实例,加以说明。
  初值表示为:BL=100Mbps,TNMAX=5,CN=0;
  如果有客户端A来申请连接时,则返回当前可用的线程数,更新标志位:
  TNA1=5,CN=1;
  当连接和发送过程中,有另一新客户端B申请连接时,则更新标志位:
  TNA2=3,TNB2=2,CN=2;
  这里采用的算法是,由于B从A得到A线程数的一半并取下限,A取得本身线程数一半的上限。计算公式为:
  TNB2=TNA1/2(取下限),TNA2=TNA1/2(取上限)
  当有新客户端C申请连接时,则更新标志位和客户端数:
  TNA3=2,TNB3=2,TNC3=1,CN=3;
  计算方法是首先比较A和B的线程数,取值大的分配给线程C,计算公式为:
  TNC3=MAX(TNA2,TNB2)/2(取下限),TNA3=TNA2-TNC3
  以次类推,当有客户D申请分配线程时,
  TNA4=1,TNB4=2,TNC4=1,TND4=1,CN=4;
  这里当A和B线程数相等时,客户D仍是从客户A分配到一个线程。
  当有新客户端E申请连接时,则更新标志位和客户端数:
  TNA5=1,TNB5=1,TNC5=1,TND5=1,TNE5=1,CN=5;
  计算方法是首先比较A和B的线程数,取值大的分配给线程E,计算公式为:
  TE5=MAX(TNA4,TNB4)/2(取下限)
  这是把5个线程分配给若干客户端的过程,实现了多个线程的负载平衡,并限制客户的带宽。
  设计模式:当客户端发出请求后,如果服务器端回应“等待(wait)”,则已经没有可用线程,客户轮询等待;若服务器端回应“发送(send)”,客户开始询问服务器端的可用线程数,服务器端回应可用的线程数,后台进行压缩和多线程处理,开始自动上传。
  本文提出了一种改进的并发服务器模型,这种服务器模型能更好地处理进程调度,实现了队列之间的负载均衡,增强了系统的可靠性。
参考文献
1 岑驾科,邵秀丽.负载均衡策略及可扩展存储资源预约协议.计算机工程与应用,2005;41(7):157~159
2 彭德巍,何炎祥.基于Agent的负载均衡框架应用研究.计算机工程与应用,2005;41(5):153~155

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。