HostMonitor 官方网站:http://www.ks-soft.net/ HostMonitor 是一款非常出色的服务端监控程序。可以监控任何 TCP service、 ping主机、检查内存使用情况、检查可用磁盘空间, 具有良好的可扩展性,Linux下可以自己编写Shell脚本检查监控数据,Windows下则可以通过VBScript脚本来检查监控数据。下面实例讲解HostMonitor的配置和以及分别监控Linux和Windows下内存的空闲比率。 本例中使用到的机器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
附件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
<!--