【问题标题】:Find MaxNumberOfProcesses in Windows without WMI在没有 WMI 的 Windows 中查找 MaxNumberOfProcesses
【发布时间】:2021-04-16 22:12:21
【问题描述】:

我们的监控解决方案目前使用 WMI 来处理它的一些指标,但是当负载不足时,WMI 表现非常糟糕并且经常无法及时返回,从而导致大量关于各种事物脱机或缺少指标的错误警报。

将 WMI 查询替换为调用 psapi.h、sysinfoapi.h 等中的 windows 函数已解决了其中的大部分问题,并且返回速度提高了大约 100 倍,但是我无法找到一种方法来获得 WMI 查询的等效值Win32_OperatingSystem.MaxNumberOfProcesses

windows 文档here 中的定义指出:

MaxNumberOfProcesses

Data type: uint32

Access type: Read-only

Qualifiers: MappingStrings ("MIB.IETF|HOST-RESOURCES-MIB.hrSystemMaxProcesses")

Maximum number of process contexts the operating system can support. 
The default value set by the provider is 4294967295 (0xFFFFFFFF). If there is no fixed maximum, the value should be 0 (zero). On systems that have a fixed maximum, this object can help diagnose failures that occur when the maximum is reached—if unknown, enter 4294967295 (0xFFFFFFFF).

This property is inherited from CIM_OperatingSystem.

我已经在大约 10 台不同的机器上测试了这个值,每台机器都有不同数量的 CPU 和 RAM,所有这些机器都返回了上述默认值 4294967295 (0xFFFFFFFF)。我是假设 Windows 实际上只是直接发回这个值,还是应该返回 ULONG_MAX 的值,还是有另一种方法可以找到这个值应该是什么?

我试图找出一种方法来访问 Windows 的 HOST MIB,但除了使用一些外部工具而不是直接通过代码之外,找不到任何详细信息。

我目前正在使用 GO 语言进行编程,使用 C 库。

如果有人能提供有关如何在不使用 WMI 的情况下检索此值的见解,将不胜感激。

【问题讨论】:

  • Windows 没有设置最大值,实际限制是“内存允许”。详情are here。提出了为什么这个属性甚至存在的问题,它在 unix 上确实很重要。如此简单的解决方案:查询它没有意义。
  • @HansPassant 感谢您的信息。我之前浏览过那个帖子,但是当看到查询的实际内容时它仍然没有意义,并且文档指出如果没有固定的最大值,它应该设置为 0,这显然不是案子。我想我只是假设 Windows 返回默认值,因为它是“内存允许的”。谢谢

标签: c windows go wmi


【解决方案1】:

您可以使用CIM_OperatingSystem class CIM(通用信息模型)https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/cim-operatingsystem

[Abstract, UUID("{8502C565-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class CIM_OperatingSystem : CIM_LogicalElement
{
  string   Caption;
  string   CreationClassName;
  string   CSCreationClassName;
  string   CSName;
  sint16   CurrentTimeZone;
  string   Description;
  boolean  Distributed;
  uint64   FreePhysicalMemory;
  uint64   FreeSpaceInPagingFiles;
  uint64   FreeVirtualMemory;
  datetime InstallDate;
  datetime LastBootUpTime;
  datetime LocalDateTime;
  uint32   MaxNumberOfProcesses;   <----------------------------------------
  uint64   MaxProcessMemorySize;
  string   Name;
  uint32   NumberOfLicensedUsers;
  uint32   NumberOfProcesses;
  uint32   NumberOfUsers;
  uint16   OSType;
  string   OtherTypeDescription;
  uint64   SizeStoredInPagingFiles;
  string   Status;
  uint64   TotalSwapSpaceSize;
  uint64   TotalVirtualMemorySize;
  uint64   TotalVisibleMemorySize;
  string   Version;
};

DMTF(分布式管理工作组)CIM(通用信息 Model) 类是 WMI 类所在的父类 建成。 WMI 目前仅支持 CIM 2.x 版本架构。

如果一台机器上的进程数不受限制MaxNumberOfProcesses就是0

操作系统可以支持的最大进程上下文数。如果没有固定最大值,则该值应为 0。在具有固定最大值的系统上,此对象可以帮助诊断达到最大值时发生的故障。

关于WMICIM之间的关系见https://www.red-gate.com/simple-talk/sysadmin/powershell/powershell-day-to-day-admin-tasks-wmi,-cim-and-pswa/

通用信息模型

自 PowerShell 第三版以来,一个新的模块已经 在 Windows Server 2012 和 Windows 8 中引入,称为 CIMCmdlet。添加它是为了替换旧的 WMI cmdlet。 如果您经常使用 WMI,那么您在迁移到 新的 cmdlet,因为有很多相似之处。

第一个使用的命令是Get-CimInstance:

PS&gt; Get-CimInstance -Class Win32_Process

您会注意到可以在 WMI 上发出请求 类。简单总结一下:

Get-WmiObject is replaced by Get-CimInstance
Get-WmiObject -list is replaced by Get-CimClass

让我们详细了解 CIM 提供的新功能

命名空间:https://wutils.com/wmi/root/cimv2/properties/maxnumberofprocesses.html

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2010-10-08
相关资源
最近更新 更多