如何让cpuset的cpuset.cpu_exclusive功能正常运行

How to make cpuset.cpu_exclusive function of cpuset work correctly

我正在尝试使用内核的 cpuset 来隔离我的进程。为此,我按照内核文档 cpusets 中的说明(2.1 基本用法)进行操作,但是,它在我的环境中不起作用。

我在我的 centos7 服务器和我的 ubuntu16.04 工作电脑上都试过了,但都没有用。

  1. centos内核版本:
[root@node ~]# uname -r
3.10.0-327.el7.x86_64
  1. ubuntu内核版本:
4.15.0-46-generic

我试过的如下

root@Latitude:/sys/fs/cgroup/cpuset# pwd
/sys/fs/cgroup/cpuset
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpus
0-3
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mems
0
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpu_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mem_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# find . -name cpuset.cpu_excl
usive | xargs cat
0
0
0
0
0
1
root@Latitude:/sys/fs/cgroup/cpuset# mkdir my_cpuset
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpus
root@Latitude:/sys/fs/cgroup/cpuset# echo 0 > my_cpuset/cpuset.mems
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpu_exclusive
bash: echo: write error: Invalid argument
root@Latitude:/sys/fs/cgroup/cpuset#

它只是打印了错误 bash: echo: write error: Invalid argument。 Google 但是,我无法得到正确答案。

正如我上面粘贴的那样,在我操作之前,我确认cpuset根路径已经启用了cpu_exclusive功能并且所有cpu都没有被其他子cpuset排除。

通过使用 ps -o pid,psr,comm -p $PID,我可以确认如果我不关心的话可以将 cpus 分配给某个进程 cpu_exclusive。但是我也已经证明,如果不设置cpu_exclusive,同一个cpu也可以分配给其他进程

不知道是不是少了一些预设

我的预期是 "using cpuset to obtain exclusive use of cpus"。有大佬能给点线索吗?

非常感谢。

我认为这是对 cpu_exclusive 标志的误解,就像我一样。这是文档 https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt,引用:

If a cpuset is cpu or mem exclusive, no other cpuset, other than
a direct ancestor or descendant, may share any of the same CPUs or
Memory Nodes.

所以你有 bash: echo: write error: Invalid argument 的一个可能原因是你启用了一些其他 cgroup cpuset,它与你对 echo 1 > my_cpuset/cpuset.cpu_exclusive

的操作冲突

请 运行 find . -name cpuset.cpus | xargs cat 列出所有 cgroup 的目标 cpu。

假设你有12个cpu,如果你想设置cpu_exclusivemy_cpuset,你需要仔细修改所有的其他 cgroup 使用 cpus,例如。 0-7,然后将 my_cpuset 的 cpu 设置为 8-11。在所有这些cpus配置之后,你可以设置cpu_exclusive为1.

但是,其他进程仍然可以使用cpu8-11。只有属于其他cgroups的任务不会使用cpu 8-11

对我来说,我有一些 docker 容器 运行ning,这使我无法设置 cpuset cpu_exclusive

对于内核文档,我不认为 cgroup 本身可以专门使用 cpus。一种方法(我知道这种方法在生产中 运行ning)是我们隔离 cpus,并由我们自己管理 cpu affinity/cpuset