获取线程的CPU使用率

3
我有一组占用CPU较多的执行操作,每个操作都在低优先级线程中运行。这些线程将在一个进程(例如IIS)中运行,该进程有许多其他线程,我不希望它们变慢。我想计算所有其他线程的CPU使用率,如果大于50%,则暂停其中一个线程;如果小于50%,则恢复一个已暂停的操作。
暂停时,我会保存执行状态到数据库,并终止其线程;恢复时,我会启动新线程。
我需要一个函数返回线程的CPU使用率百分比。
private static void monitorRuns(object state)
{
  Process p = Process.GetCurrentProcess;
  double usage = 0;
  foreach(ProcessThread t in p.Threads)
  {
    if(!myThreadIds.Contains(t.Id)) // I have saved my own Thread Ids
    {
      usage += getUsingPercentage(t); // I need a method like getUsingPercentage
    }
  }

  if(usage > 50){
    pauseFirst(); // saves the state of first executions and terminates its threads
  }else{
    resumeFirst(); // start new thread that executes running using a state
  }
}

这个函数是通过定时器调用的:

Timer t = new Timer(monitorRuns,null,new TimeSpan(0,0,10),new TimeSpan(0,5,0));

2
一个更好的方法是将ThreadPriority设置为Priority.Lowest; - Casperah
2
我认为让框架处理这个问题会更好。将优先级设置为低值将给其他线程优先权。 - Magnus
我已经设置了 ThreadPriority = Priority.Lowest;。仅仅设置优先级就足够了吗?我不想在服务器繁忙时减慢速度。 - mrd abd
1个回答

7

要计算进程/线程的CPU使用率,您需要获取系统/进程/线程特定时间段的处理器时间。然后,您可以计算CPU使用率,并不要忘记将该值除以CPU核心数。

ProcessWideThreadCpuUsage = (ThreadTimeDelta / CpuTimeDelta)
SystemWideThreadCpuUsage = (ThreadTimeDate / CpuTimeDelta) * ProcessCpuUsage

我在这个示例中发现了解释这种方法的内容。您可以将其作为参考阅读。


@mrdabd 好的,C# 也有类似的 API。请查看我的更新答案。 - stanleyxu2005
1
我下载了一个例子,但它无法运行。它出现了一个异常(System.ComponentModel.Win32Exception Message=Access is denied)。 - mrd abd
如果您没有分配所需的权限,您的代码将无法访问。这不是答案提供的问题,尽管如果有人找出所需的权限并编辑答案以包括它,那就太好了。 - bikeman868

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接