整个一个核心致力于单一过程
在Linux中有没有办法将一个CPU内核分配给特定的给定进程,并且不应该在此内核上安排任何其他进程或中断处理程序?
我已经阅读了使用taskset实用程序在Linux 绑定进程到CPU的过程关联性,但这并不能解决我的问题,因为它只是试图将给定的进程仿射到该内核,但可能在此内核上安排其他进程 ,这是我想避免的。
我们是否应该更改内核代码进行调度?
就在这里。 事实上,有两种独立的方式来做到这一点:-)
现在,完成你想要的最好的方法是做到以下几点:
在引导期间从引导装载程序将参数isolcpus = [cpu_number]添加到Linux内核命令行。 这将指示Linux调度程序不要在该CPU上运行任何常规任务,除非特别要求使用cpu关联。
使用IRQ亲和力来设置其他CPU来处理所有中断,以便隔离的CPU不会收到任何中断。
使用CPU关联将您的特定任务修复到隔离的CPU。
这将为您提供Linux可以提供的有关CPU隔离的最佳功能,而无需使用树外补丁和开发中补丁。
您的任务仍会不时被Linux代码中断,其中包括其他任务 - 例如计时器滴答中断和调度程序代码,来自其他CPU的IPI以及工作队列内核线程等,尽管中断应该非常小。
有关(几乎)完整的中断源列表,请访问https://github.com/gby/linux/wiki查看我的页面
另一种方法是使用cpusets,这种方式更加优雅和动态,但在这个时间点存在一些弱点(例如,没有定时器的迁移),这使我推荐旧的粗略但有效的isolcpus参数。
请注意,Linux社区目前正在开展工作,以解决所有这些问题以及更多问题,以实现更好的隔离。
有红帽文章在谈论它。 它修改引导参数isolcpus。
还有罗伯特·洛夫写的一篇旧文章。 那篇文章中有解决方案。
所有进程的孩子都会收到与其父母相同的CPU亲和力掩码。
然后,我们需要做的就是让init将自己绑定到一个处理器。 所有其他进程,init的本质是进程树的根,因此也是所有进程的超级进程,然后同样绑定到一个处理器。
将整个CPU内核专用于特定程序
虽然taskset允许将特定程序分配给某些CPU,但这并不意味着这些CPU上不会安排其他程序或进程。 如果要防止这种情况发生,并将整个CPU内核专用于某个特定程序,则可以使用“isolcpus”内核参数,该参数允许您在引导期间保留CPU内核。
在引导期间或GRUB配置文件中将内核参数“isolcpus =”添加到引导加载程序。 然后,Linux调度程序不会在预留的CPU内核上安排任何常规进程,除非特别要求使用taskset。 例如,要保留CPU内核0和1,请添加“isolcpus = 0,1”内核参数。 在引导时,然后使用taskset将保留的CPU内核安全地分配给您的程序。
来源(S)