确定“系统负载”

时间:2009-06-06 04:07:05

标签: windows load system

有没有人知道优先使用Windows性能计数器确定“系统负载”的方法?在这种情况下,我的意思是“系统负载”在经典(UNIX)意义上的术语而不是通常混淆的“CPU利用率”百分比。

基于我的阅读...“系统负载”通常表示为一个浮点数,定义可运行状态下的进程数(即不包括当前因某种原因被阻止的进程数)在给定的时间。维基百科在这里给出了一个很好的解释 - http://en.wikipedia.org/wiki/Load_(computing)

顺便说一下,我在C#工作,所以用这种语言的任何例子都会非常感激。

1 个答案:

答案 0 :(得分:4)

系统负载,在UNIX意义上(如果我没记错),是能够运行的进程数,这些进程实际上并不在CPU上运行(在一段时间内取平均值)。像top这样的实用程序会显示此负载,例如,最后1分钟,5分钟和15分钟。

我认为使用标准的Win32 WMI 进程类是不可能的。 WMI (ExecutionState)对象中的进程状态字段Win32_Process被记录为未使用。

但是,线程类 提供了这些信息(并且它可能是一个更好的指标,因为现代操作系统倾向于调度线程而不是进程)。 Win32_Thread类有一个ExecutionState字段,设置为以下之一:

  • 0未知
  • 1其他
  • 2 Ready
  • 3正在运行
  • 4封锁
  • 5暂停已被阻止
  • 6暂停准备

如果您要对该类进行查询并计算类型2的数量(并且可能类型为6;我认为暂停意味着在此上下文中换出),那么应该为您提供加载快照。如果你想要平均值,那么你必须自己平均。

或者,该类中也有ThreadState

  • 0已初始化(由微内核识别)。
  • 1 Ready(准备在下一个可用的处理器上运行)。
  • 2跑步(执行)。
  • 3 Standby(即将运行,一次只能有一个线程处于此状态)。
  • 4终止(已完成执行)。
  • 5等待(未准备好处理器,准备好后,将重新安排)。
  • 6转换(等待处理器以外的资源)。
  • 7未知(状态未知)。 所以你可以考虑计算状态1或3的那些。

不要问我为什么有两个显示类似信息的字段或不同之处。我早就停止了用他们的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. '