有没有人知道优先使用Windows性能计数器确定“系统负载”的方法?在这种情况下,我的意思是“系统负载”在经典(UNIX)意义上的术语而不是通常混淆的“CPU利用率”百分比。
基于我的阅读...“系统负载”通常表示为一个浮点数,定义可运行状态下的进程数(即不包括当前因某种原因被阻止的进程数)在给定的时间。维基百科在这里给出了一个很好的解释 - http://en.wikipedia.org/wiki/Load_(computing)。
顺便说一下,我在C#工作,所以用这种语言的任何例子都会非常感激。
答案 0 :(得分:4)
系统负载,在UNIX意义上(如果我没记错),是能够运行的进程数,这些进程实际上并不在CPU上运行(在一段时间内取平均值)。像top
这样的实用程序会显示此负载,例如,最后1分钟,5分钟和15分钟。
我认为使用标准的Win32 WMI 进程类是不可能的。 WMI (ExecutionState)
对象中的进程状态字段Win32_Process
被记录为未使用。
但是,线程类 提供了这些信息(并且它可能是一个更好的指标,因为现代操作系统倾向于调度线程而不是进程)。 Win32_Thread
类有一个ExecutionState
字段,设置为以下之一:
如果您要对该类进行查询并计算类型2的数量(并且可能类型为6;我认为暂停意味着在此上下文中换出),那么应该为您提供加载快照。如果你想要平均值,那么你必须自己平均。
或者,该类中也有ThreadState
:
不要问我为什么有两个显示类似信息的字段或不同之处。我早就停止了用他们的WMI信息来猜测微软,我只需要说服我的选择是可行的: - )
刚刚为我们自己的监控应用程序开发了一个Windows客户端,我建议您在需要报告的任何时间范围内进行1秒快照并对其进行平均。 VBScript和WMI即使在每秒一次查询时也显得非常有弹性 - 它似乎不会吸收过多的CPU,并且只要你释放所有使用的内容,就可以运行很长一段时间。
所以,每一秒,你都会做类似的事情(在VBScript和内存中,因为我没有从这里开始访问代码):
set objWmi = GetObject("winmgmts:\\.\root\cimv2")
set threadList = objWmi.ExecQuery("select * from Win32_Thread",,48)
sysLoad = 0
for each objThread in threadList
if objThread.ThreadState = 1 or objThread.ThreadState = 3 then
sysLoad = sysLoad + 1
end if
next
' sysLoad now contains number of threads waiting for a CPU. '