一个专门用于我的流程的核心[重复]

Posted

技术标签:

【中文标题】一个专门用于我的流程的核心[重复]【英文标题】:One core exclusively for my process [duplicate] 【发布时间】:2012-02-22 17:31:54 【问题描述】:

可能重复:how to set CPU affinity of a particular pthread?

在 Linux 中有没有一种方法可以为除一个进程之外的所有进程禁用一个内核?我想只为我的进程保留一个核心。

预期行为如下:

    将在我的进程之后生成的进程不应看到此核心并使用其他核心。 当我的进程生成时,所有正在使用该内核的进程都应该切换到其他内核。

【问题讨论】:

您要查找的术语是线程关联性。这是可能的,但就整体性能而言,通常比让调度程序解决它更糟糕 @awoodland:倒退。他没有要求他的进程不要使用其他内核,他要求其他进程不要使用他的内核。 在我看来,这与“如何设置特定 pthread 的 CPU 亲和性?”并不重复。我的问题的答案完全不同。请参阅下面 gby 的答案。 我认为这不是重复的,对所链接问题的答案完全没有帮助,下面的答案不仅要好得多,而且还解决了实际问题。 这个问题与 SO 上已经提出的任何问题都不是重复的,链接的问题是完全不相关的。我想知道决定关闭它的人是否甚至费心阅读它并与他们链接的内容进行比较。 【参考方案1】:

你可以看看这个lwn article,讨论这个问题的内核解决方案。

【讨论】:

【参考方案2】:

是的,有。您想创建两个 cpuset,一个与您的隔离 CPU,另一个与所有其余的 CPU。将您的特殊进程分配给隔离的 cpuset,并将所有其余进程分配给另一个 cpuset。

这是一个简单的示例脚本:

mkdir /cpuset 
mount -t cpuset none /cpuset/
cd /cpuset

mkdir sys                                   # create sub-cpuset for system processes
/bin/echo 0-2 > sys/cpuset.cpus             # assign cpus (cores) 0-2 to this set
                                            # adjust if you have more/less cores
/bin/echo 1 > sys/cpuset.cpu_exclusive
/bin/echo 0 > sys/cpuset.mems     

mkdir rt                                    # create sub-cpuset for my process
/bin/echo 3 > rt/cpuset.cpus                # assign cpu (core) 3 to this cpuset
                                            # adjust this to number of cores-1
/bin/echo 1 > rt/cpuset.cpu_exclusive
/bin/echo 0 > rt/cpuset.mems
/bin/echo 0 > rt/cpuset.sched_load_balance
/bin/echo 1 > rt/cpuset.mem_hardwall

# move all processes from the default cpuset to the sys-cpuset
for T in `cat tasks`; do echo "Moving " $T; /bin/echo $T > sys/tasks; done

现在启动你的进程并找出它的 PID 并开始:

/bin/echo $PID > /cpuset/rt/tasks

如果您想恢复这些更改,只需重新启动系统或执行以下操作:

# move tasks back from sys-cpuset to root cpuset
for T in `cat /cpuset/sys/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
# remove sys-cpuset
rmdir /cpuset/sys
# move tasks back from rt-cpuset to root cpuset
for T in `cat /cpuset/rt/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
# remove rt-cpuset
rmdir /cpuset/rt
# unmount and remove /cpuset
umount /cpuset
rmdir /cpuset

这里是手册页:http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

还有更复杂的 shell 包装器可以帮助您自动执行此操作,例如 cset。见:http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

【讨论】:

感谢您提供如此详细的描述:)我会尝试您的解决方案。 如果我想撤消这些更改,我该怎么做? SUSE 教程的链接已失效,here 是存档版本。 cset shield 非常适合我的需求。 @Kornel Szymkiewicz 我发现这个解决方案确实适用于 Ubuntu 下内核创建的线程。有什么解决方案吗?

以上是关于一个专门用于我的流程的核心[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当前用于重复代码的 Eclipse 插件

专门为 exec() 设置最大执行时间[重复]

如何将四核的 3 个核心与 Linux 隔离并专门用于 Halcon?

Python数组和列表[重复]

如何避免插入重复记录?

Node.js 核心中的承诺 [重复]