本篇文章来介绍《在没有 WMI 的 windows 中查找 MaxNumberOfProcesses》,涉及到,有需要的可以收藏一下
问题内容
我们的监控解决方案目前使用 wmi 来实现一些指标,但是当负载不足时,wmi 的表现非常糟糕,并且经常无法及时返回,从而导致大量关于各种离线或缺失指标的错误警报。
通过调用 psapi.h、sysinfoapi.h 等中的 windows 函数来替换 wmi 查询已经解决了其中的大部分问题,并且返回速度提高了大约 100 倍,但是我无法找到一种方法来获取 wmi 查询的等效值win32_operatingsystem.maxnumberofprocesses
windows 文档中的定义如下:
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 的情况下检索此值,我们将不胜感激。
解决方案
您可以使用 cim_operatingsystem 类 cim(通用信息模型)https://learn.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;
};
如果机器上进程数不限制maxnumberofprocesses为0
关于wmi和cim之间的关系见Https://www.red-gate.com/simple-talk/sysadmin/powershell/powershell-day-to-day-admin-tasks-wmi,-cim-and-pswa/
通用信息模型
命名空间:https://wutils.com/wmi/root/cimv2/properties/maxnumberofprocesses.html