我们将继续研究Red Hat Enterprise Linux 7中的控制组(Cgroup)。让我们来照顾内存。
您还记得处理器时间分配有两项调整:用于设置相对份额的CPUShares和CPUQuota,以便以处理器时间的绝对值(百分比)限制用户,服务或虚拟机(VM)。 而且,这两个调整都可以同时使用。 例如,如果用户的CPU配额为50%,则将考虑他的CPU球,直到他在处理器时间的50%完全选择其配额为止。

对于RAM,systemd仅提供一种调整方式,即...
可以分配给用户或服务的内存量。 假设我们想将用户限制为200 MB RAM。 如果您还记得,它的UID是1000,因此我们输入以下命令:
systemctl设置属性用户1000.slice MemoryLimit = 200M
现在,mrichter想要检查其限制并启动压力测试实用程序压力,该压力开始大量消耗内存。 压力很快就会产生错误:
根据系统日志,压力只是被OOM(内存不足)杀手打断了。
这里重要的是要注意这一点:默认情况下,RAM限制仅适用于驻留内存。 也就是说,如果进程可以转到交换文件(“交换”),那么它将绕过已建立的限制。 在我们的示例中,压力崩溃了,因为它超出了驻留内存的限制。
如果我们不希望程序合并到交换中?
通常,这很容易禁止。 好吧,还是比较容易的……通常,您必须爬到某个地方。
有些cgroup设置无法通过systemctl命令或单元文件来访问。 但是,可以通过/ sys / fs / cgroup /文件夹中的文件即时更改这些设置。 例如,这是用户mrichter的crich在内存中的样子:
负责交换的内存大小的文件很明显称为memory.swappiness。 让我们看看里面是什么:
如果您碰巧使用了内核设置和swap子系统,那么您将立即在此处看到swappiness参数的标准默认值。 如果将其更改为零,则用户mrichter的RAM控制器通常会禁止他使用交换。
顺便说一句,在这里您可以查看用户mrichter的内存统计信息:
boundary_memory_limit参数的值与我们使用systemctl命令指定的MemoryLimit相同。 hierarchical_memsw_limit参数表示总限制(驻留内存和文件文件中的内存)。 我们阻止了用户mrichter使用页面文件,因此此参数的值太奇怪了。
现在介绍一下刚才描述的方法的问题:
- 仅当mrichter用户登录系统时,才能对这些文件进行更改。 在他登录之前,他的cgroup将处于非活动状态。
- 重新启动后不会保存这些设置。 此外,如果富人移居他们,他们将会丢失。
pam_exec脚本将有助于解决这些问题(
有关详细信息,请参阅
access.redhat.com/solutions/46199 )。
这是我们将在/ usr / local / bin文件夹中创建的脚本:
然后将其调用添加到/etc/pam.d/sshd的最后一行。 结果,该脚本将在用户每次通过ssh登录时运行。 这就是为什么我们在更改设置之前在脚本中验证这是用户mrichter的原因。
因此,我们从页面文件中切断了用户mrichter。
当然,您可以走得更远,并即时更改活动cgroup的配置文件,但现在我们将推迟这一有风险的业务。 但是,您已经掌握了更改用户设置的一般方法。
借助服务,它仍然更加容易。 在服务单元文件中,可以使用ExecStartPost =指令来运行更改设置的脚本。 例如,以下是更改foo服务单元文件以关闭交换的方法:
运行foo-并且没有交换:
好吧,对于今天来说,这种萨满教对我们来说已经足够了。
但是在结束之前,让我们先介绍一下cgroup文档,您可以在其中找到有关所有这些隐藏的调节器设置的信息。 您可以像从rhel-7-server-rpms存储库中下载内核软件包那样,在您的计算机上安装kernel-doc软件包。
安装后,打开与您的内核相对应的/ usr / share / docs文件夹,然后转到cgroups文件夹,其中包含有关所有调节器的最新信息。
下次我们将讨论I / O。 顺便说一下,我们几乎已经发现cgroups是如何导致容器出现的(实际上,cgroups是Red Hat Enterprise Linux和Red Hat OpenShift Container Platform中容器的关键组件)。