获取进程的CPU和内存使用率的正确性能计数器是什么?


67

如何使用.NET类获取特定进程的CPU内存使用情况PerformanceCounter?而且之间有什么区别

Processor\% Processor TimeProcess\% Processor Time

我对这两者有些困惑。


3
没有一种正确的方法来衡量内存使用情况。内存可以以多种不同方式使用。例如,您是否计算交换到磁盘上的内存或仅保留/已提交但尚未写入的内存,...
CodesInChaos 2011年

Answers:


122

这篇文章:

要获取整个PC的CPU和内存使用率:

using System.Diagnostics;

然后全局声明:

private PerformanceCounter theCPUCounter = 
   new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

然后,要获取CPU时间,只需调用NextValue()方法:

this.theCPUCounter.NextValue();

这将使您获得CPU使用率

至于内存的使用,我相信同样的事情适用:

private PerformanceCounter theMemCounter = 
   new PerformanceCounter("Memory", "Available MBytes");

然后,要获取内存使用情况,只需调用NextValue()方法:

this.theMemCounter.NextValue();

对于特定的进程CPU和内存使用率:

private PerformanceCounter theCPUCounter = 
   new PerformanceCounter("Process", "% Processor Time",              
   Process.GetCurrentProcess().ProcessName);

Process.GetCurrentProcess().ProcessName您希望获取有关信息的进程名称在哪里?

private PerformanceCounter theMemCounter = 
   new PerformanceCounter("Process", "Working Set",
   Process.GetCurrentProcess().ProcessName);

Process.GetCurrentProcess().ProcessName您希望获取有关信息的进程名称在哪里?

请注意,工作集本身可能不足以确定进程的内存占用量-请参阅什么是专用字节,虚拟字节,工作集?

要检索所有类别,请参阅演练:检索类别和计数器

之间的差异Processor\% Processor Time,并Process\% Processor TimeProcessor从PC本身Process是每个个体的过程。因此,处理器的处理器时间将是PC上的使用时间。进程的处理器时间将是指定的进程使用率。有关类别名称的完整说明:性能监视器计数器

使用性能计数器的替代方法

使用System.Diagnostics.Process.TotalProcessorTimeSystem.Diagnostics.ProcessThread.TotalProcessorTime属性来计算您的处理器使用率,如本文所述。


1
但是它会给出调用该函数的当前进程的CPU /内存使用情况吗?
2011年

1
如果如上所述创建CPUCounter,则会收到InvalidOPerationException:“由于从注册表中读取了无效的索引”,因此无法加载计数器名称数据。”
Ted

3
感谢您的详细回答!打电话时new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);我得到一个百分比。我应该如何解释这个百分比?这是机器上所有内核的百分比吗?
传奇

8
@Legend我的粗略测试表明,这是每个处理器上处理器使用率的总和。对于4核,PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName)最多可以400表示该进程正在使用每个CPU的100%。不幸的是,为什么在任何地方都不清楚这一点,因为必须依靠粗略的测试。这是“如何获得进程的CPU使用率”的最高投票/回答的问题。对于C#,仍然没有人提及。各种technet,msdn和msdn博客文章都有矛盾的信息,只是使其变得更加混乱。
量子

2
对于仍在此降落的任何人,我想to带@Quantic谈论计数器的值。至于详细的在这里,该Processor (% Processor Time)计数器会出100,并给在计算机中的所有处理器/核心/等总用量。但是,Processor (% Process Time)通过逻辑处理器的数量来缩放。要获得计算机的平均使用率,请将结果除以Environment.ProcessorCount
wlyles

4

Pelo Hyper-V:

private PerformanceCounter theMemCounter = new PerformanceCounter(
    "Hyper-v Dynamic Memory VM",
    "Physical Memory",
    Process.GetCurrentProcess().ProcessName); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.