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