我想要实现的是使用 Debian 在 Raspberry Pi 2 上在其自己的核心上运行 Python 脚本。可以使用它将taskset
进程绑定到特定核心。但我需要这个核心同时不受操作系统和其他进程的负载影响。我该怎么做?
答案1
整个线程应该是有用的。
我会寻找一种方法来限制“init”进程在 CPU 1 上运行。
一般情况下,最后一句话应该是“在除 1 之外的所有 CPU 上运行”。我想人们可以使用一些内核参数;irqaffinity
,isolcpus
看起来很有希望。
编辑:
关于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