Multi Agent在分布式测控系统中的分布如图1所示。在类服务器上有:负载状态管理Agent、名字管理Agent、候选目标主机Agent、通信服务Agent、Agent构造服务器。在主机上有:负载信息检测Agent、任务Agent、通信服务Agent、Agent Sever。
负载状态管理Agent:负责收集类中各主机的负载状态信息,保存有各主机的负载上限(Load Max)与下限(Load Min)值。负载信息检测Agent:每台主机上都运行有唯一的负载信息检测Agent,检测主机的负载信息。名字管理Agent:负责为类中各主机上的所有任务提供命名和名字管理,采用全局的、与位置无关的命名原则,并且任务迁移后为任务提供定位服务。候选目标主机Agent:负责记录系统中负载空闲的主机。通信服务Agent:在每台主机和类服务器上都是唯一的,是主机内Agent和主机与类服务器间Agent通信的桥梁。当Agent要通信时,它指定目标Agent,然后将通信内容传送给通信服务Agent,通信服务Agent将通信内容传送给目标Agent。任务Agent:记录到达主机的每一个任务,并为它们排队和编号,当一个任务执行完后,就从任务队列中删除这个任务。当需要迁移任务时,就按先进先出(First In First Out,FIFO)原则迁移任务队列中的任务。Agent构造服务器:在每一个类服务器上设置了一个Agent构造服务器,协助用户自动地生成移动Agent。移动Agent可以携带迁移任务移动至空闲主机,利用空闲主机所提供的计算环境及资源,利用本地操作的优势快速而高效地完成迁移任务。当系统中的重载主机需要向空闲主机迁移任务时,请求Agent构造服务器为其生成一个移动Agent,请求原语格式如下[4]:
其中,SourceHost后的参数给出重载主机的地址;GoalHost后的参数给出空闲主机的地址;UserTask后的参数给出迁移任务的任务号。Agent Sever:系统中每台主机上都运行一个Agent Sever,它是移动Agent的运行平台,为移动Agent运行提供所必需的环境。它可以接收移动Agent,并为在其中运行的移动Agent提供相应的服务及资源。
在分布式测控系统中,各种Agent完成不同的功能,因此各种Agent所包含的实际内容千差万别,但是这些Agent具有相似的结构,如图2所示。
图2中,接收器接收来自外部环境的各种事件及其他Agent的信息(通知、请求等);知识库是Agent的知识管理系统,主要存储Agent自身能力及其所处环境的知识并对其进行动态维护;推理机制根据获得的外部信息和具备的知识进行推理求解;Agent内核根据Agent的功能产生其得以实现的计算实体;自学习/自适应对Agent的行为进行优化,使Agent具有智能;处理过程是Agent的核心部分,它是Agent对外的窗口,Agent所提供的服务都是通过对处理过程的调用请求而实现的,它定义了Agent的行为模式。
2.1.3 Agent通信机制
在分布式测控系统中,Agent之间的协作完全是通过“通信”来实现的。本文采用基于消息的通信机制,Agent之间的通信是由事件激发的。当需要通信时,Agent就会向通信服务Agent发送消息包,通信服务Agent接收到消息包,就会根据消息包的目的地进行转发。
[4]Agent间发送消息的通信原语为:Send_ Message (Sender, Receiver, Message)。
系统采用单播(Unicast)、组播(Multicast)、广播(Broadcast)三种类型的通信模型。(1) 当Agent进行单播通信时,通信原语为:Send_ Message (Agent1,Agent2,Message)。(2) 当Agent进行组播通信时,通信原语为:Send_ Message (Agent1,Multicast(I),Message)。其中:Multicast(I)={2,3,…,i,…,k}(i=2,3,…,k)为发送Agent想要与其通信的一组Agent。(3) 当Agent进行广播通信时,通信原语为:Send_ Message(Agent1,Group,Message)。其中:Group为除发送Agent以外其余的Agent。
2.2 分布式测控系统任务调度策略
系统采用接收者启动动态任务调度策略。当一个主机成为空闲机时,它就向本类服务器发出请求,启动动态任务调度算法。如果本类中有重载机,则将重载机上的任务利用移动Agent迁移到空闲机上。如果本类中没有重载机,则向其他类服务器发出请求,启动动态任务调度算法。如果其他类中有重载机,则将重载机上的任务利用移动Agent迁移到空闲机上。如果其他类中没有重载机,则中止请求,等待一段时间后,再重新发出任务请求。
系统采用接收者启动动态任务调度策略的思想:若系统中没有空闲机时,那么无论重载机有多少任务,它都必须亲自完成。因为即使它发出任务迁移请求,也不会有主机响应。只有当某主机空闲时,才能发出任务请求,迁移重载机上的任务,帮助它完成实现系统动态负载平衡的目标。接收者启动策略还有两个优点:(1) 当每个主机均处于忙状态时,几乎不需要额外调度开销。(2) 动态任务调度的许多工作由空闲机来完成,不会给重载机增加许多额外负担。
转移策略:用于确定主机负载状态,采用门限策略。即:每一个主机负载(Load )都有一个负载上限值(Load Max)和负载下限值(Load Min),当Load >Load Max时,主机负载状态为重载主机;当Load< Load Min时,主机负载状态为空闲主机;当Load Min<Load<Load Max时,主机负载状态为负载均衡主机。
选择策略:选择被迁移的任务。迁移一个任务有两种方式:抢先式(preemptive)和非抢先式(nonpreemptive)。抢先式可以迁移一个正在运行的任务,而非抢先式只能迁移那些还未被启动执行的任务。抢先式的任务迁移比非抢先式的任务迁移开销大很多,为了节省开销,调度算法采用开销较小的非抢先式的迁移任务。
定位策略:本定位策略在定位重载机时,采用首次适应算法,在本类中只要找到满足调度条件的某个主机即可,并不检查所有主机。所以即使在其他类中有负载更重的主机,也不予考虑;只有当本类中无重载机时,才向其他类寻找重载机。这样做的原因是:在本测控系统中,将主机按其上所运行的任务性质进行了归类,同一类的主机运行的任务是相似的,不同类的主机上运行的任务相差较大。其优点是:减少通信带宽和通信时间;尽量减少平均调度检测时间;尽早启动调度结点上的任务执行。
2.3 分布式测控系统动态任务调度算法
2.3.1 基本概念
(1) 主机负载:考虑到系统中主机的异构性特点,主机的负载被定义为正比于主机的CPU利用率P,反比于主机的CPU速度V,即Load=P/V。(2) 学习机制:指Agent具有学习的能力,具有智能。它能记忆发生概率较高的事件,并能加以运用。例负载状态管理Agent,通过学习机制,它能发现在某一段时间内经常处于重载的主机。因为在定位重载机时,采用首次适应算法,这样它可以优先收集该主机的负载信息进行判断,从而不必要收集每个主机的负载信息进行判断,减少了平均检测时间。
2.3.2 动态任务调度算法
算法执行步骤:(1) 当某主机成为空闲主机时,向本类服务器发出任务请求,启动动态任务调度算法。(2) 类服务器启动候选目标主机Agent,登记该空闲主机。启动负载状态管理Agent,开始收集本类内各主机的负载信息。(3) 各主机负载信息检测Agent收到负载状态管理Agent发来的请求消息后,开始启动运行,检测主机负载信息,并将信息发回给负载状态管理Agent。(4) 负载状态管理Agent对收到的各主机负载信息进行处理,判断各主机负载状态。(5) 经判断某主机成为重载机时,该主机的任务Agent按FIFO原则,确定迁移任务,并将该任务传送给Agent构造服务器。若无重载机转步骤(11)。(6) Agent构造服务器从候选目标主机Agent中获得目标主机,并在名字管理Agent中登记。(7) Agent构造服务器创建移动Agent,将迁移任务封装在移动Agent中,并且将此移动Agent发送至目标主机。(8) 移动Agent携带迁移任务迁移至目标主机。(9) 目标主机的Agent Sever接收移动Agent并运行,使被迁移的任务得以实现。(10) 算法终止。(11) 向其他类服务器发出任务请求,其他类服务器收到请求后,启动该类的动态任务调度算法。(12) 重复步骤(2)~(10)。如此时执行步骤(5),若仍无重载机则中止请求。空闲主机等待一段时间后,再重新发出任务请求。
若系统中同时有若干台空闲主机时,可以将它们都记录在候选目标主机Agent中,将重载机上的不同任务同时迁移至各空闲主机,实现系统负载均衡的目标。在算法执行过程中,Agent之间的通信可以采用单播、组播、广播的通信模型。如负载信息检测Agent向负载状态管理Agent汇报主机负载信息时,可采用单播通信模型。负载状态管理Agent利用学习机制,先向重载概率较高的一些主机发送收集负载信息的消息时,可采用组播通信模型。空闲主机向其他类服务器发出任务请求时,可采用广播通信模型。
3 结束 语
分布式测控系统动态任务调度是利用多Agent系统的行为显现能力来实现的。本文提出的动态任务调度算法采用移动Agent这一新型的分布式计算工具来迁移任务,借助空闲主机的计算环境及资源,利用本地操作的优势快速而高效地完成迁移任务。从而使系统提高了效率,实现了负载均衡的目标。本系统采用Java语言来实现动态任务调度算法,这是因为Java具有面向对象、分布式、可移植等多种特性。Java语言的多线程机制使得同一台主机上可以有多个Agent独立运行,Java语言由于其内建的平台无关性、目标序列化、动态类装载等机制,为设计移动Agent提供了一些独一无二的特点[5]。
参 考 文 献
[1] Willebeek-Lemair H, Reeves A P. Strategies for dynamic load balancing on highly parallel computers [J]. IEEE Transaction on Parallel and Distributed Systems, 1993, 4(9): 979-993.
[2] Feng M D, Yuen C K. Dynamic load balancing on a distributed system[C]. Proceedings of the 6th Symposium on Parallel and Distributed Processing, Dallas, Texas, 1994. 26-29.
[3] Xu Li, Han Xiaogang. A Multiagent system model and its implementation based on object orientation. proceedings of the international symposium on future software technology[C]. Software Engineers Association, Japan, 1996. 85-91.
[4] 武成岗, 史忠植. 基于模块化的移动Agent及其调度方法[J]. 软件学报, 2002, 13(8): 1 628-1 636.
[5] Lange D B, Oshima M. Mobile agents with java: the aglet API[J]. World Wide Web Journal, 1998, 1(3): 111-121.