【问题标题】:How to make cpuset.cpu_exclusive function of cpuset work correctly如何使 cpuset 的 cpuset.cpu_exclusive 功能正常工作
【发布时间】:2019-08-25 16:23:40
【问题描述】:

我正在尝试使用内核的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,我可以确认如果我不在乎cpu_exclusive,CPU 可以分配给某个进程。但是我也证明了如果不设置cpu_exclusive,同样的cpu也可以分配给其他进程。

不知道是不是因为遗漏了一些预设。

我期望的是“使用cpuset获得cpus的独占使用权”。哪位大佬能提供点线索吗?

非常感谢。

【问题讨论】:

  • 你达到你的目标了吗(使用cpuset获得cpus的独占使用)?我在Ubuntu16.04做了同样的测试,我发现仍然有一些用户进程在我想要的核心上运行隔离。我已经将这些用户进程设置为另一个 cpuset。任何提示?谢谢。

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


【解决方案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 的目标cpu。

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

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

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

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

【讨论】:

  • 感谢您的回复。请原谅我的愚蠢,也许我的情况和你遇到的不一样。根据我上面的内容,我只是使用脚本find . -name cpuset.cpu_exclusive | xargs cat 来确认是否有任何进程专门消耗 cpu 内核。它说没有过程这样做。所以我想知道有没有我没有考虑到的情况?
  • 稍微更新一下答案,请运行find . -name cpuset.cpus | xargs cat 列出你所有的cgroups目标cpu。如果它们有重叠,则不能设置 cpu_exclusive。
  • 是的,很好,它确实按照您的建议工作。感谢您解决我的困惑。但是我仍然认为在我使 my_cpusets 独占之后,cgpoup 为我修改其他 cpusets 可能是合理的。之所以这么想,是因为我看了一篇文章:kubernetes cpu-management,里面说kubelet可以让指定的pod独占一些core。再次感谢。
  • 恕我直言,我认为要求 cgroup 这样做是不合理的。如果它更改父/兄弟范围的配置,然后由于不同的应用程序/用户要求而不断更改,cgroup 子集可能会一团糟。所以我们需要像 k8s 这样的解决方案来做这件事,而 cgroup 只专注于自己的特性,在有限的范围内。
  • 这个解释很合理,我必须深入研究k8s的管理,因为我似乎没有完全理解它。再次感谢您的考虑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
相关资源
最近更新 更多