Whole one core dedicated to single process
在Linux中是否有任何方法可以将一个CPU内核分配给特定的给定进程,并且不应该在此内核上安排任何其他进程或中断处理程序?
我已经阅读了Linux绑定进程中使用任务集实用程序对CPU的进程关联性,但这并没有解决我的问题,因为它只是试图将给定的进程关联到该核心,但是可能可以在此核心上安排其他进程,这是 我想避免的。
我们应该更改内核代码以进行调度吗?
就在这里。事实上,有两种不同的方法可以做到这一点:-)
现在,实现目标的最佳方法是执行以下操作:
在引导期间从引导加载程序将参数isolcpus = [cpu_number]添加到Linux内核命令行。这将指示Linux调度程序不在该CPU上运行任何常规任务,除非使用cpu affinity特别请求。
使用IRQ亲和性设置其他CPU来处理所有中断,以便隔离的CPU不会收到任何中断。
使用CPU关联性将特定任务修复到隔离的CPU。
这将为您提供Linux在CPU隔离方面所能提供的最佳功能,而无需使用树外和开发中的补丁。
您的任务仍将不时被Linux代码中断,包括其他任务 - 例如计时器滴答中断和调度程序代码,来自其他CPU的IPI以及工作队列内核线程等内容,尽管中断应该非常少。
有关(几乎)完整的中断源列表,请访问我的页面https://github.com/gby/linux/wiki
另一种方法是使用cpusets,它更优雅和动态,但在这个时间点遇到一些弱点(例如没有定时器的迁移),这使我推荐旧的,粗略但有效的isolcpus参数。
请注意,Linux社区目前正在开展工作以解决所有这些问题,并提供更多隔离。
有Redhat文章谈论它。它修改了引导参数isolcpus。
罗伯特·洛夫写的一篇旧文章。那篇文章中有解决方案。
All of a process' children receive the same CPU affinity mask as their
parent.Then, all we need to do is have init bind itself to one processor.
All other processes, by nature of init being the root of the process
tree and thus the superparent of all processes, are then likewise
bound to the one processor.
将整个CPU核心专用于特定程序
虽然taskset允许将特定程序分配给某些CPU,但这并不意味着不会在这些CPU上安排其他程序或进程。如果要防止这种情况并将整个CPU内核专用于特定程序,可以使用"isolcpus"内核参数,该参数允许您在引导期间保留CPU内核。
在引导期间或GRUB配置文件中将内核参数"isolcpus ="添加到引导加载程序。然后Linux调度程序不会在保留的CPU核心上安排任何常规进程,除非特别请求使用taskset。例如,要保留CPU核心0和1,请添加"isolcpus = 0,1"内核参数。在启动时,然后使用taskset将保留的CPU内核安全地分配给您的程序。
来源(S)
即使您按照gby的答案中的步骤操作,内核任务也会在隔离的CPU核心上执行。 linux RT_PREEMPT实时项目正在进行工作以改进这一点。因此,如果您没有使用来自RP_PREEMPT的最前沿实时内核,则可能无法完全隔离CPU内核。
根据文件
The Linux scheduler will honor the given CPU affinity and the process will not run on any other CPUs.
没有提到特定处理器将被专门处理。