具有相同名称的所有进程的性能计数器

本文关键字:性能计数器 进程 | 更新日期: 2023-09-27 18:10:39

我目前在我的windows系统上运行nginx,我正在制作一个小控制面板来显示我的web服务器的统计数据。

我试图获得进程的CPU使用率和内存使用率的性能计数器,但nginx显示为多个进程,它可以根据配置文件中的设置从2 - 5变化。我的设置显示了两个进程,所以nginx.exe和nginx.exe

我知道要使用什么性能计数器,% Processor TimeWorking Set - Private,但我如何能够获得两个进程的单个值,以便我可以将它们加在一起以获得最终值?

我尝试使用在Waffles问题中找到的代码,但它只能输出两个进程中的第一个进程的值。

谢谢。

编辑-工作代码

for (int i = 0; i < instances.Length; i++)
                    {
                        //i = i + 1;
                        if (i == 0)
                        {
                            toPopulate = new PerformanceCounter
                                ("Process", "Working Set - Private",
                                 toImport[i].ProcessName,
                                 true);
                        }
                        else
                        {
                            toPopulate = new PerformanceCounter
                                ("Process", "Working Set - Private",
                                 toImport[i].ProcessName + "#" + i,
                                 true);
                        }
                        totalNginRam += toPopulate.NextValue();
                        instances[i] = toPopulate;
                    }

具有相同名称的所有进程的性能计数器

看看这个问题的公认答案。尝试运行perfmon。具有相同名称的进程将被标识为process#1process#2等。在您的情况下,它可以是nginx#1, nginx#2等。

编辑:

您需要将实例名传递给适当的构造函数重载或InstanceName属性。根据这一点,正确的格式似乎是使用下划线。process_1, process_2

当使用Azure Log Analytics时,您可以指定一个路径,如

Process(nginx*)'% Processor Time

这似乎是从任何时候匹配通配符模式的所有进程收集数据。我可以确认它从新进程(在更改设置后启动)中获取数据,并且不会从"死"进程中获取数据。然而,InstanceName(如nginx#3)可能会被重用,这使得很难判断一个进程何时被一个新进程"取代"。

我无法在性能监视器中做到这一点。最接近的是在"添加计数器"对话框的搜索框中输入"nginx*",然后选择<All searched instances>。这将为每个进程创建一个计数器,并且不会在进程启动或停止时动态添加或删除计数器。

也许可以通过PowerShell创建的数据收集器集来完成。然而,即使你能够在实例部分使用通配符设置路径,也不能保证它会像你期望的那样运行(即,自动从任何时候正在运行的所有进程收集数据)。