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
重新分配给受限制的cpu0only
cgroup。
一种可能的替代方法是创建一个要运行的用户,myprocessname
并且该用户的所有进程都不受限制,而其他所有内容均受限制。但是,在我的实际用例中,该进程需要由root运行,并且还有其他一些必须由root运行的进程也应该受到限制。
如何使用cgroups完成此操作?
如果cgroups无法做到这一点(我现在怀疑是这种情况),我对局部解决方案的想法是否正确,它们是否可以按照我的想法工作?
*免责声明:这可能不是一个最小的代码示例;我不了解所有部分,所以我不知道哪些部分不是必需的。