整个核心致力于单一流程

akp*_*akp 49 c linux cpu scheduling linux-kernel

在Linux中是否有任何方法可以将一个CPU内核分配给特定的给定进程,并且不应该在此内核上安排任何其他进程或中断处理程序?

我已经阅读了Linux 绑定进程中使用taskset实用程序对CPU的进程关联,但这并没有解决我的问题,因为它只是试图将给定的进程关注到该核心,但是可能可以在此核心上安排其他进程,这是我想避免的.

我们应该更改内核代码以进行调度吗?

gby*_*gby 61

就在这里.事实上,有两种不同的方法可以做到这一点:-)

现在,实现目标的最佳方法是执行以下操作:

  1. 在引导期间从引导加载程序将参数isolcpus = [cpu_number]添加到Linux内核命令行.这将指示Linux调度程序不在该CPU上运行任何常规任务,除非使用cpu affinity特别请求.

  2. 使用IRQ亲和性设置其他CPU来处理所有中断,以便隔离的CPU不会收到任何中断.

  3. 使用CPU关联性将特定任务修复到隔离的CPU.

这将为您提供Linux在CPU隔离方面所能提供的最佳功能,而无需使用树外和开发中的补丁.

你的任务仍然会得到从时间的Linux代码中断时,包括其他的任务 - 如定时器节拍中断和调度程序代码,从的IPI其它CPU之类的东西的工作队列内核线程,虽然中断应该是相当小.

有关(几乎)完整的中断源列表,请访问我的页面https://github.com/gby/linux/wiki

另一种方法是使用cpusets这是方式更优雅和动感,但在这个时间点(无例如定时器的迁移)的一些弱点遭受这让我推荐老,原油,但有效isolcpus参数.

请注意,Linux社区目前正在开展工作以解决所有这些问题,并提供更多隔离.

  • @CedomirSegulja我相信它虽然差异随着时间的推移而缩小.例如,如果内核模块在CPU上注册了一个定时器并且该定时器是自注册的(例如,它在过去时再次注册),那么目前没有简单的方法可以将它从想要的专用CPU上移除.使用isolcpus,首先注册这样一个计时器的可能性要低得多. (3认同)
  • 即使提供了--kthread = on选项,isolcpus提供比cpusets更好的隔离仍然是真的吗? (2认同)

lou*_*xiu 6

Redhat文章谈论它.它修改了引导参数isolcpus.

老的文章写由罗伯特·爱.那篇文章中有解决方案.

所有进程'子进程都接收与其父进程相同的CPU亲和力掩码.

然后,我们需要做的就是将init绑定到一个处理器.所有其他进程本质上是init作为进程树的根,因此所有进程的超级表面,然后同样绑定到一个处理器.

  • 此链接需要Redhat订阅.你能发布一下它的内容吗? (2认同)

Vas*_*asu 5

将整个CPU核心专用于特定程序

虽然taskset允许将特定程序分配给某些CPU,但这并不意味着不会在这些CPU上安排其他程序或进程.如果要防止这种情况并将整个CPU内核专用于特定程序,可以使用"isolcpus"内核参数,该参数允许您在引导期间保留CPU内核.

在引导期间或GRUB配置文件中将内核参数"isolcpus ="添加到引导加载程序.然后Linux调度程序不会在保留的CPU核心上安排任何常规进程,除非特别请求使用taskset.例如,要保留CPU核心0和1,请添加"isolcpus = 0,1"内核参数.在启动时,然后使用taskset将保留的CPU内核安全地分配给您的程序.

来源(S)

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html


Ser*_*lov 0

根据文档

Linux 调度程序将遵循给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行。

没有提到将给予特定的处理器来专门处理。