Linux 中有没有办法为除一个进程之外的所有进程禁用一个内核?我想只为我的进程保留一个核心。
预期行为如下:
- 将在我的进程之后生成的进程不应看到此核心并使用其他核心。
- 当我的进程产生时,所有使用这个核心的进程都应该切换到其他核心。
Linux 中有没有办法为除一个进程之外的所有进程禁用一个内核?我想只为我的进程保留一个核心。
预期行为如下:
就在这里。您想创建两个 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
您可以查看这篇lwn 文章,讨论内核解决此问题的方法。