??? 摘 要:介紹了Java本地接口方法JNI,,重點討論了利用JNI調(diào)用C/C++動態(tài)聯(lián)接庫,實時監(jiān)控系統(tǒng)中硬盤,、內(nèi)存,、CPU等資源的運(yùn)行狀態(tài)的方法,實現(xiàn)了Java與C/C++的互操作,。同時,,通過在Web Service服務(wù)中調(diào)用JNI方法,提取Web Service的遠(yuǎn)程調(diào)用功能,。在網(wǎng)格環(huán)境中,,構(gòu)建了基于GMA的監(jiān)控系統(tǒng)模式,并給出了該系統(tǒng)的具體實現(xiàn)方法,。通過理論分析和具體應(yīng)用證實了該系統(tǒng)的有效性,。
??? 關(guān)鍵詞:網(wǎng)格;JNI,;Web Service,;GMA;監(jiān)控系統(tǒng)
?
??? 網(wǎng)格是以資源共享為目的,,支持對可計算資源的遠(yuǎn)程和并發(fā)訪問,,用高速互聯(lián)網(wǎng)絡(luò)連接地理上分布的可計算資源所組成的一個具有單一系統(tǒng)映像的高性能計算和信息服務(wù)環(huán)境[1]。
??? 在網(wǎng)格環(huán)境下,,存在著各種各樣異構(gòu)的計算資源,,這些計算資源無論在硬件還是在軟件上都存在很大差異。而且,,這些計算資源可能分布在世界各地,,通過互聯(lián)網(wǎng)結(jié)合在一起。由于這些特點,,運(yùn)行過程中一些節(jié)點可能會發(fā)生故障,,導(dǎo)致網(wǎng)絡(luò)斷開或者出現(xiàn)性能問題。而且,,一些節(jié)點可能隨時會動態(tài)地加入或者離開網(wǎng)格環(huán)境,。雖然各種網(wǎng)格中間件都有一定的容錯性,但在某些情況下,,人工干預(yù)也是不可避免的,。由于網(wǎng)格規(guī)模巨大,,在系統(tǒng)運(yùn)行時會產(chǎn)生大量的性能數(shù)據(jù),手工對網(wǎng)格系統(tǒng)進(jìn)行狀態(tài)信息的收集,、監(jiān)控和分析而不借助一定的工具是很困難的,,這就使得監(jiān)控系統(tǒng)在網(wǎng)格中的作用顯得尤為突出。
??? 由于資源具有動態(tài)性,、流動性的特征,,網(wǎng)格系統(tǒng)的運(yùn)行性能、穩(wěn)定性,、可靠性等重要指標(biāo),,很大程度上依賴于網(wǎng)格系統(tǒng)的實時狀態(tài)。這就要求在網(wǎng)格中提供一種資源監(jiān)測機(jī)制負(fù)責(zé)對各種資源進(jìn)行靜,、動態(tài)監(jiān)測,,收集各種資源及節(jié)點的狀態(tài)變化信息,使用戶和應(yīng)用程序能夠及時掌握資源分配與調(diào)度,、網(wǎng)絡(luò)帶寬,、處理器負(fù)載、系統(tǒng)吞吐量等信息,,以便及時解決網(wǎng)格系統(tǒng)中出現(xiàn)的各種障礙,,提高整個網(wǎng)格的性能。 ?
1 JNI本地方法
??? Java本地接口方法JNI(Java Native Interface)是JDK的一部分,,為Java提供一個本地代碼的接口,,是Java世界和其他語言間的橋梁。JNI允許運(yùn)行在Java虛擬機(jī)JVM(Java Virtual Machine )上的代碼調(diào)用本地程序和類庫,,或者被它們調(diào)用,,這些程序和類庫可以是其他語言編寫的,比如C,、C++或者匯編語言等,。
1.1 JNI技術(shù)實現(xiàn)步驟
??? JNI在不同平臺上的實現(xiàn)步驟相同。除了生成動態(tài)鏈接庫的方法不同外,,其他實現(xiàn)方法相同,。圖1以Java編程中通過JNI方法調(diào)用不同平臺下的C/C++程序為例,說明其具體步驟,。
?
??? (1)編寫java源程序(MonitorInformation.java),;
??? public class MonitorInformation {
??? public native double[] Disk( );//硬盤的信息
??? public native int[] Cpu();//cpu的使用率
??? public native double[] Memory();//內(nèi)存、虛擬內(nèi)存的大小及使用率
??? public native long pin();//主頻
??? static{
??????? ?try{//此處即為本地方法所在鏈接庫名
??? System.loadLibrary('monitorinformation');
????????????? ??}catch(UnsatisfiedLinkError e){
?????????????????? ????????????? …………??}
?????????????? ?}
???????? }
??? (2)編譯生成類文件(MonitorInformation.class),;
??? 在 Eclipse+Myeclipse 開發(fā)環(huán)境下,,這一步可以省略,因為 Myeclipse 會自動編譯java源程序為.class文件,,若不是,,則可使用javac MonitorInform-ation.java進(jìn)行編譯,,生成MonitorInformation.class文件。
??? (3)用javah生成頭文件(sys_MonitorInformation.h),;
??? 用javah sys.MonitorInformation 為native方法生成sys_MonitorInformation.h頭文件,。
??? (4)編寫native方法(monitorinformation.cpp);
??? JNI函數(shù)名稱分為3部分:①Java關(guān)鍵字,,供Java虛擬機(jī)識別;②調(diào)用者類名稱,;③對應(yīng)的方法名稱,,各段名稱之間用下劃線分割。JNI函數(shù)的參數(shù)也由3部分組成:第1個是JNIEnv *,,它是一個指向JNI運(yùn)行環(huán)境的指針,;第2個參數(shù)隨本地方法是否靜態(tài)而不同,非靜態(tài)本地方法的第2個參數(shù)是對對象的引用,,而靜態(tài)本地方法的第2個參數(shù)是對其Java類的引用,;其余的參數(shù)通常對應(yīng)Java方法的參數(shù),參數(shù)類型需要根據(jù)一定規(guī)則進(jìn)行映射,。注意:JNI函數(shù)返回值類型與Java函數(shù)返回值類型的相互轉(zhuǎn)化,。
??? JNIEXPORT jdoubleArray JNICALL Java_sys_MonitorInformation_Disk(JNIEnv *,
??? jobject){? //提取資源節(jié)點硬盤數(shù)據(jù)?? }
??? JNIEXPORT jlong JNICALL Java_sys_MonitorInformation_pin(JNIEnv *,, jobject){? //提取資源節(jié)點CPU主頻}
??? JNIEXPORT jintArray JNICALL Java_sys_MonitorInformation_Cpu (JNIEnv *,, jobject){? //提取資源節(jié)點使用CPU的動態(tài)數(shù)據(jù)}
??? JNIEXPORT jdoubleArray JNICALL Java_sys_MonitorInformation_Memory (JNIEnv *, jobject){ //提取資源節(jié)點內(nèi)存數(shù)據(jù)(包括虛擬內(nèi)存)}
??? 編譯native方法并生成動態(tài)鏈接庫(monitorinformation.dll),;
??? 最后,,將動態(tài)鏈接庫放在Windows->System32文件夾下,調(diào)用并運(yùn)行java程序,。
2 Web Service
??? Web Service是建立在開放的Internet基礎(chǔ)上的新的分布式計算模型[3],。Web Service組件是一套開放的技術(shù)規(guī)范,其組件的基本組成部分為HTTP,、XML&XSD,、WSDL、UDDI和SOAP,。其系統(tǒng)構(gòu)架基于TCP/IP,、HTTP、XML等協(xié)議和規(guī)范,,可以實現(xiàn)事務(wù)之間的通信,、鏈接文檔的瀏覽、事務(wù)的自動調(diào)用,、服務(wù)的動態(tài)發(fā)現(xiàn)和發(fā)布等,。其體系結(jié)構(gòu)由Service provider,、Service requester和Service broker 3個角色及Publish、Bind和Find 3個動作構(gòu)建而成,,如圖2所示,。
?
??? 服務(wù)提供者首先使用WSDL協(xié)議編制服務(wù)描述文件,并將其發(fā)布到UDDI注冊中心,,UDDI利用SOAP消息機(jī)制(標(biāo)準(zhǔn)的XML/HTTP)來發(fā)布,、編輯、瀏覽以及查找注冊信息,。服務(wù)消費(fèi)者在UDDI注冊中心發(fā)現(xiàn)感興趣的服務(wù)描述后,,需要啟動消息通信,消息和通信進(jìn)程可以綁定到基于HTTP上的SOAP上,,服務(wù)提供者根據(jù)SOAP的綁定參數(shù),,為服務(wù)請求者實施相應(yīng)的服務(wù)。同時,,在發(fā)布,、發(fā)現(xiàn)、綁定服務(wù)的過程中,,服務(wù)請求者和服務(wù)提供者對SOAP規(guī)范全力支持,,從而實現(xiàn)了良好的跨平臺、無縫互操作性[4],。
3 基于GMA的網(wǎng)格監(jiān)控系統(tǒng)
3.1 基于GMA的網(wǎng)格監(jiān)控模式
??? 為了有效減少網(wǎng)格中的數(shù)據(jù)傳輸,,本監(jiān)控系統(tǒng)采用基于生產(chǎn)者/消費(fèi)者/注冊模式的GMA監(jiān)控體系結(jié)構(gòu)[4],使用JNI,、Web Service,、目錄服務(wù)等技術(shù),構(gòu)建面向服務(wù)的基于GMA的監(jiān)控系統(tǒng),。作為一種類型的消費(fèi)者,,它實現(xiàn)了GMA定義的消費(fèi)者接口,并以Web頁面的方式向用戶顯示實時動態(tài)的性能信息,。監(jiān)控系統(tǒng)采用Servlet從生產(chǎn)者訂閱數(shù)據(jù),、利用實時的性能數(shù)據(jù)動態(tài)生成圖片,然后利用JSP頁面與用戶進(jìn)行交互,,圖3顯示了網(wǎng)格監(jiān)控系統(tǒng)模式,。
?
??? 網(wǎng)格監(jiān)控流程:采用JNI技術(shù)對網(wǎng)格中每個活動資源節(jié)點進(jìn)行動態(tài)實時監(jiān)測,獲取監(jiān)控參數(shù),,通過Web服務(wù)技術(shù)進(jìn)行遠(yuǎn)程數(shù)據(jù)傳輸,,然后以applet形式顯示到Web瀏覽器中。這樣,,用戶首先以Web頁面的方式登錄管理節(jié)點,,登錄后可以查看該管理節(jié)點轄域內(nèi)所有的資源節(jié)點,,然后點擊相應(yīng)的資源節(jié)點即可查看該資源節(jié)點的具體配置信息。
??? 由于網(wǎng)格監(jiān)控的特點,,監(jiān)控的數(shù)據(jù)必須及時地傳送到需要的地點,,這就要求系統(tǒng)具有較小的延時以及較大的吞吐量。另外,,監(jiān)控系統(tǒng)要盡量減小給網(wǎng)格資源本身帶來的負(fù)載,。因此,GGF[5]性能工作組認(rèn)為,,將數(shù)據(jù)收集和數(shù)據(jù)傳送分離有利于實現(xiàn)以上2點,。GMA體系結(jié)構(gòu)設(shè)計了一種獨立的生產(chǎn)者/消費(fèi)者模型,能夠根據(jù)協(xié)商做到“需求匹配”,,并且可以根據(jù)系統(tǒng)負(fù)載以一種更精確并且更分布的方式來控制數(shù)據(jù)流量,從而達(dá)到網(wǎng)格監(jiān)控系統(tǒng)所要求的監(jiān)控數(shù)據(jù)傳輸?shù)牡脱舆t,、高傳輸率,、低負(fù)載和安全性,使系統(tǒng)非常易于擴(kuò)展,。
3.2 實現(xiàn)
??? 該資源監(jiān)控系統(tǒng)采用了面向服務(wù)的GMA體系結(jié)構(gòu),,在網(wǎng)格中部署分布式的資源監(jiān)控服務(wù)。在實現(xiàn)過程中運(yùn)用了Java技術(shù)調(diào)用VC++動態(tài)鏈接庫的JNI技術(shù)以及在Java Applet小程序中封裝Web服務(wù)技術(shù),,通過接口統(tǒng)一發(fā)布Web服務(wù),,以便及時獲取所需要的信息。
??? (1)創(chuàng)建Web服務(wù):monitorinformation
??? 部分實現(xiàn)代碼如下:
??? public interface Imonitorinformation {
??? public double[] dispdisk(),,int[] dispcpu(),,double[] dispmemory(),long disppin();
??? }
??? monitorinformationImpl.java部分代碼如下:
??? public class monitorinformationImpl implements Imonitorinformation {
??? public double[] dispdisk(){
??? MonitorInformation m=new MonitorInformation();
?????????double[] disk=m.Disk( );
????????????? ??return disk;
????? ?}
??? public int[]dispcpu(){? //原理同上,, …… }
??? public double[] dispmemory(){ //原理同上,, …… }
??? public long disppin(){? //原理同上,……? }
????? ?}
??? MApplet.java部分代碼如下:
??? public class MApplet extends JApplet implements Runnable {
??? private int[] cpu,,double[] memory,,double[] disk;
??? private long pin;
???????private Service srvcModel;
????? ?private XFireProxyFactory factory;
????? ?private String serviceURL;
????? ?private Imonitorinformation srvc;
????? ?public MApplet() throws Exception {
??? srvcModel = new ObjectServiceFactory().create(Imonitorinformation.cl-ass);
??? // 創(chuàng)建服務(wù)對象
??? factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
??? // 使用XFire的服務(wù)工廠,生成創(chuàng)建實例
??? serviceURL=“http://”+ip+”:8080/project/services/mo-nitorinformation';
??? // 指定服務(wù)的地址
??? try { //初始化請求一次
??????? ??? srvc = (Imonitorinformation)factory.create( srvcModel,, serviceURL);?
??????????? cpu = srvc.dispcpu();?
??????????? memory = srvc.dispmemory();
?????????? ?disk = srvc.dispdisk();
?????????? ?pin=srvc.disppin();
?? ???? }?catch (MalformedURLException e){ ???e.printStackTrace(); }?
??? ……?? }
??? (2)如果沒有經(jīng)過數(shù)字簽名,,訪問客戶端程序下載后會受到安全限制。因此,,將Web服務(wù)工程打包以后,,對Applet小程序進(jìn)行數(shù)字簽名,簽名工程如下:
??? 第1步:創(chuàng)建證書keytool -genkey -alias
??? 這里keyname是要給出的密鑰別名,,例如'mykeyname' ,;url是存放宇航局鑰的文件位置,通常就是cacerts文件,,在{java.home}/lib/security/cacerts,,這里的java.home是指jre的路徑,在jdk里,,本系統(tǒng)的jre路徑是:C:jdk1.5.0_04jrelibsecuritycacerts,。
??? 第2步:簽名。
??? jarsigner -keystore
??? 本系統(tǒng)的簽名路徑是:jarsigner -keystore
??? C:jdk1.5.0_04jrelibsecuritycacerts
??? G:workspaceGraphGraph_fat.jar zhu2008,。
??? 注意:簽名時的
??? 啟動Tomcat服務(wù)器后,,在初次在瀏覽器運(yùn)行時會出現(xiàn)如下提示對話框,必須選中“始終信任此發(fā)行者的內(nèi)容(A)”,,以便保證系統(tǒng)的安全性,,再點擊“運(yùn)行”即可。如圖4所示,。
?
3.3 監(jiān)控服務(wù)
??? 網(wǎng)格監(jiān)控系統(tǒng)都有自己的監(jiān)控服務(wù),、注冊中心[6]、監(jiān)控信息提供者和監(jiān)控服務(wù)代理等,,可以實時監(jiān)控當(dāng)前資源的基本信息和實時狀態(tài)信息,。監(jiān)控服務(wù)直接面向監(jiān)控事件消費(fèi)者與上層應(yīng)用,為消費(fèi)者訪問提供統(tǒng)一的信息服務(wù)訪問接口,,它對應(yīng)面向服務(wù)的GMA體系結(jié)構(gòu)的生產(chǎn)者/消費(fèi)者復(fù)合組件[7],,最初運(yùn)行時需要向目錄服務(wù)中心進(jìn)行注冊。監(jiān)控服務(wù)主要負(fù)責(zé)維護(hù)資源監(jiān)控系統(tǒng)內(nèi)相應(yīng)監(jiān)控服務(wù)代理的注冊信息以及與它相鄰監(jiān)控服務(wù)的相關(guān)信息,,實時獲取各個資源節(jié)點的數(shù)據(jù),,定期對所監(jiān)控的所有資源的靜動態(tài)監(jiān)測信息生成詳細(xì)監(jiān)測報告,為用戶提供監(jiān)控視圖,。例如,,圖5中顯示了處理器、內(nèi)存,、硬盤部分監(jiān)控信息,。
?
??? 因為網(wǎng)格中資源狀態(tài)信息和其他監(jiān)控組件的變化都依賴于CPU的改變。如果CPU利用率幾乎沒有改變,,那其他的資源狀態(tài)也不會有大的改變,。反之,意味著資源的狀態(tài)將會有一個較大的改變,應(yīng)該立即監(jiān)控,。通常情況下,,CPU占用比例大于 70%的時間超過 1/3時,應(yīng)該加強(qiáng)對 CPU監(jiān)控,, 找出 CPU消耗的主要進(jìn)程,,分析進(jìn)程高 CPU 占用率的原因。CPU 占用比例大于80%的時間超過 1/2 時,,應(yīng)同時加強(qiáng)內(nèi)存監(jiān)控,, 考慮升級設(shè)備。從而,,不必要的系統(tǒng)開銷明顯降低,,事件的準(zhǔn)確率也得到滿足。
??? 本文基于GMA體系結(jié)構(gòu)以及Web Services,、JNI,、applet、目錄服務(wù)等技術(shù),,構(gòu)建的網(wǎng)格監(jiān)控系統(tǒng),,可以靈活地將靜態(tài)和動態(tài)信息結(jié)合在一起,通過監(jiān)控可以發(fā)現(xiàn)故障的資源節(jié)點,,分析系統(tǒng)瓶頸,幫助用戶在最短的時間內(nèi)恢復(fù)和調(diào)整系統(tǒng),;通過監(jiān)控可以了解計算資源或者存儲資源等的負(fù)載情況,,為調(diào)度程序提供信息,以實現(xiàn)節(jié)點間的負(fù)載平衡,。
參考文獻(xiàn)
[1]?黃達(dá)明,,李國東,張德富.網(wǎng)格監(jiān)控系統(tǒng)研究[J].計算機(jī)科學(xué),,2003,,30(9):144-146.
[2]?Rob G ,Alan E. JNI,,Java native interface. Prentice Hall,,1998.
[3]?范鳳岐,熊聰聰.基于網(wǎng)格的Web Service實現(xiàn)[J].計算機(jī)與數(shù)字工程,,2007,,35(2):110-112.
[4]?桂小林.網(wǎng)格技術(shù)導(dǎo)論[M].北京:北京郵電大學(xué)出版社,2006.
[5]?Ian F,, Carl K. The grid2 blueprint for a new computing infrastructure,,2003.
[6]?廖劍偉,蔡洪斌,,蔣攀登,,等.基于Java的網(wǎng)格監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用研究,,2005,25(12):234-236.
[7]?張宏海.網(wǎng)格監(jiān)控系統(tǒng)[J].超級計算通訊,,2006,,4(4):43-45.