本例中使用到的機器IP以及軟件情況如下:
1. 192.168.1.101 安裝有Windows2003的監控服務器(裝有HostMonitor程序)
2. 192.168.1.201 Linux服務器(安裝有RMA-agent for Linux)
3. 192.168.1.202 Windows服務器(安裝有RMA-agent for Windows)
Hostmonitor的安裝沒什麼好說的,到Hostmonitor的官方網站下載安裝程序然後在Windows上根據提示一步一步操作就可以了
1 RMA程序的配置
RMA程序安裝在遠程計算機上,Hostmonitor進行監控時需要和RMA程序交互。
1.1 RMA for Linux 的安裝配置
到Hostmonitor的官方網站下載RMA-agent程序for Linux,建議下載1.25版本,高版本可能會提示某個lib.so文件找不到。上傳到Linux服務器的/opt目錄下,接下來的操作用管理員身份執行。解壓縮,確保RMA程序有執行權限,使用Vi編輯器打開rma.cfg文件,修改【Basic】項目處的RmaPath,RMAPath指向rma執行程序所在的路徑,如果該路徑不正確將導致RMA程序不能啓動。
e.g: RmaPath=/opt/rma
然後修改Password=abcd1234,爲RMA-agent程序指定訪問密碼,後面馬上就要用到這個密碼。
修改【EnabledTests】項目下的 項目,檢查ShellScript=1是否存在,不存在則手動添加,接下來的監控需要通過RMA-agent執行腳本檢查服務器的內存使用情況
檢查【IncomeFilter】項目下的FilterActive,看訪問列表是否激活,即FilterActive的值如果爲1,請將它設置爲0
最後執行rma程序,如果有報錯則需要檢查rma.cfg文件的參數是否正確
1.2 RMA For Windows的配置
在192.168.1.101 上安裝HostMonitor時,只要勾選了RMA模塊,就會在192.168.1.101 機器上安裝RMA For Windows程序。 由於需要監控的機器爲192.168.1.202,所以我們將HostMonito程序拷貝到192.168.1.202上,然後運行安裝程序,在安裝界面中只要勾選RMA模塊就行了。
圖1-1 安裝時選擇自定義安裝
圖1-2 安裝時選擇RMA模塊
接下來需要對RMA-程序做一下配置才能保證我們的程序能夠訪問。打開C:\Program Files\HostMonitor8\RMA-Win目錄,執行rma_cfg.exe,配置Passive RMA
圖 1-3 RMA配置界面
設置password爲abcd1234,更改IP訪問限制爲Accept connections from any Ip address,然後注意勾選Enable Follwing Tests的列表框中[Actice]Script複選框,點擊apply按鈕然後點擊Install將RMA-agent安裝成windows服務,最後檢查一下如果服務沒有自動啓動的話還需要點擊start按鈕手工啓動RMA-agent服務
2 腳本編寫
2.1 Linux空閒內存比率計算
在Linux下查看內存我們一般用free命令:
[root@jacky]# free
total used free shared buffers cached
Mem: 3266180 3250004 16176 0 110652 2668236
-/+ buffers/cache: 471116 2795064
Swap: 2048276 80160 1968116
下面是對這些數值的解釋:
total:總計物理內存的大小。
used:已使用多大。
free:可用有多少。
Shared:多個進程共享的內存總額。
Buffers/cached:磁盤緩存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。
區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在於使用的角度來看,第一行是從OS的角度來看,因爲對於OS,buffers/cached 都是屬於被使用,所以他的可用內存是16176KB,已用內存是3250004KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是從應用程序角度來看,對於應用程序來說,buffers/cached 是等於可用的,因爲buffer/cached是爲了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236
因此我們要計算的空閒內存顯示比率就是2795064/3266180
該數據可以用腳本來計算
PfreeMem=`free -m | awk 'NR==3{print $4}'`;Ptotal=`free -m | awk 'NR==2{print $2}'`;PCOUNT=`echo "($PfreeMem*100/$Ptotal)"|bc`;;
free -m | awk 'NR==3{print $4}'命令得到數值2795064(1)
free -m | awk 'NR==2{print $2}’命令得到數值3266180(2)
兩式相除然後乘以100得到空閒內存比率
接下來則需要在HostMonitor中按照HostMonitor的規範來編寫腳本,首先從菜單中打開腳本管理器Test->New->Shell Script Test->Script Manager,出現腳本管理器的界面,管理器中有一個SYSTEM:MemFree的腳本,拷貝該腳本然後重命名爲SYSTEM:MemFree:CUSTOM
將SYSTEM:MemFree:CUSTOM腳本中case語句中Linux)對應節的內容用上面的腳本替換。腳本編寫工作就完成了,腳本的具體內容可以參考附件1。接下來需要配置HostMonitor讓RMA-agent隔一段時間執行一遍SYSTEM:MemFree:CUSTOM腳本,獲取192.168.1.201服務器的內存使用情況。
1) 執行菜單命令Test->New->Shell Script Test->SYSTEM:MemFree:CUSTOM,出現監控配置界面
圖1-4 shell script 配置界面
Agent選擇192.168.1.201,如果沒有agent則需要手工配置,配置界面中只要輸入前面password參數處設置的密碼以及安裝有RMA-agent程序的IP就配置成功了。
2)在params處填寫30,表示當內存的空閒比率小於百分之三十就報警,點擊OK,就可以對192.168.1.201的機器進行監控了
2.2 Windows空閒內存比率計算
Windows的內存空閒比率需要使用VBScript來實現,Hostmonitor爲執行Windows的VBScript提供了Active Script的接口,在HostMonitor安裝目錄下有個Example目錄,下面存存放了VBScript的一些例子,我們可以對照例子進行腳本的編寫,只可惜我沒找到傳遞參數到腳本的方法,後面例子中的那個比例是寫死在腳本里面的。
在Windows中沒有free,awk等命令行工具來獲取系統的內存使用情況,不過Windows提供了WMI接口供人們查詢系統的相關的一些信息,Windows Management Instrumentation (WMI)是可伸縮的系統管理結構,該規範採用一個統一、基於標準且可擴展的面向對象接口。它提供與系統管理員信息和基礎WMI API交互的標準方法,主要由系統管理應用程序開發人員和系統管理員用來訪問和操作系統管理信息;它可用來生成組織和管理系統信息的工具,使系統管理人員能夠更密切的監視系統活動。
WMI提供了一套內置在Microsoft Windows操作系統中的豐富的系統管理服務,可以在有大量的應用程序、服務和設備的系統中提供全方位的管理功能。它允許應用程序的開發者,使用簡單的、一致的機制,去查詢企業中的任一臺計算機上的信息,或是進行系統配置。
通過WMI接口可以獲得的信息量是驚人的,包括硬件設置,狀態信息,驅動器配置,BIOS信息,應用程序的設置,事件記錄信息,以及其他。WMI通過一組API來獲得信息,但它表徵的是一種通過一個簡單,工業標準對象管理模式來獲取信息的函數。這使得應用程序的開發者不必學習Windows的每一個API的具體細節。
空閒內存和總的物理內存就可以通過WMI接口來獲取。
空閒內存對應FreePhysicalMemory,總的物理內存對應TotalVisibleMemorySize,這兩個量都在Win32_OperatingSystem中定義。我們利用WMI的vbscript接口可以獲得內存利用率。
FUNCTION GetMemUsage()
DIM strComputer,memusage,objWMI,colOS,objOS
strComputer = "."
set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
set colOS = objWMI.InstancesOf("Win32_OperatingSystem")
for each objOS in colOS
memusage = round((objOS.FreePhysicalMemory / objOS.TotalVisibleMemorySize)*100) & "%"
next
set objWMI=Nothing
GetMemUsage=memusage
END FUNCTION
具體的腳本內容可以參考附件2
編寫好腳本後需要對HostMonitor進行配置
1) 執行菜單命令Test->New->(Actice) Script test,出現監控配置界面
圖1-5 Active Script腳本配置界面
2)指定agent爲192.168.1.202
3)指定執行的腳本,即在Run Script from external file處指定腳本爲我們自己編寫的監控內存使用率的腳本
4)勾選Translate macros
嗯,現在Linux和windows的內存空閒比率都可以在Hostmonitor的監控窗口顯示出來了。
附件1 Linux監控內存空閒比率的腳本
#!/bin/sh
if [ $# -ge 1 ]
then
OS=`uname`
case $OS in
AIX) PCOUNT=`vmstat|tail -1|awk '{print $4*4}'`;;
Linux) PfreeMem=`free -m | awk 'NR==3{print $4}'`;Ptotal=`free -m | awk 'NR==2{print $2}'`;PCOUNT=`echo "($PfreeMem*100/$Ptotal)"|bc`;;
FreeBSD)PCOUNT=`vmstat|tail -1|awk '{print $5}'`;;
NetBSD) PCOUNT=`vmstat|tail -1|awk '{print $5}'`;;
OpenBSD)PCOUNT=`vmstat|tail -1|awk '{print $5}'`;;
SunOS) PCOUNT=`vmstat|tail -1|awk '{print $5}'`;;
*) echo 'ScriptRes:Unknown:script is not designed for '$OS
exit;;
esac
if [ $PCOUNT -le $1 ]
then
echo "ScriptRes:Bad:"$PCOUNT"%"
else
echo "ScriptRes:Ok:"$PCOUNT"%"
fi
else
echo 'ScriptRes:Unknown:not enough parameters specified'
fi
附件2 Windows監控內存使用比率的腳本
'-----------------------------------------------------------------------------
'File : MemUsage.VBS
'Purpose : Check memory usage of Dest Host
'Req : Test's option "Translate macros" must be enabled
'Language: VBScript
'Version : 1.0
'-----------------------------------------------------------------------------
Option Explicit
const statusAlive = "Host is alive:"
const statusDead = "No answer:"
const statusUnknown = "Unknown:"
const statusNotResolved = "Unknown host:"
const statusOk = "Ok:"
const statusBad = "Bad:"
const statusBadContents = "Bad contents:"
const memoryFreeRatio = 30
'The memoryFreeRatio param means that if the memory of your windows system is low than 30 percent of total physical memory,
'Host Monitor Will Alert you
'---- entry point ----
FUNCTION performtest()
DIM CheckResult,RealRatio
IF "%Reply%"="%"+"Reply"+"%" THEN
performtest = statusUnknown+"Please enable 'Translate macros' option"
ELSE
CheckResult = GetMemUsage
IF CheckResult<>"%Reply%" THEN
performtest = statusBad+CheckResult
ELSE
RealRatio=CInt(Left(CheckResult,Len(CheckResult)-1))
IF RealRatio > memoryFreeRatio THEN
performtest = statusOk+CheckResult
ELSE
performtest = statusBad+CheckResult
END IF
END IF
END IF
END FUNCTION
'----- functions -----
FUNCTION GetMemUsage()
DIM DestComputer,MemUsage,ObjWMI,DestOS,objOS
DestComputer = "."
set ObjWMI = GetObject("winmgmts:\\" & DestComputer & "\root\cimv2")
set DestOS = ObjWMI.InstancesOf("Win32_OperatingSystem")
for each objOS in DestOS
MemUsage = round((objOS.FreePhysicalMemory / objOS.TotalVisibleMemorySize)*100) & "%"
next
set ObjWMI=Nothing
GetMemUsage=MemUsage
END FUNCTION