简化背景:
我的应用程序运行了很多任务。其中大部分是CPU密集型的。
一个任务(实际上是一个在循环中运行的单个线程,监听来自网络的数据包),非常“实时”。更有趣的是,该线程是使用pinvoke
调用的本地代码。
问题:
当有大量流量显示时,任务正在努力工作,所有核心都达到了最大值。当发生这种情况时,“实时”线程(在100% CPU核心上运行),开始丢失数据包,因为它没有足够的CPU时间。
问题:
是否可能以某种方式“保留”一个核心供“实时”线程使用,并将所有其他线程(任务)限制在其他核心上?
- 当然,还有其他正在运行的进程,也会消耗CPU时间,但让我们假设它们只消耗很少而且恒定的资源。
- 这是一个真正的问题,可以通过“增加更多的CPU”来解决......不是一个选项......
编辑 - 回答许多有用的评论:
- 我们使用WinPcap捕获所有数据包,这可能是很多(很多)。
- “实时”线程并不是真正的“实时”(我认为“实时”是针对进程的 - 在.net中,ThreadPriority使用“Normal”,“AboveNormal”等)
- “实时”线程按顺序调用WinPcap,一个数据包接一个数据包。我们怀疑由于它被饥饿到足够程度,它无法跟上,因此WinPcap的缓冲区溢出了。