是否可以在“保留”的cpu核心上运行代码?

时间:2014-04-23 07:13:22

标签: c++ .net multithreading performance

简化背景:

我的应用程序运行了很多任务。其中大多数是CPU密集型的 一个任务(实际上是一个在循环中运行的单个线程,监听来自网络的数据包),是一个非常实时的"任务。为了使它更有趣,该线程是使用pinvoke调用的本机代码。

问题:

当显示大量流量时,任务正在非常努力,并且所有核心都在最大化。当发生这种情况时,"实时"线程(在100%cpu核心上运行)开始丢弃数据包,因为它没有足够的CPU时间。

问题:

有可能以某种方式"保留"实时"实时"线程,并将所有其他线程(任务)限制到其他核心?

  • 当然,还有其他进程在运行,也占用了CPU时间,但我们假设它们消耗的资源很少且不变。
  • 这是一个真正的问题,可以通过"更多的cpu来解决这个问题" ...不是一个选项......

编辑 - 回答许多有用的评论:

  • 我们使用WinPcap捕获所有数据包,这些数据包可能很多(很多)。
  • "实时"线程不是真正的"实时" (我认为"实时"用于进程 - 在.net ThreadPriority使用"普通"," AboveNormal"等等。)
  • "实时"线程串行调用WinPcap,数据包后包。我们怀疑由于它已经足够饿,所以它并没有跟上,而且WinPcap的缓冲区已经溢出。

2 个答案:

答案 0 :(得分:2)

您可以为进程和线程指定关联掩码。这允许您阻止使用特定处理器的调度程序。因此,您可以将一个线程的线程关联掩码设置为单个处理器,并将所有其他线程的线程关联掩码设置为除保留处理器之外的所有处理器。由于.net使您无法直接创建系统线程,因此在所有系统线程上强加必要的掩码实际上并不容易。

说服调度程序为您的关键线程提供特殊处理的另一种方法是提高其优先级。这是你应该谨慎和重要的预见。但是,这是一种更简单的方法,可以确保您的线程永远不必等待进程中的其他线程。

也许你的应用程序使用比处理器更少的线程更好,但为关键工作创建一个专用线程。这样你可以避免任何亲和力掩码或优先级skullduggery并让系统的线程调度程序为你工作

答案 1 :(得分:1)

是。该概念称为处理器关联性",并且存在于进程级和线程级。调用它有点尴尬,但没什么可怕的:How Can I Set Processor Affinity in .NET?

请注意,您必须为您看到的所有线程设置亲缘关系。但是,您不是线程的唯一创建者 - 像ThreadPool和GC这样的东西也有一些线程。我并不认为混淆那些是一个好主意,但ProcessThread课程不会主动阻止你这样做。