gpt4 book ai didi

windows - 确定 “System Load”

转载 作者:可可西里 更新时间:2023-11-01 09:22:32 29 4
gpt4 key购买 nike

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

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

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

最佳答案

系统负载,在 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 Running(执行)。
  • 3 待机(即将运行,同一时间只有一个线程可能处于此状态)。
  • 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. '

关于windows - 确定 “System Load”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/958967/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com