本文列举了.net利用wmi获取系统性能信息数值的方法,比如硬盘容量剩余、带宽使用等,提供了一些关于利用wmi获取系统性能信息的有益信息。文章中对获取cpu使用率没有做讲解,大家可以自行去做测试,需要交流可以来.Net超级qq群40797788交流。WMI 提供了一整套易于使用的性能计数器类。可以利用这些类来监视处理器使用情况、内存使用情况、网络连接、磁盘使用情况、Web 服务性能、服务器连接、打印机使用情况以及其他各种性能参数。
WMI提供了多种编程接口,有供C++使用的COM API,供ASP和VB使用的SCRIPT API,供.NET使用的在System.Management 中的类。它们的用法大同小异。在.NET中,也可以用System.Diagnostics命名空间下的PerformanceCounter 类 方便的枚举各种计数器,直接获取相应的信息。但是如果要在ASP中用VBScript使用性能计数器类来监视性能就没.NET中那么方便了,有一些工作还得自己来做。
首先创建与要监视的服务器之间的连接。
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _ "root\cimv2", _ strUser, _ strPassword, _ "MS_409")
其中的几个变量看名字也能知道个差不多,strComputer服务器名,strUser和strPassword是具有管理员权限的用户名和密码。这里需要注意的是如果strComputer是本地计算机,即ASP网页所在的计算机时需要有额外的设置。如果用默认的匿名用户来访问ASP页的时候无法获取正确的监视信息,这是IIS的安全性限制。可以在IIS中将访问性能计数器的ASP页面的匿名访问的用户改为具有管理员权限的用户,这样就能获取正确的监视信息了。你要是把整个目录的匿名访问改为管理员用户肯定也行,不过我想没有人会这样做吧,呵呵。还有一点需要注意的就是访问本地计算机的用户名和密码为空就可以,如果输入了用户名密码反而出错。
接下来就可以获取各种计数器来得到你想要的信息,只需要用WQL类似SQL语句的简单查询就可以。比如获取已用内存:
Set colItems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_PerfOS_Memory") For Each objItem in colItems committedBytes = objItem.CommittedBytes/1024/1024 Next
Win32_PerfRawData_PerfOS_Memory的committedBytes 属性直接得到了想要的数据。这是最简单的一种情况。有一些计数器不能直接得到想要的数据,需要相应的计算公式才能得到正确的数据。例如,获取磁盘剩余空间的百分比。
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfDisk_LogicalDisk Where Name = '_Total'") For Each objDisk in colDisks intBaseValue = objDisk.PercentFreeSpace_Base diskFreeSpacePercent = objDisk.PercentFreeSpace /intBaseValue Next
还有更复杂一些的情况。
Set colItems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_Tcpip_NetworkInterface Where Name<>'MS TCP Loopback interface'") For Each objItem in colItems CounterValue1 = objItem.BytesTotalPerSec TimeValue1 = objItem.TimeStamp_PerfTime TimeBase = objItem.Frequency_PerfTime Next Sleep(100) Set colitems = objWMIService.ExecQuery ("Select * From Win32_PerfRawData_Tcpip_NetworkInterface Where Name<>'MS TCP Loopback interface'") For Each objItem in colItems CounterValue2 = objItem.BytesTotalPerSec TimeValue2 = objItem.TimeStamp_PerfTime If TimeValue2 - TimeValue1 = 0 Then Else netWork = (CounterValue2-CounterValue1) /((TimeValue2-TimeValue1)/TimeBase) End if Next
以上这个例子是获取网络流量。sleep()是用来让程序挂起一定的时间。在VBScript中有内置的函数,但在ASP中不好用,没找到什么好的办法,只好用一个循环来占用CPU的时间。乐博网提示:用循环来占用时间是比较不理想的做法,期间可能导致进程cpu高企,乐博网提供了另外一种磨时间又不影响性能的,附在sleep过程的后面
private Sub Sleep(n) Dim timeNow timeNow = Now() While DateDiff("s", timeNow, Now()) < n/1000: Wend End Sub
乐博网提供方法:
Private Sub LOB_WaitRock(ByVal Int_MilliSecond As Integer)
Dim LOB_Watch As New Stopwatch LOB_Watch.Start() Do While LOB_Watch.ElapsedMilliseconds < Int_MilliSecond Application.DoEvents() Loop LOB_Watch.Stop()
End Sub
WMI中有很多种计数器如何来确定每个计数器属于哪一种类型,应该用什么样的公式来计算呢?当然是查MSDN了。例如要找上面的那个计数器BytesTotalPerSec ,在MSDN中搜索BytesTotalPerSec ,找到其所在的计数器类Win32_PerfRawData_Tcpip_NetworkInterface,在下面对应的属性BytesTotalPerSec 中会看到下面信息。
BytesTotalPerSec Data type: uint64 Access type: Read-only Qualifiers: DisplayName("Bytes Total/sec"), PerfDefault, CounterType(272696576), DefaultScale(-4), PerfDetail(200) 其中 CounterType(272696576)代表的计数器的类型,查找272696576,在CounterType Qualifier这章节下面能够找到 272696576 PERF_COUNTER_BULK_COUNT
PERF_COUNTER_BULK_COUNT就是该计数器所属的类型,再通过查找PERF_COUNTER_BULK_COUNT得到其相应的计算公式。
这样就能够正确地得到所有计数器的数据了。
乐博网补充:查看cpu的使用率可以调用Win32_Processor 里面有个属性LoadPercentage就是cpu使用率了,不过这个是以核心和线程统计的,如果你有双核或者四核的cpu,或者双核四线程那就要遍历获取每个核心和线程的使用率来统计了。 |