如何使用cgroup将除白名单以外的所有进程限制为单个CPU?


26

Red Hat有一个关于cgroups指南,可能对您有所帮助(但不能回答这个问题)。

我知道如何在启动该进程的命令期间通过以下方式将特定进程限制为特定的CPU:

首先,将以下*放入/etc/cgconfig.conf

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

然后启动一个进程,并使用以下命令将其专门分配给该cgroup:

cgexec -g cpuset:cpu0only myprocessname

我可以通过以下方式自动限制特定进程名称的所有实例(我认为这是正确的)/etc/cgrules.conf

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

我的问题是:我该怎么办的反向

换句话说,如何将除一组特定的白名单进程及其子进程以外的所有进程分配给受限制的cgroup?


根据我研究过,但还没有测试,我相信,一个局部的解决办法是:

添加一个“不受限制的” cgroup:

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

将我的进程显式分配给不受限制的组,并将其他所有内容分配给受限制的组:

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

但是,对此的警告似乎是(通过阅读文档,而不是通过测试,而不是测试,所以有些麻烦),将的孩子myprocessname重新分配给受限制的cpu0onlycgroup。

一种可能的替代方法是创建一个要运行的用户,myprocessname并且该用户的所有进程都不受限制,而其他所有内容均受限制。但是,在我的实际用例中,该进程需要由root运行,并且还有其他一些必须由root运行的进程也应该受到限制。

如何使用cgroups完成此操作?


如果cgroups无法做到这一点(我现在怀疑是这种情况),我对局部解决方案的想法是否正确,它们是否可以按照我的想法工作?

*免责声明:这可能不是一个最小的代码示例;我不了解所有部分,所以我不知道哪些部分不是必需的。

Answers:


30

更新:请注意,以下答案适用于RHEL6。在RHEL 7中,大多数cgroup由systemd管理,而libcgroup已弃用。


自发布此问题以来,我已经研究了上面链接的整个指南以及大部分cgroups.txt文档和cpusets.txt。我现在比了解cgroup知识要多得多,因此在这里我将回答我自己的问题。

您可以采用多种方法。我们公司在Red Hat的联系人(技术架构师)建议不要对所有流程进行全面限制,而应采用更具声明性的方法,即仅限制我们特别希望限制的流程。根据他关于该主题的陈述,这样做的原因是,系统调用可能依赖于用户空间代码(例如LVM进程),如果受限制,则可能会使系统变慢,这与预期的效果相反。因此,我最终限制了几个专门命名的过程,而将其他所有问题都搁置了下来。

另外,我想提及我提出问题时缺少的一些cgroup基本数据


Cgroup 依赖于libcgroup安装。 但是,这是一组用于自动处理cgroup配置和对cgroup的进程分配的工具,可能会很有帮助。

我发现libcgroup工具也可能会产生误导,因为libcgroup软件包是基于它自己的一组有关使用cgroup的抽象和假设构建的,这些抽象和假设与cgroup的实际内核级实现略有不同。(我可以举一些例子,但这需要一些工作;如果您有兴趣,请发表评论。)

因此,使用工具libcgroup之前(如/etc/cgconfig.conf/etc/cgrules.confcgexeccgcreatecgclassify,等等)我高度建议得到非常熟悉的/cgroup虚拟文件系统本身,和手动创建的cgroup,cgroup中的层次结构(包括与多个子系统层级连接,其libcgroup悄悄和leakily摘要远),通过运行echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks,以及在幕后执行的其他看似神奇的任务将进程重新分配给不同的cgroup libcgroup


另一个基本的概念,我缺少的是,如果/cgroup虚拟文件系统在所有安装在系统上(或者更准确地说,如果有该cgroup子系统又名“控制器”被安装在所有的),那么每一个你的整个系统的过程一个cgroup。 没有“ cgroup中有某些进程,而cgroup中没有某些进程”之类的东西。

给定层次结构有一个所谓的 cgroup,它拥有所连接子系统的所有系统资源。例如,一个具有cpuset和blkio子系统连接的cgroup层次结构,将具有一个根cgroup,它将拥有系统上的所有 cpus和系统上的所有blkio,并且可以与 cgroup 共享其中的某些资源。您不能限制根cgroup,因为它拥有系统的所有资源,因此限制它甚至没有任何意义。


我缺少有关libcgroup的其他一些简单数据:

如果使用/etc/cgconfig.conf,则应确保将chkconfig --list cgconfigcgconfig设置为在系统引导时运行。

如果您进行更改/etc/cgconfig.conf,则需要运行service cgconfig restart以加载更改。(而且cgclear在愚弄测试时,停止服务或运行的问题很常见。例如,对于调试,我建议使用lsof /cgroup/cpusetif cpuset作为您正在使用的cgroup层次结构的名称。)

如果要使用/etc/cgrules.conf,则需要确保“ cgroup rules engine daemon”(cgrulesengd)正在运行:service cgred startchkconfig cgred on。(并且您应该知道与该服务有关的可能但不太可能出现的竞争情况,如《Red Hat资源管理指南》第2.8.1节在页面底部所述。)

如果您想手动操作并使用虚拟文件系统(我建议首次使用)设置cgroup,可以这样做,然后创建一个cgconfig.conf文件以使用cgsnapshot其各种选项来镜像您的设置。


最后,当我编写以下内容时,我缺少了关键信息:

但是,对此的警告似乎是... myprocessname的子级将被重新分配给受限制的cpu0only cgroup。

我是正确的,但是有一个我不知道的选项。

cgexec 是用于启动进程/运行命令并将其分配给cgroup的命令。

cgclassify 是用于将已经运行的进程分配给cgroup的命令。

这两个都将防止cgredcgrulesengd)将基于的指定进程重新分配给另一个cgroup /etc/cgrules.conf

二者cgexeccgclassify支持--sticky标志,它附加地防止cgred从重新分配进程基于/etc/cgrules.conf


因此,我写的问题的答案(尽管不是我最终实现的设置,因为上面提到的红帽技术架构师的建议):

按照我的问题中的说明制作cpu0onlyanycpucgroup。(确保cgconfig设置为在引导时运行。)

* cpuset cpu0only按照我的问题所述制定规则。(并确保cgred设置为在引导时运行。)

开始我想任何进程无限制使用:cgexec -g cpuset:anycpu --sticky myprocessname

这些进程将不受限制,并且其所有子进程也将不受限制。 系统上的其他所有内容都将限制为CPU 0(重新启动后,因为cgred除非将egrule更改为已运行的进程,否则它们将不会应用于已运行的进程,除非它们更改了EUID)。这不是完全可取的,但这是我最初要求的,可以使用cgroups来完成。


哇。凉。怎么有0票?
mikeserv '16

@mikeserv,谢谢。:)回答您的问题:检查日期;我昨天才写这个答案。
通配符

1
我看见了。但那是24小时前 可能是它的原因很长。好东西有时会被这样忽略。而且,无论如何,很快获得大量投票的答案很少是好答案-如果已经有很多人知道的话,信息就不会那么有用。不过,这是一个不错的选择。cgroup是神秘的。
mikeserv '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.