《电子技术应用》
您所在的位置:首页 > 测试测量 > 设计应用 > 一种跨平台监控网格并行计算任务的解决方案
一种跨平台监控网格并行计算任务的解决方案
樊富有1,肖尚辉2
1.宜宾学院 计科系,四川 宜宾644007; 2.宜宾学院 电信系,四川 宜宾644007
摘要: 介绍了对网格并行计算任务实施远程监控的一种解决方案,从并行计算任务的进程分布特点、监控模式、远程跨平台通信的实现以及多线程连接几方面作了分析阐述。
Abstract:
Key words :

摘   要: 介绍了对网格并行计算任务实施远程监控的一种解决方案,从并行计算任务的进程分布特点、监控模式、远程跨平台通信的实现以及多线程连接几方面作了分析阐述。
关键词: 网格计算  并行计算  远程监控  Socket  WinSock

  发展高性能计算是解决不断增长的计算需求问题的根本途径。高性能计算的物质基础是高性能计算机,如SIMD、PVP、SMP、MPP、COW和分布式计算机。如何把分散的计算资源集中起来协同解决问题是高性能计算领域研究的热点。
  网格是一个集成的计算与资源环境,是一个高性能计算资源池。网格能够充分吸纳各种计算资源,并将它们转化为一种随处可得的、可靠的、标准的同时还是经济的计算能力。MPI(Message Passing Interface)是消息传递并行编程模型的一种具体实现和主要代表,MPI在并行计算领域已广为普及并成为事实上的标准。MPICH-G2是一个用于网格计算环境的MPI实现,符合MPI1.1标准。通过使用Globus服务,MPICH-G2可以把不同体系结构的计算结点联合起来进行并行计算。
  成都理工大学校园计算网格模型已设计完成,这是网格管理系统的主要开发工作。通过网格管理系统中的用户控制台,用户可向网格提交Single Task、Co-allocation Task、MPICH Task。为了能够监控网格环境下的并行计算任务的运行状态,作者在原来设计的PC机群监控平台的基础上,进一步设计了用于监控网格并行计算任务的监控平台。该平台能实时显示网格并行计算任务所在网格节点的状态,具有跨平台和远程监控的特点,使用户能够监控远程计算任务。
1  系统结构和监控模式
1.1 系统总体结构
  图1为系统总体结构图。系统由网格资源、网格控制台、用户控制台、监控平台四个部分组成。其中网格资源主要由若干高性能计算机和PC机群构成。PC机群由n台PC机作为节点机构成。操作系统为Linux,网格支撑系统采用美国Argonne国家实验室的GT3.2.1,软件并行支撑环境采用可移植消息传递标准MPI的一个实现MPICH-G2。监控平台运行Windows操作系统,通信采用TCP/IP协议。

1.2 并行计算任务的进程分布特点
  MPICH-G2根据RSL资源描述文件给出的网格资源名顺序,依次按要求分配和启动进程,直到满足指定的进程数为止。计算任务由若干个进程并行完成,这些进程可能分布于不同的节点机上,也可能有一些分布在同一台节点机上,其运行状况如何,MPICH-G2无法了解。若某台节点机出现故障,将导致运行其上的计算进程中止,致使整个并行计算结果无效。用户必须实时监控所有计算进程,出现问题要能立即发现,以便进行适当处理。
1.3监控模式
  为实现监控,采用客户机/服务器模型。监控平台处于服务器端,收集所有计算进程发来的状态信息,计算进程处于客户端,每隔一定时间向监控平台报告当前状态。为了不影响并行计算效率,客户端的状态报告进程由计算进程创建并和计算进程运行于同一台节点机上。计算进程个数与状态报告进程个数相同,它们之间一一对应。状态报告进程仅向监控平台报告创建它的计算进程的状态信息。计算进程的主要状态信息如表1所示。


  服务器端实时接收每一状态报告进程发来的信息,为实现可靠连接,采用阻塞式接收和发送。为此,监控平台运行于多线程模式,某一线程仅与某一状态报告进程联络,所获得的信息存储在公共信息区,供监控平台实时显示。
