1

我正在尝试使用内核cpuset来隔离我的进程。为了获得这个,我按照内核文档cpusets的说明( 2.1 Basic Usage ) ,但是,它在我的环境中不起作用。

我在我的 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。谷歌它,但是,我无法得到正确的答案。

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

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

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

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

非常感谢。

4

1 回答 1

3

我相信这是对 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 个 cpus,如果你想设置cpu_exclusivemy_cpuset你需要仔细修改所有其他 cgroup 以使用 cpus,例如。0-7,然后将 cpu of 设置my_cpuset为 8-11。在所有这些 cpus 配置之后,您可以将cpu_exclusive设置为 1。

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

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

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

于 2019-04-29T14:04:19.520 回答