一个核心专用于我的流程 [英] One core exclusively for my process

查看:37
本文介绍了一个核心专用于我的流程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能的重复:
如何设置特定 pthread 的 CPU 亲和性?

在 Linux 中有没有办法为除一个进程之外的所有进程禁用一个内核?我想只保留一个内核,并且只用于我的进程.

Is there a way in Linux to disable one core for all processes except one process? I would like to have one core reserved only and only for my process.

预期行为如下:

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

推荐答案

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

Yes, there is. You want to create two cpusets, one with your isolated CPU and the other with all the rest of the CPUs. Assign your special process to the isolated cpuset and all the rest of the processes to the other cpuset.

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

Here is a simple example script that will do it:

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然后去:

Now start your process and find out its PID and go:

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

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

If you want to revert these changes, just restart your system or do:

# 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

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

There are also more complicated shell wrappers that can help you automate this, such as cset. See: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

这篇关于一个核心专用于我的流程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