監(jiān)控是集群管理的核心任務(wù)。監(jiān)控數(shù)據(jù)可用于調(diào)度任務(wù)、負(fù)載平衡、向管理員報告軟硬件故障,并廣泛地控制系統(tǒng)使用情況。監(jiān)控信息必須在不影響集群性能的情況下獲得。本文將討論使用/proc文件系統(tǒng)和Java來獲得監(jiān)控數(shù)據(jù)的方法。
Java在Linux集群中的應(yīng)用
Java技術(shù)為集群管理開發(fā)者提供了許多解決問題的辦法。Java是動態(tài)、靈活、可移植的,這些不尋常的特征使得它成為了在異構(gòu)網(wǎng)絡(luò)及平臺上構(gòu)造集群管理的理想基礎(chǔ)。
Java具有廣泛的例程庫,很容易處理IP協(xié)議,如TCP、UDP,并可在multi-homed主機上進行網(wǎng)絡(luò)程序設(shè)計,用它創(chuàng)建網(wǎng)絡(luò)連接比用C或C++更容易。通過Java本地接口(JNI),運行在Java 虛擬機(JVM)內(nèi)的Java代碼能夠與用其它語言編寫的應(yīng)用及庫文件相互操作并匯編。
在構(gòu)造集群監(jiān)控和管理時,Java早已是一個可選的語言。然而,Java語言通常只被用于系統(tǒng)的前端或集群主機部分,而將用C 語言編寫的守護進程安裝在集群結(jié)點上。盡管Java程序設(shè)計語言提供了許多優(yōu)點,但是,對于高性能集群監(jiān)控,Java能夠有效地替換運行在每個結(jié)點上的C 語言守護進程嗎?這將是本文討論的重點。
高性能監(jiān)控
監(jiān)控Linux集群工具傳統(tǒng)上以秒為測量頻率來提供有限量的數(shù)據(jù)。而高性能集群監(jiān)控被定義為“以intrasecond為測量頻率,從結(jié)點有效地采集數(shù)據(jù)的能力”。當(dāng)涉及較大集群時,監(jiān)控軟件的低效率問題就變得更加嚴(yán)重,這是因為所運行的應(yīng)用軟件必須互相協(xié)調(diào)或共享全局資源。
在一個結(jié)點上的阻隔沖突(Interference)能影響其它結(jié)點上作業(yè)的運行。例如,一個MPI作用需要與所有參與的結(jié)點同步。一種解決辦法是收集少量的數(shù)據(jù),并以小頻率傳輸。然而,如果是高性能監(jiān)控,這種解決辦法是不可接受的,因為有較重利用率的集群應(yīng)該被頻繁持續(xù)地監(jiān)控。本地作業(yè)調(diào)度器必須能夠基于資源使用情況做快速決策。管理員經(jīng)常希望收到緊急事件的立即通知,并希望觀察到歷史趨勢數(shù)據(jù),如果集群不能被頻繁持續(xù)地監(jiān)控,那么這些要求是不可能實現(xiàn)的。因此,必須采取一些措施,如使用更有效的算法、增加傳輸?shù)牟⑿行浴⑻岣邆鬏攨f(xié)議及數(shù)據(jù)格式的效率、減少冗余等。
在跟蹤運行中的資源使用情況時,壓縮Profiling應(yīng)用有助于調(diào)試程序或優(yōu)化程序。對一個給定的應(yīng)用而言,像存儲器、網(wǎng)絡(luò)、CPU這樣動態(tài)資源的使用可能快速地改變著,為了能夠觀察應(yīng)用是怎樣使用這些資源的,一種可能的辦法是使用高頻率的監(jiān)控。
即使用戶對高頻率監(jiān)控沒有興趣,如果算法是有效的,不管監(jiān)控頻率是多少,它也將消費很少的資源。在異構(gòu)集群中這種效率將更重要,用戶的作業(yè)可以被分散到較快的及較慢的結(jié)點上,慢的結(jié)點需要全部CPU來跟上較快的結(jié)點并與之同步。一個監(jiān)控程序花費在較慢結(jié)點上的CPU時間是作業(yè)的關(guān)鍵路徑。
監(jiān)控階段
集群監(jiān)控主要消耗CPU周期與網(wǎng)絡(luò)帶寬這兩個重要資源。然而,資源消費問題與這兩個資源是根本不同的。CPU利用問題對結(jié)點而言是完全本地化的問題,可通過創(chuàng)建有效的收集與合并算法來解決。網(wǎng)絡(luò)帶寬是共享資源,是規(guī)模問題,可以通過最小化網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量來解決。
為了解決這兩個問題,我們將集群監(jiān)控分為三個階段:收集、合并、傳輸。收集階段負(fù)責(zé)從操作系統(tǒng)裝載數(shù)據(jù)、分析數(shù)據(jù)值,并存儲數(shù)據(jù)。合并階段負(fù)責(zé)將來自多個數(shù)據(jù)源的數(shù)據(jù)合在一起,決定數(shù)據(jù)值是否改變并過濾它們。傳輸階段負(fù)責(zé)壓縮并傳輸數(shù)據(jù)。本文集中討論Linux集群監(jiān)控的收集階段。
1.收集階段
Linux有幾種方法來進行系統(tǒng)統(tǒng)計,每種方法都各有其優(yōu)缺點。
◆ 使用現(xiàn)有的工具
標(biāo)準(zhǔn)及非標(biāo)準(zhǔn)工具能執(zhí)行一個或多個收集、合并及傳輸階段,如rstatd或SNMP工具,然而標(biāo)準(zhǔn)的rstat后臺程序提供的信息是有限的,速度慢而且效率低。
◆ 內(nèi)核模塊
幾個系統(tǒng)監(jiān)控工程利用內(nèi)核模塊來存取監(jiān)控數(shù)據(jù)。一般情況下,這是很有效的收集系統(tǒng)數(shù)據(jù)的方法。然而這種方法存在的問題是,當(dāng)主內(nèi)核源內(nèi)有其它改變時,必須保持代碼一致性。一個內(nèi)核模塊可能與用戶想使用的其它內(nèi)核模塊相沖突。此外,在使用監(jiān)控系統(tǒng)之前,用戶必須獲得或申請模塊。
◆ /proc虛擬文件系統(tǒng)
/proc 虛擬文件系統(tǒng)是一個較快的、高效率執(zhí)行系統(tǒng)監(jiān)控的方法。使用/proc的主要缺點是必須保持代碼分析與/proc 文件格式改變的同步。事實表明,Linux內(nèi)核的改變比/proc 文件格式的改變要更頻繁,所以,用/proc虛擬文件系統(tǒng)比用內(nèi)核模塊存在的問題要少。
◆ 混合系統(tǒng)
某些監(jiān)控系統(tǒng)采用混合方式,用內(nèi)核模塊收集數(shù)據(jù),用/proc虛擬文件系統(tǒng)作為數(shù)據(jù)接口。
2.合并階段