Linux kernel 如何使cpuset.cpu_的cpuset独占功能正常工作

Linux kernel 如何使cpuset.cpu_的cpuset独占功能正常工作,linux-kernel,ubuntu-16.04,centos7,cgroups,cpuset,Linux Kernel,Ubuntu 16.04,Centos7,Cgroups,Cpuset,我试图使用内核的cpuset来隔离我的进程。为了实现这一点,我按照kerneldoc中的说明(2.1 Basic Usage)进行操作,但是,它在我的环境中不起作用 我在centos7服务器和ubuntu16.04工作pc上都试过了,但都没用 centos内核版本: ubuntu内核版本: 我所做的尝试如下 root@Latitude:/sys/fs/cgroup/cpuset# pwd /sys/fs/cgroup/cpuset root@Latitude:/sys/fs/cgroup/cpu

我试图使用内核的
cpuset
来隔离我的进程。为了实现这一点,我按照kerneldoc中的说明(2.1 Basic Usage)进行操作,但是,它在我的环境中不起作用

我在centos7服务器和ubuntu16.04工作pc上都试过了,但都没用

  • centos内核版本:
  • ubuntu内核版本:
  • 我所做的尝试如下

    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_独占功能,并且所有cpu未被其他子cpuset排除

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

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

    我所期望的是“使用cpuset获得cpu的独占使用”。有男孩能提供线索吗


    非常感谢。

    我认为这是对cpu_独占标志的错误理解,就像我所做的那样。这是文件,引述:

    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\u cpuset/cpuset.cpu\u exclusive的操作冲突

    请运行
    find-命名cpuset.cpus | xargs cat
    以列出您的cgroup的所有目标CPU

    假设您有12个cpu,如果您想将
    my\u cpuset
    cpu\u exclusive设置为使用cpu,则需要仔细修改所有其他cgroup,例如0-7,然后将
    my\u cpuset
    的cpu设置为8-11。在所有这些cpu配置之后,您可以将cpu_exclusive设置为1

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

    对我来说,我运行了一些docker容器,这使我无法设置我的cpuset
    cpu\u独占


    对于kerneldoc,我认为cgroup本身不可能完全使用cpu。一种方法(我知道这种方法正在生产中运行)是我们隔离cpu,并自行管理cpu亲缘关系/cpuset

    谢谢您的回复。请原谅我的愚蠢,也许我的处境和你遇到的不一样。根据上面的内容,我只使用脚本
    find-命名为cpuset.cpu|u exclusive | xargs cat
    ,以确认是否有任何进程专门使用cpu内核。它说没有任何过程能做到这一点。所以我想知道有没有我没有考虑到的情况?更新一下答案,请运行
    find-将cpuset.cpus命名为| xargs cat
    ,列出所有cgroup目标cpu。如果它们有重叠,您不能将cpu_设置为独占。是的,很好,它确实按照您的建议工作。谢谢你解决了我的困惑。但我仍然认为,在我将我的_cpusets设置为独占后,cgpoup为我修改其他cpusets可能是合理的。我这样想的原因是我读了一篇文章:,上面说kubelet可以让指定的吊舱消耗一些内核。再次感谢。我认为让cgroup这么做是不合理的。如果它更改父/同级作用域上的配置,那么由于不同的应用程序/用户需求而不断更改,cgroup子集可能会一团糟。所以我们需要一个像k8s这样的解决方案来做到这一点,而cgroup只是在有限的范围内关注它自己的特性。这个解释非常合理,我必须深入研究k8s管理,因为我似乎没有完全理解它。再次感谢您的考虑。您是否实现了您的目标(使用cpuset获得CPU的独占使用)?我在Ubuntu16.04中进行了相同的测试,我发现仍有一些用户进程在内核上运行,我想隔离这些进程。我已经将这些用户进程设置为另一个cpuset。有任何提示吗?谢谢。
    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#
    
    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.