title: Performance counter CPU usage for current process is more than 100
body: <p>I want to display CPU usage for my multithread application (working over multicore processor). I want to receive numbers close to Task manager's. But I got numbers more than 100%. Even more than 500%. Yes, I know, than counter <strong>"% Processor Time"</strong> for category <strong>"Process"</strong> I need to divide into <strong>Environment.ProcessorCount</strong> or <strong>"NumberOfLogicalProcessors"</strong> (same for my configuration). And 500% is a result <em>after</em> this operation. I tested this example on different computers with different hardware (i7, i5, Core2) and software configurations (Windows 7 SP1 with all updates, Windows 2008 R2 SP1 with all updates) and got same problem. </p>
  
  <pre><code>public static class SystemInfo
  {
      private static Process _thisProc;
      private static bool HasData = false;
      private static PerformanceCounter _processTimeCounter;
  
      private static void Init()
      {
          if (HasData)
              return;
  
          if (CheckForPerformanceCounterCategoryExist("Process"))
          {
              _processTimeCounter = new PerformanceCounter();
              _processTimeCounter.CategoryName = "Process";
              _processTimeCounter.CounterName = "% Processor Time";
              _processTimeCounter.InstanceName = FindInstanceName("Process");
              _processTimeCounter.NextValue();
          }
  
          MaximumCpuUsageForCurrentProcess = 0;
          HasData = true;
      }
  
      private static bool CheckForPerformanceCounterCategoryExist(string categoryName)
      {
          return PerformanceCounterCategory.Exists(categoryName);
      }
  
      public static string FindInstanceName(string categoryName)
      {
          string result = String.Empty;
          _thisProc = Process.GetCurrentProcess();
  
          if (!ReferenceEquals(_thisProc, null))
          {
              if (!String.IsNullOrEmpty(categoryName))
              {
                  if (CheckForPerformanceCounterCategoryExist(categoryName))
                  {
                      PerformanceCounterCategory category = new PerformanceCounterCategory(categoryName);
                      string[] instances = category.GetInstanceNames();
                      string processName = _thisProc.ProcessName;
  
                      if (instances != null)
                      {
                          foreach (string instance in instances)
                          {
                              if (instance.ToLower().Equals(processName.ToLower()))
                              {
                                  result = instance;
                                  break;
                              }
                          }
                      }
                  }
              }
          }
          return result;
      }
  
      public static int CpuUsageForCurrentProcess
      {
          get
          {
              Init();
  
              if (!ReferenceEquals(_processTimeCounter, null))
              {
                  int result = (int) _processTimeCounter.NextValue();
                  result /= Environment.ProcessorCount; //NumberOfLogicalProcessors //same for me
  
                  if (MaximumCpuUsageForCurrentProcess &lt; result)
                      MaximumCpuUsageForCurrentProcess = result;
  
                  return result;
              }
              return 0;
          }
      }
  
      public static int MaximumCpuUsageForCurrentProcess { private set; get; }
  }
  </code></pre>
  
  <p>and code to execute (you need to create windows forms application with two labeles, one BackgroundWorker and one button)</p>
  
  <pre><code>    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
      {
          IList&lt;Task&gt; tasks = new List&lt;Task&gt;();
          for (int i = 0; i &lt; 10; i++)
          {
              Task t = new Task(() =&gt;
              {
                  do {
                      if (backgroundWorker1.CancellationPending)
                          break;
                  } while (true);
              });
              t.Start();
              tasks.Add(t);
          }
  
          Task displayProgress = new Task(() =&gt; { do {
                                                      if (backgroundWorker1.CancellationPending)
                                                          break;
                                                      backgroundWorker1.ReportProgress(1);
                                                      Thread.Sleep(10);
                                                  } while (true); });
          displayProgress.Start();
          tasks.Add(displayProgress);
  
          Task.WaitAll(tasks.ToArray());
      }
  
      private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
          label1.Text = SystemInfo.CpuUsageForCurrentProcess.ToString();
          label2.Text = SystemInfo.MaximumCpuUsageForCurrentProcess.ToString();
      }
  
      private void button1_Click(object sender, EventArgs e)
      {
          label1.Text = SystemInfo.CpuUsageForCurrentProcess.ToString();
  
          if (backgroundWorker1.IsBusy)
              backgroundWorker1.CancelAsync();
          else
              backgroundWorker1.RunWorkerAsync();
      }
  </code></pre>
  
  <p>Please show me my error. And yes, I read <a href="http://blogs.msdn.com/b/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx">this article</a> and noticed that </p>
  
  <blockquote>
    <p>“\Process(…)\% Processor Time” can go up to N*100 (where N is the number of CPUs) because it adds up the CPU usage of the requested process across all the CPUs.</p>
  </blockquote>