1

我正在尝试在长时间运行的过程中衡量 CPU 利用率水平。我怀疑每次我运行 task-manager 来查看数据时,进程的 CPU 利用率都会下降,因为 taskmanager 具有更高的优先级。如果我给我的进程 RealTime 优先级,那么任务管理器会完全锁定,我无法使用它。我希望我的大部分 CPU 周期都专用于这个过程,并且我想大致了解它的使用量。我不需要逐秒监控,只需要一些快照让我知道发生了什么。我怎样才能做到这一点?

4

5 回答 5

1

可能是 procdump - 但sysinternals 流程工具之一应该会有所帮助

于 2010-11-05T19:36:29.313 回答
1

通过 C API 以编程方式,您可以使用性能计数器 API。(CPU 使用率只是另一个计数器)。您可以使用低级注册表 API 来查询性能计数器的数据。或者您可以使用PDH API (Performance Data Helper API) - 这可能是您想要的。我过去都用过,PDH api很容易使用。

另一个帮助您枚举可用计数器名称的工具是 perfmon。(只需运行 c:\windows\system32\perfmon.exe)。它也是任务管理器的有用替代品。它还进行日志记录和图表。您可以为多进程机器上的每个逻辑处理器设置计数器。

于 2010-11-06T22:31:01.143 回答
0

我不确定您对任务管理器的担忧是否有效。任务管理器足够轻巧,不会淹没您长时间运行的进程并窃取足够的 CPU 周期。如果您的进程确实需要 CPU,您将在任务管理器中看到它。如果您的进程没有看到预期的 CPU 使用率,那么您认为进程需要一段时间的假设可能是错误的,因为它使用了很多 CPU。也许您长时间运行的进程运行时间很长,因为它的 IO 绑定或等待事件或睡眠很多。即除了使用 CPU 之外的其他事情。如果它使用了很多 CPU 但不是 100%,因为我上面列出的相同原因,它可能不如它可能的效率高。

于 2010-11-05T19:56:36.187 回答
0

您可以编写一个简单的工具,通过GetProcessTimes查询该特定进程(例如,通过 id)

行中的一些东西:

main()
  HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
  for(;;) { 
    GetProcessTimes(h, /*..times.. */);
    printf("time taken %d\n", (kerneltime+usertime));
    Sleep(1000);
  }
于 2010-11-06T21:03:33.870 回答
0

@martin Becket:procmon 可让您在特定进程的属性中查看详细的 cpu 使用情况

于 2010-11-10T11:18:31.260 回答