Windows 确定“;系统负载”;

Windows 确定“;系统负载”;,windows,load,system,Windows,Load,System,是否有人知道一种优雅的方法来确定“系统负载”,最好使用Windows性能计数器?在本例中,我指的是经典(UNIX)意义上的“系统负载”,而不是通常混淆的“CPU利用率”百分比 根据我的阅读,“系统负载”通常表示为一个浮点,定义在给定时间可以运行的处于可运行状态的进程数(即不包括当前由于某种原因被阻止的进程数)。维基百科在这里给出了一个很好的解释- 顺便说一句,我是用C语言工作的,所以任何用这种语言的例子都将不胜感激 系统负载,在UNIX意义上(如果我没记错的话),是能够运行的进程的数量,而这些进

是否有人知道一种优雅的方法来确定“系统负载”,最好使用Windows性能计数器?在本例中,我指的是经典(UNIX)意义上的“系统负载”,而不是通常混淆的“CPU利用率”百分比

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


顺便说一句,我是用C语言工作的,所以任何用这种语言的例子都将不胜感激

系统负载,在UNIX意义上(如果我没记错的话),是能够运行的进程的数量,而这些进程实际上不是在CPU上运行的(在一段时间内的平均值)。类似于
top
的实用程序显示了过去1、5和15分钟的负载

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

然而,thread类确实提供了这些信息(这可能是一个更好的指标,因为现代操作系统倾向于调度线程而不是进程)。
Win32\u Thread
类有一个
ExecutionState
字段,该字段设置为以下字段之一:

  • 0未知
  • 1其他
  • 2准备好了吗
  • 3运行
  • 4阻塞
  • 5.暂停开放
  • 6暂停准备就绪
如果要对该类执行查询,并计算类型2(可能还有类型6;我认为挂起意味着在此上下文中被交换)的数量,那么应该会得到负载快照。如果你想要平均值,你就必须自己平均

或者,该类中还有一个
ThreadState

  • 0已初始化(由微核识别)
  • 1就绪(准备在下一个可用处理器上运行)
  • 2正在运行(正在执行)
  • 3备用(即将运行,一次只能有一个线程处于此状态)
  • 4终止(已完成执行)
  • 5等待(处理器未准备就绪,准备就绪后将重新安排)
  • 6转换(等待处理器以外的资源)
  • 7未知(状态未知)。 所以你可以考虑把那些处于状态1或状态3的人计算在内
不要问我为什么有两个字段显示相似的信息,或者有什么区别。我早就不再用他们的WMI信息来猜测微软了,我只需要说服他们我的选择是可行的:-)

在为我们自己的监控应用程序开发完Windows客户端之后,我建议使用1秒快照,并在需要报告的任何时间范围内平均这些快照。VBScript和WMI看起来非常有弹性,即使每秒查询一次—它似乎不会占用太多CPU,而且只要您释放所有使用的内容,就可以运行更长的时间

因此,每一秒钟,您都会做一些类似的事情(在VBScript中,并且从内存中,因为我无法从这里访问代码):


这个问题可能会在他特别要求C时得到更好的回答,所以正确的地点也是如此。谢谢你的回答,这很有帮助。但是,我有一个后续问题,如果我正确地回忆起使用系统显示时的负载,例如“top”表示浮点值(即1.35或5.45)。在您的示例中,您只能得到系统负载的整数。知道分数是从哪里来的吗?没关系。。。我愚蠢的。。。这些值是1、5和15分钟内的平均值。出于某种原因,我一直认为第一个值实际上是一个时间点,而不是一段时间内的平均值。
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. '