如何使cpuset的cpuset.cpu_exclusive功能正常工作

时间:2019-04-04 02:33:35

标签: linux-kernel ubuntu-16.04 centos7 cgroups cpuset

我正在尝试使用内核的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功能,并且所有cpus未被其他子cpuset排除。

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

我不知道是不是因为缺少一些预设。

我期望的是“使用cpuset获得cpus的独占使用”。谁能提供任何线索?

非常感谢。

1 个答案:

答案 0 :(得分:1)

我相信这是对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的目标cpus。

假定您有12个cpus,如果要设置my_cpuset cpu_exclusive ,则需要仔细修改所有其他cgroup以使用cpus。 0-7,然后将my_cpuset的cpus设置为8-11。完成所有这些cpus配置后,您可以将 cpu_exclusive 设置为1。

但是,其他进程仍然可以使用CPU 8-11。仅属于其他cgroups 的任务将不使用CPU 8-11

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

使用内核文档,我认为cgroup本身不可能单独使用cpus。一种方法(我知道这种方法正在生产中运行)是我们隔离cpus,并由我们自己管理cpu关联性/ cpuset