2  关键技术分析
2.1 远程通信的实现
  随着Linux操作系统的发展,Socket已成为Linux平台上最流行的网络通信应用程序接口(API),Linux C全面支持Socket编程。在TCP/IP协议族中,Socket接口与网络协议的关系如图2所示。

  Windows Socket(WinSock)是由Microsoft、SUN等公司在Berkeley Socket基础上开发的Windows平台网络应用系统编程接口。Windows以动态链接库(DLL)的方式支持WinSock运行,在需要时,DLL将被实时地连接到应用程序上。16位DLL名为WinSock.DLL,32位DLL名为WSock32.DLL。Microsoft Visual C++ 6.0已经具有完善的WinSock开发环境,提供了开发WinSock所需的所有头文件和库文件。
  上述两种套接口用于监控平台服务器进程与计算节点状态报告进程间的通信,从而实现了Linux应用程序与Windows应用程序间的远程通信。
2.2 计算进程与状态报告进程的关系
  计算进程分布于不同的网格节点机上,状态报告进程是计算进程创建的子进程。下面介绍它们的逻辑关系。
  (1)通过用户控制台向网格透明提交并行计算任务
  网格资源对用户是透明的。从用户角度看,网格是一台虚拟的超级计算机,提供足够用户使用的计算能力。作者设计的网格用户控制台就实现了这样的功能,如图3所示。

  通过用户控制台,用户只需填写并行程序名、输入/输出数据文件名及对网格节点的基本硬件要求等简单信息,就可以向计算网格透明提交计算任务。用户控制台与网格控制台进行联络,得到经过优化选择的物理资源使用权,并行计算任务就在这些资源上进行运算。在图3所示的任务信息中,要求这一任务运行在20个网格节点上,由120个计算进程协同完成运算,要求节点机至少有512MB内存,1024MB空闲磁盘。这20个网格节点属于哪些计算机,以及这120个进程的分布情况对用户是完全透明的。
  (2)计算进程创建状态报告进程
  分布于不同网格节点的计算进程分别创建它们各自的状态报告进程。若有120个计算进程,就会有120个状态报告进程,它们之间一一对应,但又相互独立。
  计算进程占用大量CPU时间,高效完成计算任务。状态报告进程只是在向监控平台发送信息时占用少量CPU时间,不会对系统的计算任务产生大的影响,可以满足监控系统的要求。
2.3 并行计算程序的流程控制
  为了达到监控目的,并行计算程序需遵守图4所示的流程控制要求。

  程序的主要伪代码如下:
  MPI_Init(&argc,&argv);//初始化MPI环境
  MPI_Comm_size(MPI_COMM_WORLD,&numproc);
                    //取计算进程个数
  MPI_Comm_rank(MPI_COMM_WORLD,&myid);
                     //取本进程标识
  MPI_Get_processor_name(name,&i);//取节点机名
  fd=fork( );//创建计算进程的状态报告子进程
  if (fd !=0)//是计算进程吗?
  {//是计算进程(父进程)
  DO_MPI_WORK;//完成并行计算任务,占用大量CPU时间
  kill(fd,SIGKILL);//终止状态报告进程
  }
  else
  {//是状态报告进程(子进程)
  sprintf(CmdStr,″vmstat -n 1 > NodeCpuInfo%-2d&″,myid);
  system(CmdStr);
         //启动后台运行程序vmstat,实时获得CPU状态信息
  sockfd=socket(AF_INET,SOCK_STREAM,0); 
  address.sin_family=AF_INET;
  address.sin_addr.s_addr=inet_addr(″监控平台IP地址″);
  address.sin_port=htons(4000);
  connect(sockfd,(struct sockaddr?鄢)&address,sizeof(address));
       while(1){
  sleep(1);//每隔一秒向监控平台报告计算进程状态信息
       write(sockfd,StatusInfo,strlen(StatusInfo) +1);
       //StatusInfo是状态信息字符串
  }
  close(sockfd);//关闭套接口
  MPI_Finalize( );//退出MPI环境
  }
