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

时间:2011-10-08 00:18:17

标签: c# memory-management cpu process performancecounter

我目前正在Windows系统上运行nginx,并且正在制作一个小控制面板来显示我的网络服务器的统计信息。

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

我知道要使用哪些性能计数器,% Processor TimeWorking Set - Private但是我如何才能获得两个进程的各个值,以便我可以将它们一起添加到最终值?

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

感谢。

编辑 - 工作代码

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;
                    }

2 个答案:

答案 0 :(得分:1)

查看该问题的已接受答案。尝试运行perfmon。具有相同名称的流程将被标识为process#1process#2等。在您的情况下,它可以是nginx#1nginx#2等。

编辑:

您需要将实例名称传递给相应的constructor overloadInstanceName属性。根据{{​​3}},看起来正确的格式是使用下划线。所以,process_1process_2

答案 1 :(得分:0)

使用Azure Log Analytics时,您可以指定路径,例如

Process(nginx*)\% Processor Time

这似乎是随时从与通配符模式匹配的所有进程中收集数据。我可以确认它从新进程(更改设置后开始)中拾取数据,并且不从“死”进程中拾取数据。但是,InstanceName(例如nginx#3)可能会被重用,这使得分辨一个进程何时被新进程“替换”变得很困难。

我无法在Performance Monitor中执行此操作。最接近的是在“添加计数器”对话框的搜索框中键入“ nginx *”,然后选择<All searched instances>。这将为每个进程创建一个计数器,并且在进程启动或停止时不会动态添加或删除计数器。

也许可以通过PowerShell创建的数据收集器集来完成。但是,即使您能够在实例部分中设置带有通配符的路径,也不能保证其行为符合预期(即,从随时运行的所有进程中自动收集数据)。