張華
摘 要:網(wǎng)絡設備監(jiān)控系統(tǒng)在保證企業(yè)信息化系統(tǒng)穩(wěn)定運行的過程中起到了至關(guān)重要的作用。文章結(jié)合windows平臺的WMI標準接口和通用的SNMP協(xié)議,設計并實現(xiàn)了一個對網(wǎng)絡設備實行自動監(jiān)控及預警的設備監(jiān)控系統(tǒng)。本系統(tǒng)無需安裝客戶端,配置簡單,使用方便靈活。
關(guān)鍵詞:WMI;SNMP;網(wǎng)絡設備監(jiān)控
中圖分類號:TP393.07 文獻標識碼:A 文章編號:1006-8937(2016)02-0060-03
隨著企業(yè)信息化的深入發(fā)展,越來越多的企業(yè)購買了大量的網(wǎng)絡設備(包括服務器、電腦、交換機等)用以承載自身信息化的建設,隨之而來的是多數(shù)網(wǎng)絡設備由于缺少監(jiān)控導致業(yè)務系統(tǒng)經(jīng)常中斷,不僅影響了企業(yè)業(yè)務的正常運作,也給維護人員帶來了不小的壓力;此外,來自不同廠商的網(wǎng)絡設備中不可避免地包括各種異構(gòu)系統(tǒng)平臺,給統(tǒng)一監(jiān)控帶來了一定的困難。因此,本文旨在設計并實現(xiàn)一個基于B/S架構(gòu)的基于SNMP和WMI的網(wǎng)絡設備監(jiān)控系統(tǒng),基本覆蓋各異構(gòu)網(wǎng)絡設備,當設備出現(xiàn)故障或征兆后能及時、自動地向網(wǎng)管人員發(fā)出預警。
1 SNMP、WMI概述
SMNP是Simple Network Management Protocol的縮寫,意為簡單網(wǎng)絡管理協(xié)議。 SNMP是最早提出的網(wǎng)絡管理協(xié)議之一,目前已得到了廣泛的應用和支持,其中包括IBM、HP、SUN等大公司和廠商。如今SNMP已成為網(wǎng)絡管理領(lǐng)域中事實上的工業(yè)標準,大多數(shù)網(wǎng)絡管理系統(tǒng)和平臺都是基于SNMP協(xié)議的[1]。
WMI(Windows Management Instrumentation,Windows管理規(guī)范)是管理Windows設備的一種基礎規(guī)范和標準方法。Windows系統(tǒng)用戶可以借助WMI對本地或遠程計算機進行管理,WMI允許通過一系列公共接口訪問操作系統(tǒng)各個組件,WMI幫助系統(tǒng)管理員更加高效的完成計算機系統(tǒng)的管理[2][3]。
2 系統(tǒng)設計
2.1 網(wǎng)絡設備對象分析
目前在企業(yè)信息化系統(tǒng)的實際應用和管理中,存在各種操作系統(tǒng)的服務器和各大廠商的網(wǎng)絡互聯(lián)設備,導致管理困難。本文結(jié)合本企業(yè)的網(wǎng)絡設備現(xiàn)狀,設計了一套基于Web的網(wǎng)絡設備監(jiān)控管理系統(tǒng)。本企業(yè)多數(shù)服務器、PC采用Windows系統(tǒng),由于微軟已將WMI作為系統(tǒng)管理的核心,因此,服務器類設備已基本滿足基于WMI組件的數(shù)據(jù)采集;其次是公司內(nèi)各種交換器、路由器等設備,為滿足該類設備的監(jiān)控,采用基于SNMP協(xié)議進行采集。最終,本文所實現(xiàn)的監(jiān)控系統(tǒng)將基本覆蓋企業(yè)內(nèi)網(wǎng)絡設備的監(jiān)控和管理。
2.2 系統(tǒng)框架設計
通過對基于SNMP協(xié)議和WMI組件的研究,設計架構(gòu)了基于B/S結(jié)構(gòu)的三層網(wǎng)絡設備監(jiān)控管理系統(tǒng)模型,如圖1所示,分別是數(shù)據(jù)采集層、數(shù)據(jù)處理層和數(shù)據(jù)展現(xiàn)層。
2.3 系統(tǒng)基本功能
2.3.1 系統(tǒng)配置功能
本系統(tǒng)為適應多種異構(gòu)系統(tǒng)的數(shù)據(jù)采集,開放了基于SNMP和WMI兩種數(shù)據(jù)采集模式,用戶可根據(jù)采集設備能夠匹配的數(shù)采模式進行設置。一般而言,Windows系統(tǒng)服務器都采用WMI模式,數(shù)據(jù)的實時性更好;而其他網(wǎng)絡設備,本文采用了基于SNMP的采集模式,該模式數(shù)據(jù)穩(wěn)定性更好;此外,本模塊配置了對所檢測網(wǎng)絡設備各系統(tǒng)參數(shù)(CPU利用率、內(nèi)存利用率、網(wǎng)絡負載、磁盤使用率等)的預警閾值設置,用戶可根據(jù)日常運行情況對設備預警閾值進行設定,若系統(tǒng)監(jiān)測到采集數(shù)據(jù)超過了設定的閾值,可向指定用戶發(fā)送郵件及短信提醒。
2.3.2 數(shù)據(jù)采集與處理功能
該功能分別基于SNMP和WMI兩種數(shù)據(jù)獲取方式進行采集,根據(jù)用戶在配置模塊中所做設置,自動采集網(wǎng)絡設備運行數(shù)據(jù)并存于SQL Server數(shù)據(jù)庫,通過對數(shù)據(jù)進行不同的處理以滿足如觸發(fā)報警事件和展現(xiàn)多種形式數(shù)據(jù)的要求。
2.3.3 數(shù)據(jù)展現(xiàn)模塊功能
該模塊主要包含單個網(wǎng)絡設備狀態(tài)查詢、所有被采集設備每日數(shù)據(jù)采樣一覽、歷史監(jiān)測數(shù)據(jù)分析等界面;界面主要以圖形化形式展示網(wǎng)絡設備、服務器等運行情況。
3 系統(tǒng)實現(xiàn)
3.1 實現(xiàn)平臺
本系統(tǒng)基于微軟.NET平臺開發(fā),優(yōu)勢在于基于Windows系統(tǒng)的服務器、PC設備已有成熟的基于.NET的WMI API,開發(fā)時只需要引入System.Management命名空間,主要使用到的類為;對于非Windows系統(tǒng)平臺的網(wǎng)絡設備,本系統(tǒng)引入了目前使用較為廣泛且開源的SnmpSharpNet包[4]進行基于SNMP協(xié)議的開發(fā)。
3.2 軟件主要實體類結(jié)構(gòu)及關(guān)系
軟件所設計實體,如圖2所示,Device類作為Router類、Server類和Computer類的抽象父類, 各個具體設備實體類包含獲取各設備基本信息的屬性或方法。如Server類具有獲取各個進程(ProcessStat)和硬盤(DiskStat)信息的相關(guān)方法,Router類具有獲取網(wǎng)絡(NetworkStat)相關(guān)信息的方法,這些信息都會包含在具體數(shù)據(jù)結(jié)構(gòu)中。最后的工具類(WMI+SnmpService)將負責具體連接設備并獲取相應指定信息。
3.3 關(guān)鍵技術(shù)實現(xiàn)
通過WMI和SNMP方式采集網(wǎng)絡設備數(shù)據(jù)過程比較相似且獲取進程數(shù)據(jù)較為復雜,因此,以下實現(xiàn)關(guān)鍵技術(shù)的代碼將以獲取進程信息為例,獲取其他信息可仿照以下代碼。
3.3.1 WMI和SNMP連接及執(zhí)行查詢語句代碼
①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服務發(fā)起一個請求,獲取該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系統(tǒng)的MIB庫為例,因此采用了MIB中hrSWRunPerfCPU 的cputime作為計算單個進程cpu占用率的參數(shù)。以間隔一定時間分兩次獲取各進程(hrSWRunPerfCPU:cputime)數(shù)據(jù),第一個參數(shù)為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