摘 要: 介紹了對網格并行計算任務實施遠程監控的一種解決方案,從并行計算任務的進程分布特點、監控模式、遠程跨平臺通信的實現以及多線程連接幾方面作了分析闡述。
關鍵詞: 網格計算 并行計算 遠程監控 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