【问题标题】:Is it possible to run code on a "reserved" cpu core?是否可以在“保留的”cpu 核心上运行代码?
【发布时间】:2014-06-07 21:02:24
【问题描述】:

简化背景:

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

问题:

当出现大量流量时,任务正在非常努力地工作,所有核心都在最大化。发生这种情况时,“实时”线程(在 100% cpu 内核上运行)开始丢弃数据包,因为它没有获得足够的 cpu 时间。

问题:

有可能以某种方式为“实时”线程“保留”一个内核,并将所有其他线程(任务)限制在其他内核上吗?

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

编辑 - 回答许多有用的 cmets:

  • 我们使用 WinPcap 来捕获所有的数据包,可以是很多(很多)。
  • “实时”线程并不是真正的“实时”(我认为“实时”适用于进程 - 在 .net ThreadPriority 中使用“正常”、“高于正常”等。)
  • “实时”线程连续调用 WinPcap,一个包接一个包。我们怀疑是因为饿得够呛,跟不上,WinPcap的缓冲区溢出了。

【问题讨论】:

  • 为什么不简单地提高“任务”的优先级?
  • 是的 - 我不明白。侦听网络数据包通常不是 CPU 密集型的。你有 100GB 的网络吗?
  • 您是否使用 UDP 或类似的协议会丢失数据包?如果是这样,提高网络线程的优先级听起来像是一个更好的选择,正如@JoachimPileborg 所建议的那样。
  • @JoachimPileborg:如果它真的是一个实时线程(在 Windows 中),那么你就不能再提高优先级了。但是,非实时线程无论如何都不会窃取核心。所以我怀疑这个错误只是线程优先级实际上不是实时的。

标签: c++ .net multithreading performance


【解决方案1】:

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

说服调度程序对关键线程进行特殊处理的另一种方法是提高其优先级。这是你应该谨慎和深思熟虑的事情。但是,这是一种更简单的方法,可以确保您的线程永远不必等待进程中的其他线程。

也许您的应用使用比处理器更少的线程会更好,但为关键工作创建一个专用线程。这样您就可以避免任何关联掩码或优先级欺骗,让系统的线程调度程序为您完成工作

【讨论】:

  • 我相信您误解了问题的确切性质,尽管您的解决方案是正确的。不是数据包侦听器线程以 100% 运行,而是数据包侦听器线程与其他任务线程共享一个核心,并且正在缺乏 CPU。因此,如您所说,将它单独放在一个核心上并让所有其他线程在所有其他核心上运行将有助于减少数据包丢失。
  • @Eight-BitGuru - 完全正确。
  • @Eight 答案描述了这样做
  • @seldary 大概也需要将网络中断处理绑定到专用内核。我不相信这样的亲和力会以积极的方式影响整体吞吐量,因为它会将应用程序其余部分可用的内核数量减少一个。如果你尝试这个,它确实提高了整体性能,我很想听听。
  • 在信号上准备就绪的线程,例如当数据可用时的网络线程,通常无论如何都会获得动态优先级提升,并且应该“立即”运行。我不相信您已经确定了丢包问题的根本原因:(
【解决方案2】:

是的。该概念称为“处理器亲和性”,存在于进程级别和线程级别。调用起来有点尴尬,但没什么可怕的:How Can I Set Processor Affinity in .NET?

请注意,您必须为您看到的所有线程设置关联。但是,您不是线程的唯一创建者 - 像 ThreadPool 和 GC 之类的东西也有一些线程。我不建议把这些搞砸是个好主意,但 ProcessThread 类不会主动阻止你这样做。

【讨论】:

  • 您将如何确保托管进程中的所有本机线程都具有必要的掩码?是否有可以在创建系统线程时订阅的通知?
  • @DavidHeffernan 不,没有这样的通知。要么代码必须在创建时执行,要么您可以定期轮询
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多