【问题标题】:How to measure CPU use of a specific logical thread?如何测量特定逻辑线程的 CPU 使用率?
【发布时间】:2011-12-13 09:26:01
【问题描述】:

(这与我通常问的基本编程问题无关!)

我们有一个有趣的问题。我们有一个多线程的非可视化服务器应用程序(每个进程运行 10-20 个工作线程),它使用大量 CPU。这是设计使然。

我们无法在开发人员系统上分析此代码的真实工作负载。工作量是高度(非常高度)多样化的。为了优化此代码,我们需要能够让生产位记录哪些工作作业占用了多少 CPU。

我们当前的实现使用 System.Diagnostics.ProcessThread.TotalProcessorTime 进行测量,但在 .NET v4 中并不能保证逻辑 .NET 线程与 ProcessThread 的亲和性,因此我们无法确定我们正在测量的究竟是什么.

我们可以做些什么来衡量每个线程/每个函数的 CPU 使用率?

我们听说线程的备用库是一种方法,有什么建议吗?

【问题讨论】:

  • 您能否使用生产系统重现此服务器的工作负载,也许是在非工作时间?在这种情况下,您应该使用附加到生产系统的分析器,而不是尝试创建自己的轮子。
  • 约翰——如果可以的话,我们会的!我们真的做不到。我们需要在生产过程中进行测量。
  • 在试验设置之后,也许您仍然可以使用分析器。

标签: c# .net


【解决方案1】:

ProcessThread 和 Thread 之间的分离可以追溯到 .NET 2.0。受到 SQL Server 团队内部计划使用纤程实现 .NET 线程的项目的启发。这个项目被放弃了,没有已知的 CLR 主机不使用操作系统线程(又名 ProcessThread)来实现 .NET 线程。

您将遇到的唯一问题是将 ProcessThread 与 .NET 线程匹配。这在 .NET 2.0 中故意变得困难。唯一体面的方法是让线程本身 pinvoke GetCurrentThreadId(),然后找到与 ProcessThread.Id 的匹配项。一旦你到了那里,你也可以pinvoke GetThreadTimes()。这也需要 OpenThread() 获取句柄和 CloseHandle() 再次关闭它。访问 pinvoke.net 以获取声明。

【讨论】:

  • 那么,说线程使用ProcessThread是实现细节对吗?不保证将来会这样,但现在正好是这样?
  • SQL Server 项目是一个相当大的失败,微软不会再试一次了。最好的证据是他们在过去的 7 年里没有。但是,您不会得到保证。您最好让工具供应商来处理。
  • 正是我的猜测。感谢那! (我总是听到“没有保证”的部分,但至少有时也能了解实现细节是件好事!)
  • 汉斯,我们会试试你的提议!
  • Hans,所以这意味着使用 System.Diagnostics.ProcessThread.TotalProcessorTime 是一种有效的方法,对吧?这种方法缺乏保证,但听起来它正在做与您的提案相同的事情,是吗?
猜你喜欢
  • 2021-02-02
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2021-12-17
相关资源
最近更新 更多