【发布时间】:2018-09-12 23:32:10
【问题描述】:
有没有办法确定给定线程在哪个 CPU 上运行? 最好在 C# 中,但 C++ 会这样做。
.NET Process 和 ProcessThread 类似乎不提供此信息。
ETA 说明:
我们正在开发一个服务器应用程序,用于处理 http 多播流并生成多个视频编码器。这在具有 12 个物理内核的系统上运行,从而产生 24 个逻辑 CPU(超线程)。通过 TaskManager 和 ProcessExplorer,我们验证了我们生成的进程均匀分布在逻辑 CPU 上。然而,我们在一个 CPU 上看到了很多(内核?)活动,这些活动通过消耗异常多的 CPU 时间而产生干扰。我们正在尝试确定哪些进程/线程正在此特定 CPU 上运行。 TaskManager 和 ProcessExplorer 似乎都没有提供该信息。如果有,请说明如何获得此类信息。
否则,我们正在考虑编写自己的工具来获取此信息。这就是我们需要帮助的地方。
我们知道如何更改线程关联性(并且我们知道无法保证线程将与任何 CPU 保持关联,尽管在这种特殊情况下,占用 CPU 的线程仍仅与一个 CPU 关联) ,但为了做到这一点,我们需要首先确定需要重定位哪个进程/线程。这是这个问题的唯一目标。
我希望这有助于澄清问题。
【问题讨论】:
-
你想用这些信息解决什么问题?
-
只有内核知道。所以你需要在内核模式下编程。在 MSDN 上查找内核 API。
-
如果一个线程在不同时间运行在许多不同的 CPU 上,你希望它做什么?
-
我们在一个有 12 个内核的系统上运行一个复杂的应用程序。出于某些原因,我们需要找出仅在一个内核上看到 CPU 使用率飙升的情况。我们想找出哪些线程(以及哪些进程或服务)正在这个特定的核心上运行。我们不知道有一种工具可以提供这些信息并考虑编写我们自己的工具。
-
无效的问题。这与哪个 CPU 无关——这与为什么这个所谓的多线程程序不使用超过一个 CPU 的原因有关。在适当的分析器中检查线程负载,您可能会发现您遇到了处理瓶颈。 Visual Studio 有用于此类分析的 ap profiler。
标签: c# c++ multithreading