張華


摘 要:網絡設備監控系統在保證企業信息化系統穩定運行的過程中起到了至關重要的作用。文章結合windows平臺的WMI標準接口和通用的SNMP協議,設計并實現了一個對網絡設備實行自動監控及預警的設備監控系統。本系統無需安裝客戶端,配置簡單,使用方便靈活。
關鍵詞:WMI;SNMP;網絡設備監控
中圖分類號:TP393.07 文獻標識碼:A 文章編號:1006-8937(2016)02-0060-03
隨著企業信息化的深入發展,越來越多的企業購買了大量的網絡設備(包括服務器、電腦、交換機等)用以承載自身信息化的建設,隨之而來的是多數網絡設備由于缺少監控導致業務系統經常中斷,不僅影響了企業業務的正常運作,也給維護人員帶來了不小的壓力;此外,來自不同廠商的網絡設備中不可避免地包括各種異構系統平臺,給統一監控帶來了一定的困難。因此,本文旨在設計并實現一個基于B/S架構的基于SNMP和WMI的網絡設備監控系統,基本覆蓋各異構網絡設備,當設備出現故障或征兆后能及時、自動地向網管人員發出預警。
1 SNMP、WMI概述
SMNP是Simple Network Management Protocol的縮寫,意為簡單網絡管理協議。 SNMP是最早提出的網絡管理協議之一,目前已得到了廣泛的應用和支持,其中包括IBM、HP、SUN等大公司和廠商。如今SNMP已成為網絡管理領域中事實上的工業標準,大多數網絡管理系統和平臺都是基于SNMP協議的[1]。
WMI(Windows Management Instrumentation,Windows管理規范)是管理Windows設備的一種基礎規范和標準方法。Windows系統用戶可以借助WMI對本地或遠程計算機進行管理,WMI允許通過一系列公共接口訪問操作系統各個組件,WMI幫助系統管理員更加高效的完成計算機系統的管理[2][3]。
2 系統設計
2.1 網絡設備對象分析
目前在企業信息化系統的實際應用和管理中,存在各種操作系統的服務器和各大廠商的網絡互聯設備,導致管理困難。本文結合本企業的網絡設備現狀,設計了一套基于Web的網絡設備監控管理系統。本企業多數服務器、PC采用Windows系統,由于微軟已將WMI作為系統管理的核心,因此,服務器類設備已基本滿足基于WMI組件的數據采集;其次是公司內各種交換器、路由器等設備,為滿足該類設備的監控,采用基于SNMP協議進行采集。最終,本文所實現的監控系統將基本覆蓋企業內網絡設備的監控和管理。
2.2 系統框架設計
通過對基于SNMP協議和WMI組件的研究,設計架構了基于B/S結構的三層網絡設備監控管理系統模型,如圖1所示,分別是數據采集層、數據處理層和數據展現層。
2.3 系統基本功能
2.3.1 系統配置功能
本系統為適應多種異構系統的數據采集,開放了基于SNMP和WMI兩種數據采集模式,用戶可根據采集設備能夠匹配的數采模式進行設置。一般而言,Windows系統服務器都采用WMI模式,數據的實時性更好;而其他網絡設備,本文采用了基于SNMP的采集模式,該模式數據穩定性更好;此外,本模塊配置了對所檢測網絡設備各系統參數(CPU利用率、內存利用率、網絡負載、磁盤使用率等)的預警閾值設置,用戶可根據日常運行情況對設備預警閾值進行設定,若系統監測到采集數據超過了設定的閾值,可向指定用戶發送郵件及短信提醒。
2.3.2 數據采集與處理功能
該功能分別基于SNMP和WMI兩種數據獲取方式進行采集,根據用戶在配置模塊中所做設置,自動采集網絡設備運行數據并存于SQL Server數據庫,通過對數據進行不同的處理以滿足如觸發報警事件和展現多種形式數據的要求。
2.3.3 數據展現模塊功能
該模塊主要包含單個網絡設備狀態查詢、所有被采集設備每日數據采樣一覽、歷史監測數據分析等界面;界面主要以圖形化形式展示網絡設備、服務器等運行情況。
3 系統實現
3.1 實現平臺
本系統基于微軟.NET平臺開發,優勢在于基于Windows系統的服務器、PC設備已有成熟的基于.NET的WMI API,開發時只需要引入System.Management命名空間,主要使用到的類為;對于非Windows系統平臺的網絡設備,本系統引入了目前使用較為廣泛且開源的SnmpSharpNet包[4]進行基于SNMP協議的開發。
3.2 軟件主要實體類結構及關系
軟件所設計實體,如圖2所示,Device類作為Router類、Server類和Computer類的抽象父類, 各個具體設備實體類包含獲取各設備基本信息的屬性或方法。如Server類具有獲取各個進程(ProcessStat)和硬盤(DiskStat)信息的相關方法,Router類具有獲取網絡(NetworkStat)相關信息的方法,這些信息都會包含在具體數據結構中。最后的工具類(WMI+SnmpService)將負責具體連接設備并獲取相應指定信息。
3.3 關鍵技術實現
通過WMI和SNMP方式采集網絡設備數據過程比較相似且獲取進程數據較為復雜,因此,以下實現關鍵技術的代碼將以獲取進程信息為例,獲取其他信息可仿照以下代碼。
3.3.1 WMI和SNMP連接及執行查詢語句代碼
①WMI方式:
public ManagementConnectPool(string mpusername, string mppwd, string mpspace, string mpserver)
{
// 初始化wmi連接對象,設置用戶名、密碼、命名空間、機器地址
System.Management.ConnectionOptions Conn = new Conne
ctio Options();
ManagementObjectSearcher mos = new ManagementObject
Searcher();
this.username = mpusername;
this.pwd = mppwd;
this.space = mpspace;
this.server = mpserver;
Conn.Username = mpusername;
Conn.Password = mppwd;
Conn.Authority = "ntlmdomain:"+ConfigurationManager.App
Settings["domain"];
string scopestring = "http://" + mpserver + mpspace;
System.Management.ManagementScope Ms = new Managem
entScope(scopestring);
Ms.Connect();
mos.Scope = Ms;
}
②Snmp方式:
///
/// 通過此方法可以向snmp服務發起一個請求,獲取該oid下所有信息
///
public static DictionarygetWalkValue(string host, string community, string irootOid)
{
Dictionary
foreach (ManagementObject mo in moc1)
{
N0 = Decimal.Parse(mo.GetPropertyValue("PercentProcessor
Time").ToString());
D0 = Decimal.Parse(mo.GetPropertyValue("TimeStamp_Sys
100NS").ToString());
break;
}
Thread.Sleep(1000);
ManagementObjectCollection moc2 = mcp.getQueryResult("Select * from Win32_PerfRawData_PerfProc_Process where IDProcess = '" + pid + "'");
foreach (ManagementObject mo in moc2)
{
N1 = Decimal.Parse(mo.GetPropertyValue("PercentProcessor
Time").ToString());
D1 = Decimal.Parse(mo.GetPropertyValue("TimeStamp_Sys
100NS").ToString());
break;
}
cpuUsagePerProcess=((D1 - D0)==0?0:((N1 - N0)/(D1 - D0))*100);
return cpuUsagePerProcess;
}
②Snmp方式: 本文以windows系統的MIB庫為例,因此采用了MIB中hrSWRunPerfCPU 的cputime作為計算單個進程cpu占用率的參數。以間隔一定時間分兩次獲取各進程(hrSWRunPerfCPU:cputime)數據,第一個參數為cputime1,并累加此時cpu總時間為total_cputime1,第二個即為cputime2,cpu總時間為total_cputime2,因此單個進程cpu占用率計算公式為:
[(cputime2 - cputime1)/( total_cputime2- total_cputime1)]x100%,具體計算代碼如下:
public ListGetCpuUsagePerProcess(string oid,string community,string hostIp)
{
Decimal cputime1 = 0, cputime2 = 0, total_cputime1=0,total_cputime2=0;
SnmpService snmpService1 = new SnmpNet.SnmpService(community, hostIp);
var result1 = snmpService1.getWalkValue(oid);
List