【发布时间】: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