2

我们的监控解决方案目前将 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 主机 MIB 的方法,但除了使用一些外部工具而不是直接通过代码之外,找不到任何详细信息。

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

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

4

1 回答 1

2

您可以使用CIM_OperatingSystem classCIM(通用信息模型)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(通用信息模型)类是构建 WMI 类的父类。WMI 当前仅支持 CIM 2.x 版本架构。

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

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

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

公共信息模型

从 PowerShell 的第三个版本开始,在 Windows Server 2012 和 Windows 8 中引入了一个称为 CIMCmdlets 的新模块。添加它是为了替换旧的 WMI cmdlet。如果您经常使用 WMI,那么在迁移到新的 cmdlet 时您不会迷失方向,因为它们有很多相似之处。

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

PS> 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

于 2021-01-12T08:31:41.400 回答