【问题标题】:Determining “System Load”确定“系统负载”
【发布时间】:2010-10-31 19:59:00
【问题描述】:

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

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

顺便说一句,我正在使用 C# 工作,因此非常感谢任何使用该语言的示例。

【问题讨论】:

  • 这个问题可能在serverfault.com得到更好的回答
  • 他专门要求 C# 所以 SO 是正确的地方

标签: windows load system


【解决方案1】:

在 UNIX 意义上(如果我没记错的话),系统负载是能够运行但实际上并未在 CPU 上运行的进程数(一段时间内的平均值)。 top 之类的实用程序会在过去 1、5 和 15 分钟内显示此负载。

我认为标准的 Win32 WMI process 类不可能做到这一点。 WMI Win32_Process 对象中的进程状态字段 (ExecutionState) 记录为未使用。

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

  • 0 未知
  • 1 其他
  • 2 准备就绪
  • 3 跑步
  • 4 被阻止
  • 5 暂停被阻止
  • 6 暂停就绪

如果您要对该类进行查询并计算类型 2 的数量(可能还有类型 6;我认为在这种情况下挂起意味着换出),那应该会为您提供负载快照。如果您想要平均值,则必须自己对它们进行平均。

或者,该类中还有一个ThreadState

  • 0 已初始化(被微内核识别)。
  • 1 就绪(准备在下一个可用处理器上运行)。
  • 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. '

【讨论】:

  • Pax - 感谢您的回答,这很有帮助。但是,我确实有一个后续问题,如果我记得正确加载时显示“顶部”之类的系统表示该值作为浮点数(即 1.35 或 5.45)。在您的示例中,您只会获得系统负载的整数。知道小数值是从哪里进入 plat 的吗?
  • 没关系……我的笨蛋……这些值是 1、5 和 15 分钟的平均值。出于某种原因,我一直认为第一个值实际上是单个时间点,而不是一小段时间的平均值。
猜你喜欢
  • 2019-09-25
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2011-03-07
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多