为进程分配单个核心

为进程分配单个核心

我想要实现的是使用 Debian 在 Raspberry Pi 2 上在其自己的核心上运行 Python 脚本。可以使用它将taskset进程绑定到特定核心。但我需要这个核心同时不受操作系统和其他进程的负载影响。我该怎么做?

答案1

整个线程应该是有用的。

我会寻找一种方法来限制“init”进程在 CPU 1 上运行。

一般情况下,最后一句话应该是“在除 1 之外的所有 CPU 上运行”。我想人们可以使用一些内核参数irqaffinityisolcpus看起来很有希望。


编辑:

关于isolcpus内核参数文档

此选项是隔离 CPU 的首选方法。另一种方法是手动设置系统中所有任务的 CPU 掩码,这可能会导致问题并使负载平衡器性能不理想。

我做了一些测试。结果:

  • 内核参数isolcpus是您可以用来限制init进程和隔离 CPU 的参数。

  • 在我看来,内核参数irqaffinity不会影响隔离的 CPU。您可能不需要此参数。

  • 当我孤立的时候CPU0它并没有完全闲置。系统或硬件是否需要尽管隔离,但仍要进行一些计算?——我不知道。

  • 当我孤立的时候CPU1或者CPU7坚固得像一块岩石。

隔离CPU1添加isolcpus=1您的grub.cfg,如下所示:
linux /vmlinuz-(...这里是所有当前参数...)isolcpus=1


原始答案继续:

或者,在系统启动后,您可以重新分配所有当前正在运行的进程的亲和性,但这似乎不太优雅。

我同意这看起来不太优雅,但它可能工作得足够好(编辑:如上所述,它可能会导致问题和次优的负载平衡器性能)。在我的 Debian 中有一个快速而粗糙的单行代码:

sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'

我遇到了一些错误进程号s,然而htop显示一个核心在此之后实际上处于空闲状态。当然,您必须稍后运行脚本,以某种方式排除它或简单地重新分配:

taskset -a -p 1 PID

我希望您不需要重复上述一行代码来覆盖新进程,因为 CPU 亲和性是继承的。

答案2

使用包 Cpuset:

# cset shield -c 42 -k on

为你的任务保留 CPU #42(你可以保留一组 CPU),然后

# cset shield -e your_script

your_script在保留的 CPU 上启动。(另请参阅选项--user--group。)

完成后,使用以下命令释放 CPU(“重置防护罩”):

# cset shield -r

这个工具的功能还有很多。例如,将之前运行的进程附加到保留的 CPU:

# cset shield -s -p <PID> --threads

命令行帮助:

# cset help

在线帮助/教程

相关内容