集群監控工具簡介:Ganglia和Nagios
隨著數據中心的增長和管理人員的縮減,對計算資源使用有效監視工具的需求變得比以往更加迫切。術語監視 在應用到數據中心時可能會讓人混淆,因為它的含義會根據具體的說話者和聽眾而有所不同。例如:
- 在集群中運行應用程序的人員會思考:“我的作業什么時候運行?它什么時候會完成?以及與上一次相比,它是怎樣執行的?”
- 網絡運營中心(NOC)的操作員會思考:“什么時候會出現表示需要解決問題的紅燈并安排服務電話?”
- 系統工程部的人員會思考:“我們的機器如何執行?所有服務是否運行正常?我們可以看到哪些趨勢以及如何更好地利用計算資源?”
面對如此多的定義,您必須查找大量的代碼才能監視您真正想要監視的內容,不僅如此,還存在無數的產品和服務。可是幸運的是,許多監視工具都是開源的 —— 實際上,某些開源工具的表現比嘗試完成同樣工作的某些商業應用程序還要好。
使用開源監視工具最困難的部分是實現適合環境的安裝和配置。使用開源監視工具的兩個主要問題是:
- 沒有一個工具可以按照期望的方式監視所需的所有內容。為什么?因為不同的用戶將以不同的方式定義監視(正如我剛才所述)。
- 由于存在第一個問題,因此要讓工具完全按照期望在數據中心中工作可能需要完成大量自定義。為什么?因為不管多么地標準,每一個環境也都是獨一無二的。
順便說一句,商業監視工具也同樣存在這兩個問題。
因此,我將介紹 Ganglia 和 Nagios,這是兩個用于監視數據中心的工具。這兩個工具被大量用于高性能計算(HPC)環境中,但是它們對于其他環境也具有很大的吸引力(例如云、呈現集群和托管中心)。此外,兩者對監視的定義也采取了不同的側重點。Ganglia 更多地與收集度量數據并隨時跟蹤這些數據有關,而 Nagios 一直致力于成為一種報警機制。
隨著獨立項目的發展,逐步出現了交疊。例如:
- Ganglia 過去要求代理運行在每臺主機上以從中收集信息,但是現在可以通過 Ganglia 的欺騙機制獲得度量數據。
- Nagios 過去也是僅用于從目標主機中輪詢信息,但是現在提供了在目標主機上運行代理的插件。
雖然這些工具在某些功能領域里已經發生交疊,但是兩者之間還是有許多不同之處,可以讓您從運行這兩個工具中獲益。同時運行兩個工具可以相互彌補不足:
- Ganglia 沒有內置通知系統,而 Nagios 在這方面表現杰出。
- Nagios 似乎沒有適合目標主機的可伸縮內置代理(這是一個爭議點),而 Ganglia 在設計之初就考慮到這點。
還有其他開源項目也可以完成這兩個工具完成的工作,并且有些項目在某些領域做得比其他項目好。常用開源監視解決方案包括 Cacti、Zenoss、Zabbix、Performance Copilot(PCP)和 Clumon(而且我相信您已經有了自己喜歡的選擇)。這些工具(包括 Ganglia 和一些 Nagios 插件)中的許多工具在底層都使用了 RRDTool 或 Tobi Oetiker 的 MRTG(Multi Router Traffic Grapher),以生成漂亮的圖形和存儲數據。
盡管用于監視數據中心的開源解決方案如此眾多,我卻經常驚訝地發現許多向外擴展的計算中心在開發自己的解決方案,而忽略其他人已經完成的工作。
在這個兩部分文章中,我將討論 Ganglia 和 Nagios,因為有一些事實證據表明這些工具是最常用的。盡管將兩者集成在一起是非常普遍的實踐(尤其是在一些大型的 HPC 實驗室和大學里),但是我發現很少有文章對此進行介紹。
學完本系列,您應當能夠安裝 Ganglia 并與 Nagios 綁定在一起,并且可以回答不同的用戶組向您詢問的監視問題。這只是一個開始,但是應當可以幫助您了解基礎知識并逐步把握集群的整體情況。
在本文中,我將指導您完成:
- 安裝和配置基本的 Ganglia 設置。
- 如何使用 Python 模塊來用 IPMI(Intelligent Platform Management Interface)擴展功能。
- 如何使用 Ganglia 主機欺騙來監視 IPMI。
我們的目標 —— 設置 HPC Linux® 集群的基準監視系統,在其中可以在某個程度上解決上面所述的三個不同監視意圖:
- 應用程序人員可以看到隊列的排隊情況如何,并可以看到運行作業的可用節點。
- NOC 可以收到系統故障報警或者在 Nagios Web 界面上看到一個閃亮的紅色錯誤指示燈。如果節點出現故障或者溫度過高,他們也可以通過電子郵件收到通知。
- 系統工程師可以繪制數據曲線圖、報告集群利用情況并決定未來采購哪些硬件。
Ganglia 簡介
Ganglia 是 UC Berkeley 發起的一個開源監視項目,設計用于測量數以千計的節點。每臺計算機都運行一個收集和發送度量數據(如處理器速度、內存使用量等)的名為 gmond
的守護進程。它將從操作系統和指定主機中收集。接收所有度量數據的主機可以顯示這些數據并且可以將這些數據的精簡表單傳遞到層次結構中。正因為有這種層次結構模式,才使得 Ganglia 可以實現良好的擴展。gmond
帶來的系統負載非常少,這使得它成為在集群中各臺計算機上運行的一段代碼,而不會影響用戶性能。
所有這些數據收集會多次影響節點性能。網絡中的 “抖動(Jitter)” 發生在大量小消息同時出現時。我們發現通過將節點時鐘保持一致,就可以避免這個問題。
安裝 Ganglia
Internet 中有許多介紹如何安裝 Ganglia 的文章和參考資料。我們將重新查看我在 xCAT 維基中撰寫的一篇文章。我假定出于本文的目的,操作系統是 Red Hat 5 Update 2(但是對于其他企業 Linux 操作系統,這些步驟不會有很大差別)。
先決條件
假定您已經設置了 yum 庫,安裝先決條件在很大程度上應當十分簡單。類似于以下代碼:
yum -y install apr-devel apr-util check-devel cairo-devel pango-devel libxml2-devel rpmbuild glib2-devel dbus-devel freetype-devel fontconfig-devel gcc-c++ expat-devel python-devel libXrender-devel |
(注:Yum 實際上應該可以處理大多數依賴關系,但是在我的一個測試中,我看到編譯失敗,而這些失敗可以通過添加所有這些包來修正。)
在獲得這些包之后,您需要滿足另一個不在 Red Hat 庫中的先決條件。您可以像下面這樣獲取并構建它,只要您的機器連接了 Internet:
wget \ http://ga13.files.bigpond.com:4040/fedora/linux/releases/9/Everything/source/ SRPMS/libconfuse-2.6-1.fc9.src.rpm rpmbuild --rebuild libconfuse-2.6-1.fc9.src.rpm cd /usr/src/redhat/RPMS/x86_64/ rpm -ivh libconfuse-devel-2.6-1.x86_64.rpm libconfuse-2.6-1.x86_64.rpm |
#p#
RRDTool
RRDTool 表示:輪循數據庫工具(Round Robin Database Tool)。它是由 Tobias Oetiker 創建的,并且為許多高性能監視工具提供了引擎。Ganglia 是其中之一,但是 Cacti 和 Zenoss 是另外兩個。
要安裝 Ganglia,首先需要讓 RRDTool 運行在監視服務器上。RRDTool 將提供其他程序使用的兩個非常優秀的功能:
- 它將在輪循數據庫中存儲數據。隨著捕捉的數據變得越來越舊,解析的精確性將變得越來越低。這將占用很少的內存并且在大多數情況下仍然有用。
- 它可以通過使用命令行實參根據捕捉的數據生成圖形。
要安裝 RRDTool,請運行以下代碼(對 1.3.4 版和 1.3.6 版進行了測試):
cd /tmp/ wget http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz tar zxvf rrdtool* cd rrdtool-* ./configure --prefix=/usr make -j8 make install which rrdtool ldconfig # make sure you have the new rrdtool libraries linked. |
使用 RRDTool 作為環境中的獨立工具有許多種方法,但是我在這里不會介紹這些方法。
Ganglia 安裝
現在已滿足所有先決條件,您可以安裝 Ganglia。首先需要獲得它。在本文中,我們使用的是 Ganglia 3.1.1。下載 ganglia-3.1.1.tar.gz 文件并將其放在監視服務器的 /tmp 目錄中。然后執行以下代碼:
cd /tmp/ tar zxvf ganglia*gz cd ganglia-3.1.1/ ./configure --with-gmetad make -j8 make install |
您應當會退出,而不會遇到任何錯誤。如果看到錯誤,則可能需要檢查缺少哪些庫。
配置 Ganglia
現在基本安裝已完成,需要設置幾個配置項才能運行。執行以下步驟:
- 處理命令行文件。
- 修改 /etc/ganglia/gmond.conf。
- 注意多宿主(multi-homed)計算機。
- 在管理服務器中啟動它。
步驟 1:處理命令行文件
如下所示:
cd /tmp/ganglia-3.1.1/ # you should already be in this directory mkdir -p /var/www/html/ganglia/ # make sure you have apache installed cp -a web/* /var/www/html/ganglia/ # this is the web interface cp gmetad/gmetad.init /etc/rc.d/init.d/gmetad # startup script cp gmond/gmond.init /etc/rc.d/init.d/gmond mkdir /etc/ganglia # where config files go gmond -t | tee /etc/ganglia/gmond.conf # generate initial gmond config cp gmetad/gmetad.conf /etc/ganglia/ # initial gmetad configuration mkdir -p /var/lib/ganglia/rrds # place where RRDTool graphs will be stored chown nobody:nobody /var/lib/ganglia/rrds # make sure RRDTool can write here. chkconfig --add gmetad # make sure gmetad starts up at boot time chkconfig --add gmond # make sure gmond starts up at boot time |
步驟 2:修改 /etc/ganglia/gmond.conf
現在可以修改 /etc/ganglia/gmond.conf 以命名集群。假定集群名稱為 “matlock”;則可以將 name = "unspecified"
更改為 name = "matlock"
。
步驟 3:注意多宿主計算機
在我的集群中,eth0 是我的系統的公共 IP 地址。但是,監視服務器將通過 eth1 與私有集群網絡中的節點進行通信。我需要確保 Ganglia 使用的多點傳送將與 eth1 綁定在一起。這可以通過創建 /etc/sysconfig/network-scripts/route-eth1 文件來完成。添加 239.2.11.71 dev eth1
內容。
然后您可以使用 service network restart
重新啟動網絡并確保路由器顯示此 IP 通過 eth1。注:您應當使用 239.2.11.71,因為這是 ganglia 的默認多點傳送通道。如果使用其他通道或者增加更多通道,請更改它。
步驟 4:在管理服務器中啟動它
現在您可以在監視服務器中完全啟動它:
service gmond start service gmetad start service httpd restart |
停止 Web 瀏覽器并將其指向位于 http://localhost/ganglia 的管理服務器。您將看到管理服務器現在處于受監視狀態。您還將看到若干度量數據正受到監視并繪制曲線圖。最有用的曲線圖之一是您可以監視這臺計算機中的負載情況。下面是我的計算機的負載情況圖:
圖 1. 監視負載
沒有發生什么操作,計算機只是處于空閑狀態。
#p#
把 Ganglia 放在節點上
到現在為止,我們已經完成了在管理服務器中運行 Ganglia 的工作;現在必須更多地關注計算節點。事實證明只需復制一些文件就可以把 Ganglia 放到計算節點上。這是在使用 Kickstart 時可以添加到安裝后腳本中的內容或是可以添加到其他更新工具中的內容。
快速但粗糙的方法是這樣的:創建一個含有所有主機名的文件。假定您有 deathstar001
-deathstar100
節點。則將擁有類似如下所示的名為 /tmp/mynodes 的文件:
deathstar001 deathstar002 ...skip a few... deathstar099 deathstar100 |
現在只需運行以下代碼:
# for i in `cat /tmp/mynodes`; do scp /usr/sbin/gmond $i:/usr/sbin/gmond ssh $i mkdir -p /etc/ganglia/ scp /etc/ganglia/gmond.conf $i:/etc/ganglia/ scp /etc/init.d/gmond $i:/etc/init.d/ scp /usr/lib64/libganglia-3.1.1.so.0 $i:/usr/lib64/ scp /lib64/libexpat.so.0 $i:/lib64/ scp /usr/lib64/libconfuse.so.0 $i:/usr/lib64/ scp /usr/lib64/libapr-1.so.0 $i:/usr/lib64/ scp -r /usr/lib64/ganglia $i:/usr/lib64/ ssh $i service gmond start done |
您可以重新啟動 gmetad
,刷新 Web 瀏覽器,然后應當會看到節點現在出現在列表中。
您可能會遇到下面這些潛在的問題:
- 您可能也需要按照前面的步驟 3 那樣對節點明確設置靜態路由。
- 您的防火墻可能會阻塞端口。
gmond
將在端口 8649 上運行。如果gmond
是在計算機中運行,您應當能夠運行telnet localhost 8649
命令。并看到一些 XML 輸出滾動顯示在屏幕中。
觀察 Ganglia
許多系統工程師很難理解他們自己的工作量或者工作特性。他們可能有自定義代碼或者沒有對商業產品的運行進行研究。Ganglia 可以幫助剖析應用程序。
我們將使用 Ganglia 來檢驗運行 Linpack 基準的屬性。圖 2 顯示了啟動三項不同的 Linpack 作業的時間間隔。
圖 2. 觀察 Linpack
從此圖中可以看到,當作業開始時,在作業啟動時網絡中有一些活動。但是,有趣的是接近作業結束時,網絡流量增加了很多。如果您不了解 Linpack,您至少會認為:網絡流量在作業結束時增加。
圖 3 和圖 4 分別顯示 CPU 和內存使用率。在這里,您可以看到正在逼近處理器的限制,而且內存使用率也非常高。
圖 3. CPU 使用率
圖 4. 內存使用率
這些圖形讓我們深入了解正在運行的應用程序:我們正在使用大量 CPU 和內存并且在接近作業結束時造成更多網絡流量。關于這項作業還有很多其他屬性是我們不知道的,但是這給我們提供了一個很好的開端。
知道這些情況可以幫助在未來購買更多硬件時做出更好的采購決定。當然,沒有人購買硬件只是為了運行 Linpack ……對么?
#p#
擴展能力
基本 Ganglia 安裝已經給我們提供了大量有用信息。使用 Ganglia 的插件將給我們提供兩種添加更多功能的方法:
- 通過添加帶內(in-band)插件。
- 通過添加一些其他來源的帶外(out-of-band)欺騙。
第一種方法一直是 Ganglia 的常見實踐。第二種方法是最新開發的實踐,并且與 Nagios 在功能上有所交疊。讓我們通過一個實際示例來簡要探究兩種方法。
帶內插件
帶內插件可以通過兩種方式發生。
- 使用 cron-job 方法并調用 Ganglia 的
gmetric
命令來輸入數據。 - 使用新 Python 模塊插件并撰寫它的腳本。
第一種方法是過去常采用的方法,并且我將在下一節中討論更多關于帶外插件的內容。它的問題是無法干凈地完成。Ganglia 3.1.x 添加了 Python 和 C 模塊插件以使其看上去可以更加自然地擴展 Ganglia。此刻,我將向您展示第二種方法。
首先,用 Ganglia 啟用 Python 插件。執行以下操作:
- 編輯 /etc/ganglia/gmond.conf 文件。
如果打開該文件,您會注意到:其中四分之一的內容都是類似如下所示的名為 modules
的部分:
modules { module { name = "core_metrics" } ... } |
我們將向模塊部分添加另一個模塊。這個必須添加的模塊就是:
module { name = "python_module" path = "modpython.so" params = "/usr/lib64/ganglia/python_modules/" } |
在 gmond.conf 中,我在第 90 行添加了上一個代碼段。這將允許 Ganglia 使用 Python 模塊。此外,還在 include ('/etc/ganglia/conf.d/*.conf')
語句后添加一些行,添加 include ('/etc/ganglia/conf.d/*.pyconf')
行。這些包括了要添加的內容的定義。
- 創建一些目錄。
如下所示:
mkdir /etc/ganglia/conf.d mkdir /usr/lib64/ganglia/python_modules |
- 在所有節點上重復執行步驟 1 和 2。
為此,執行下面的操作:
- 把新的 gmond.conf 復制到要監視的各個節點上。
- 在要監視的各個節點中創建步驟 2 中所示的兩個目錄,以便它們也可以使用 Python 擴展。
現在已經設置好節點可以準備運行 Python 模塊了,讓我們創建一個新模塊。在本例中,我們將添加一個使用 Linux IPMI 驅動程序的插件。如果不熟悉 IPMI 并且使用的是現代的 Intel 和 AMD 計算機,則請了解一下這方面的內容(請參閱 參考資料)。
我們將使用開源 IPMItool 與本地計算機中的 IPMI 設備進行通信。還有若干其他選項,如 OpenIPMI 或 freeipmi。這只是一個示例,因此如果您想要使用其他選項,那么完全沒有問題。
在開始使用 Ganglia 之前,確保 IPMItool 可以在您的計算機中工作。運行 ipmitool -c sdr type temperature | sed 's/ /_/g'
命令;如果該命令不工作,請嘗試裝入 IPMI 設備驅動程序并再次運行:
modprobe ipmi_msghandler modprobe ipmi_si modprobe ipmi_devintf |
在運行 ipmitool
命令后,我的輸出顯示:
Ambient_Temp,20,degrees_C,ok CPU_1_Temp,20,degrees_C,ok CPU_2_Temp,21,degrees_C,ok |
因此在我的 Ganglia 插件中,我將只監視周圍環境溫度。我已經創建了一個編寫得不是很好的名為 ambientTemp.py 的插件,該插件將根據在 Ganglia 維基中找到的插件使用 IPMI:
清單 1. 編寫得不是很好的 Python 插件 ambientTemp.py
import os def temp_handler(name): # our commands we're going to execute sdrfile = "/tmp/sdr.dump" ipmitool = "/usr/bin/ipmitool" # Before you run this Load the IPMI drivers: # modprobe ipmi_msghandler # modprobe ipmi_si # modprobe ipmi_devintf # you'll also need to change permissions of /dev/ipmi0 for nobody # chown nobody:nobody /dev/ipmi0 # put the above in /etc/rc.d/rc.local foo = os.path.exists(sdrfile) if os.path.exists(sdrfile) != True: os.system(ipmitool + ' sdr dump ' + sdrfile) if os.path.exists(sdrfile): ipmicmd = ipmitool + " -S " + sdrfile + " -c sdr" else: print "file does not exist... oops!" ipmicmd = ipmitool + " -c sdr" cmd = ipmicmd + " type temperature | sed 's/ /_/g' " cmd = cmd + " | awk -F, '/Ambient/ {print $2}' " #print cmd entries = os.popen(cmd) for l in entries: line = l.split() # print line return int(line[0]) def metric_init(params): global descriptors temp = {'name': 'Ambient Temp', 'call_back': temp_handler, 'time_max': 90, 'value_type': 'uint', 'units': 'C', 'slope': 'both', 'format': '%u', 'description': 'Ambient Temperature of host through IPMI', 'groups': 'IPMI In Band'} descriptors = [temp] return descriptors def metric_cleanup(): '''Clean up the metric module.''' pass #This code is for debugging and unit testing if __name__ == '__main__': metric_init(None) for d in descriptors: v = d['call_back'](d['name']) print 'value for %s is %u' % (d['name'], v) |
復制清單 1 并將其放到 /usr/lib64/ganglia/python_modules/ambientTemp.py 中。對集群中的所有節點都這樣做。
現在我們已經把腳本添加到了集群的所有節點中,告訴 Ganglia 如何執行腳本。創建名為 /etc/ganglia/conf.d/ambientTemp.pyconf 的新文件,內容如下:
清單 2. Ambient.Temp.pyconf
modules { module { name = "Ambient Temp" language = "python" } } collection_group { collect_every = 10 time_threshold = 50 metric { name = "Ambient Temp" title = "Ambient Temperature" value_threshold = 70 } } |
將清單 2 保存到所有節點上。
重新啟動 gmond
之前必須完成的最后一件事是更改 IPMI 設備的權限,這樣沒有人 可以對它執行操作。這將使您的 IPMI 接口極易受到惡意攻擊!
這只是一個示例:chown nobody:nobody /dev/ipmi0
。
現在在所有位置重新啟動 gmond
。如果運行正常,則應當可以刷新 Web 瀏覽器并看到類似如下所示的內容:
圖 5. IPMI 帶內度量數據
帶內度量數據的好處是允許您在主機中運行程序,并通過其他度量數據使用的同一種收集機制將信息提供給鏈路。這種方法的缺點(尤其是對于 IPMI)是需要在主機上執行相當多的配置才能工作。
注意,必須確保腳本是用 Python 編寫的,配置文件已經存在,并且 gmond.conf 已正確設置。我們只執行一種度量!考慮一下編寫其他度量所需執行的所有操作!針對每種度量在每臺主機上執行此操作會變得非常煩人。IPMI 是帶外工具,因此有一種更好的方法,不是嗎?確實是。
#p#
帶外插件(主機欺騙)
主機欺騙剛好是我們需要的工具。在這里使用功能強大的 gmetric
并告訴它我們正在其上運行的主機 —— gmetric
是將信息插入到 Ganglia 中的命令行工具。通過這種方法,您可以監視任何內容。
gmetric
最精彩的部分是什么?大量已經編寫好的腳本。
作為一種學習體驗,我將向您展示如何徹底改造運行 ipmitool 以遠程訪問計算機的方法:
- 確保 ipmitool 可以在帶外正常工作。
我已經設置了 BMC(目標計算機中的芯片),以便我可以在其中運行 IPMI 命令。例如:我的監視主機名為 redhouse。通過 redhouse,我希望監視集群中的所有其他節點。Redhouse 是 gmetad
運行的位置,也是 Web 瀏覽器指向的位置(以便訪問所有 Ganglia 信息)。
我的集群中的一個節點擁有 x01 主機名。我把 x01 的 BMC 設為擁有解析到主機 x01-bmc 的 IP 地址。在這里,我嘗試遠程訪問該主機:
# ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD sdr dump \ /tmp/x01.sdr Dumping Sensor Data Repository to '/tmp/x01.sdr' # ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD -S /tmp/x01.sdr \ sdr type Temperature Ambient Temp | 32h | ok | 12.1 | 20 degrees C CPU 1 Temp | 98h | ok | 3.1 | 20 degrees C CPU 2 Temp | 99h | ok | 3.2 | 21 degrees C |
看上去一切良好。現在讓我們把它放到一個腳本中以提供給 gmetric
。
- 創建使用 ipmitool 的腳本以提供給
gmetric
。
我們創建了下面的 /usr/local/bin/ipmi-ganglia.pl 腳本并將其放到監視服務器中:
#!/usr/bin/perl # vallard@us.ibm.com use strict; # to keep things clean... er cleaner use Socket; # to resolve host names into IP addresses # code to clean up after forks use POSIX ":sys_wait_h"; # nodeFile: is just a plain text file with a list of nodes: # e.g: # node01 # node02 # ... # nodexx my $nodeFile = "/usr/local/bin/nodes"; # gmetric binary my $gmetric = "/usr/bin/gmetric"; #ipmitool binary my $ipmi = "/usr/bin/ipmitool"; # userid for BMCs my $u = "xcat"; # password for BMCs my $p = "f00bar"; # open the nodes file and iterate through each node open(FH, "$nodeFile") or die "can't open $nodeFile"; while(my $node = <FH>){ # fork so each remote data call is done in parallel if(my $pid = fork()){ # parent process next; } # child process begins here chomp($node); # get rid of new line # resolve node's IP address for spoofing my $ip; my $pip = gethostbyname($node); if(defined $pip){ $ip = inet_ntoa($pip); }else{ print "Can't get IP for $node!\n"; exit 1; } # check if the SDR cache file exists. my $ipmiCmd; unless(-f "/tmp/$node.sdr"){ # no SDR cache, so try to create it... $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p sdr dump /tmp/$node.sdr"; `$ipmiCmd`; } if(-f "/tmp/$node.sdr"){ # run the command against the cache so that its faster $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p -S /tmp/$node.sdr sdr type Temperature "; # put all the output into the @out array my @out = `$ipmiCmd`; # iterate through each @out entry. foreach(@out){ # each output line looks like this: # Ambient Temp | 32h | ok | 12.1 | 25 degrees C # so we parse it out chomp(); # get rid of the new line # grap the first and 5th fields. (Description and Temp) my ($descr, undef, undef, undef,$temp) = split(/\|/); # get rid of white space in description $descr =~ s/ //g; # grap just the temp, (We assume C anyway) $temp = (split(' ', $temp))[0]; # make sure that temperature is a number: if($temp =~ /^\d+/ ){ #print "$node: $descr $temp\n"; my $gcmd = "$gmetric -n '$descr' -v $temp -t int16 -u Celcius -S $ip:$node"; `$gcmd`; } } } # Child Thread done and exits. exit; } # wait for all forks to end... while(waitpid(-1,WNOHANG) != -1){ 1; } |
除了所有解析之外,此腳本只運行 ipmitool
命令并獲取溫度。然后,它將針對每項度量數據,使用 gmetric
命令將這些值放到 Ganglia 中。
- 以 cron 作業的形式運行腳本。
運行 crontab -e
。我添加了以下每 30 分鐘就運行一次的條目:30 * * * * /usr/local/bin/ipmi-ganglia.sh
。您可能希望它發生得更加頻繁或者次數更少。
- 打開 Ganglia 并查看結果。
打開 Ganglia Web 瀏覽器并查看一個節點的圖形,您可以看到節點被欺騙并且更新了每個節點條目:
圖 6. no_group 度量數據
欺騙的缺點之一是類別歸入 no_group 度量組。gmetric
似乎沒有辦法像帶內版本那樣進行良好的分組。
結束語
本文大致介紹了使用 Ganglia 和 Nagios 作為開源監視工具(單獨使用和同時使用)可以完成的工作。您了解了如何安裝/配置 Ganglia,然后看到了 Ganglia 對于了解應用程序特性是多么有用。最后,您看到了如何使用帶內腳本擴展 Ganglia 以及如何使用帶有主機欺騙的帶外腳本。
這是一個良好的開端。但是本文只回答了系統工程師提出的監視問題。現在可以查看系統范圍的性能并了解計算機的利用情況。我們可以確定計算機是否始終處于空閑狀態,還是以 60% 的使用率運行。現在甚至可以確定哪些計算機運行得最活躍,哪些計算機運行得最少,并了解其機架位置是否可以安排得更好。
這個兩部分系列的第二部分將探究如何設置 Nagios 并將其與 Ganglia 整合在一起,內容包括:
- 安裝和配置基本 Nagios 設置以執行報警
- 監視交換機和其他基礎設施
- 將 Nagios 綁定到 Ganglia 中以執行報警
此外,第二部分將展示如何擴展整個監視系統以監視運行作業和其他基礎設施。通過執行這些附加項目,我們將能夠回答不同用戶組詢問的其他監視問題。
原文:https://www.ibm.com/developerworks/cn/linux/l-ganglia-nagios-1/
【相關閱讀】