如何使cpuset的cpuset.cpu_exclusive函数正常工作

问题描述 投票:0回答:1

我正在尝试使用内核的cpuset来隔离我的进程。为了实现这一点,我按照内核doc cpusets中的说明(2.1基本用法),但是,它在我的环境中不起作用。

我已经尝试过我的centos 7服务器和我的ubuntu 16.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。但谷歌,我无法得到正确的答案。

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

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

我不知道是不是因为错过了一些预设。

我所期望的是“使用cpuset获得cpus的独占使用”。 anyboy可以提供任何线索吗?

非常感谢。

linux-kernel ubuntu-16.04 centos7 cgroups cpuset
1个回答
1
投票

我相信这是对cpu_exclusive标志的误解,正如我所做的那样。这是doc 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个cpus,如果要设置my_cpuset的cpu_exclusive,则需要仔细修改所有其他cgroup以使用cpus,例如。 0-7,然后将my_cpuset的cpus设置为8-11。完成所有这些cpus配置后,您可以将cpu_exclusive设置为1。

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

对我来说,我有一些docker容器运行,这阻止我设置我的cpuset cpu_exclusive

使用内核doc,我不认为cgroup本身可以独占使用cpus。一种方法(我知道这种方法在生产上运行)是我们隔离cpus,并自己管理cpu affinity / cpuset

© www.soinside.com 2019 - 2024. All rights reserved.