![perfmon-利用最大 CPU 的单线程-如何检测?](https://linux22.com/image/729706/perfmon-%E5%88%A9%E7%94%A8%E6%9C%80%E5%A4%A7%20CPU%20%E7%9A%84%E5%8D%95%E7%BA%BF%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%EF%BC%9F.png)
我是一名 Windows 服务器管理员。我的部分工作是维护服务器并对监控警报做出反应,这些警报通常与高 CPU 负载有关。有时,某些应用程序或进程会陷入无限循环或类似情况,并且只使用一个内核/线程,但占用了 100% 的 CPU,因此在 4 核系统上,总 CPU 使用率为 25%,并且不会触发任何警报,尽管我想知道是否会发生这种情况。我正在考虑检测这种情况的方法。仅将阈值设置为 25% 的 CPU 使用率是行不通的,因为系统上运行的所有进程的总和很容易超过 25%,但这无法检测只有一个进程/线程对此负责的情况。我发现,在性能监视器中,我可以添加 \Process(进程名称)\% Processor Time,如果单个进程以最大负载运行,并且在 core i7 上的任务管理器中显示 12%(例如,您可以通过使用 LameXP 重新编码 MP3 来测试它),此计数器将显示 100,因此这有效并且可以检测到此类进程。问题是它只对设置计数器时已经存在的进程起作用。即使您使用所有实例并启动它,它也不会显示新启动的进程,这是一个问题。是否有其他性能计数器或实用程序可以显示这种情况?
例如,如果我编码一些大型 WAV 文件,我可以设置 lxp_lame.exe 的亲和性,使其不使用所有核心,而只使用一个核心,然后是的 - 此 powershell 代码片段将显示该核心的 100。如果我不这样做,该过程会在核心之间跳转,并且永远不会有任何高数字。
答案1
使用 WMI 处理器性能计数器。排除带有 的计数器_Total
,因为它们会平均负载。
Get-WMIObject -Class Win32_PerfFormattedData_Counters_ProcessorInformation |
Where-Object {$_.Name -notmatch "total"} |
Select-Object -Property Name,PercentIdleTime,PercentProcessorTime
你会看到类似这样的内容:
Name PercentIdleTime PercentProcessorTime
---- --------------- --------------------
0,0 100 0
0,1 95 4
0,2 100 0
0,3 89 10
我将把生成警报的任务留给你。