一个核心专门用于我的流程

时间:2012-01-30 22:54:31

标签: linux process core affinity

  

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

Linux中是否有办法为除一个进程以外的所有进程禁用一个核心?我想只保留一个核心,仅用于我的流程。

预期行为如下:

  1. 在我的流程之后产生的流程,不应该看到这个核心并使用其他核心。
  2. 当我的进程产生时,所有使用此核心的进程都应该切换到其他核心。

2 个答案:

答案 0 :(得分:46)

是的,有。您想要创建两个cpusets,一个使用隔离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

答案 1 :(得分:8)

您可以查看此lwn article,以了解此问题的内核解决方案。