2.4 服务器端监控平台的实现
  服务器端运行于Windows平台,开发工具选用Visual C++ 6.0。监控平台的主要功能是接受所有状态报告进程的连接请求,实时接收计算进程状态信息,并能根据用户的选择显示某一进程及节点机的状态。接受状态报告进程连接请求和接收状态信息的部分伪代码如下:
{
   serv.sin_family=AF_INET;//使用互联网协议族
   serv.sin_port=htons(4000);//设定连接端口号为4000
   serv.sin_addr.s_addr=htonl(INADDR_ANY);//绑定通配地址
   sock=socket(AF_INET,SOCK_STREAM,0);//建立流式套接口
   bind(sock,(sockaddr*)&serv,sizeof(serv))//绑定套接口
   listen(sock,32);//监听连接
   AfxBeginThread(&mythread,0);//创建一个线程,等待连接请求
}
UINT mythread(LPVOID p)//线程函数
{ //接受连接,得到新的套接字,存入SockList数组
   SockList[count]=accept(sock,(sockaddr*)&serv,&addrlen);
   AfxBeginThread(&mythread,0);//启动另一线程,等待
//新连接请求
   while(s !=SOCKET_ERROR)
   { //循环接收数据
s=recv(SockList[count],buff,100,0);
//若客户端关闭了套接口,则recv( )什么都不做,立即返回
if(strlen(buff)==0)  break;
解析buff中的数据,存入公共信息区,供监控平台显示
   }
   AfxEndThread(0);//终止线程
}
3  监控平台运行效果
  监控平台运行界面如图5所示,界面上的计算机图标是运行时动态创建的,代表一个并行计算任务正在运行。图中的12个计算机图标表示本次计算任务有12个进程在并行处理。如果某计算进程结束或出现异常中止,则图标下的ACTIVE将变为IDLE,用户可立即发现并采取相应处理措施。列表框里显示节点机状态报告进程发来的心跳信息,表示计算进程仍然存活。编辑框和消息发送按钮用来向状态报告进程发送操作信息,作为以后系统的扩展备用接口,这一功能接口对于远程操作特别有用。

  如果要了解节点进程的详细信息,可单击相应的计算机图标,系统给出的信息如图6所示,信息名称和意义已在表1中作了说明。为了形象地表示进程所在节点机的CPU状态,监控平台用柱状图动态显示用户占用的CPU时间、系统占用的CPU时间及空闲CPU时间。从图6可以看出,系统占用的CPU时间较少,用户占用的CPU时间呈现周期性变化。造成这种结果的原因是在进行测试时作者有意安排了sleep函数。

4  结束语
  对网格资源的发现与监测是进行网格计算的前提。现在有很多关于这方面的研究,也已取得了较多的成果。但这些监测都是对物理资源的监测,没有涉及到计算进程,更没有对并行计算进程进行监测,而并行计算涉及的节点机多,计算任务庞大,对并行计算任务计算进程状态实施监控是十分必要的。本文给出的监控模式及监控软件是对网格资源发现与监测的重要补充,具有较强的实际应用价值。
参考文献
1   Foster L,Kesselman C.Computational Grids:Blueprint for a New Computing Infrastructure.USA:Morgan Kaufmann Publishers,1999
2   Foster L,Kesselman C,Tueeke S.The Anatormy of the Grid:Enabling Scalable Virtual Organizations.International  J Supercomputer Application,2001;15
3   Foster L,Kesselman C.The Grid:Blueprint for a Future Computing Infrastructure.USA:Morgan Kaufmmann Publishers,1999
4   都志辉,陈渝,刘鹏.网格计算.北京:清华大学出版社,2001
5   罗省贤,何大可.基于MPI的网络并行计算环境及应用.成都:西南交通大学出版社,2001
6   徐志伟,冯百明,李伟.网格计算技术.北京:电子工业出版社,2004
7   任永铮.Linux C程序员指南.北京:国防工业出版社,2000
8   周明天,汪文勇.TCP/IP网络原理与技术.北京:清华大学出版社,1993
9   汪晓平,钟军.Visual C++网络通信协议分析与应用实现.北京:人民邮电出版社,2003
10  樊富有,罗省贤,李录明.对PC cluster实施远程跨平台监控的研究与实现.四川师范大学学报,2004;27

此内容为AET网站原创,未经授权禁止转载。