我们继续研究cgroups。 在Red Hat Enterprise Linux 7中,默认情况下启用了这些功能,因为它使用systemd,而他又已经内置了cgroup。 使用Red Hat,Red Hat Enterprise Linux 6有所不同。 实际上,cgroups控制器最初是存在的,但此版本已发布,回想起是在2010年1月,也就是说,就计算机时代而言,是两个世纪前。

但是,即使在今天,红帽企业版Linux 6中的cgroup仍具有强大的功能,我们将在今天进行说明。
让我们使用一个完全基于真实事件的纯假设示例来分析Red Hat Enterprise Linux 6中cgroup的功能。 但是对于初学者而言,按照传统,这是一个小题外话。
IT安全从来没有像现在这样多。 毫不奇怪,因为今天不仅所有计算机和电话都连接到网络,而且冰箱,吸尘器和许多其他东西都已连接-网络威胁的范围简直是巨大的。 通常,与这些威胁的斗争将立即在所有方面开始。 快速安装安全补丁? 是的,绝对可以! 加强系统安全性-防火墙,SELinux,智能身份验证,仅此而已? 当然可以! Linux机器上的防病毒扫描程序? 好吧,怎么说...
在Linux机器上,防病毒扫描程序有时弊大于利。 但是,安全卫士有其自身的原因,并且经常要求您定期运行防病毒扫描,而没有从技术角度真正考虑其安全性。 这是一个必须忍受的现实,几乎所有IT专家迟早都会面对这一现实。
第二点是,Red Hat Enterprise Linux 7当然是时尚,先进和酷炫的,但是许多人仍在使用Red Hat Enterprise Linux 6,并且不认为会拒绝它。 实际上,这就是人们选择Red Hat的原因-您可以坐在同一版本上很多年,但仍然拥有所有最新的补丁程序,更新和支持。
让我们回到示例中。想象一下,有个叫杰里的家伙。 Jerry在一个大型办公室工作,负责Red Hat Enterprise Linux 6服务器,他对它们的工作方式完全满意,并且不需要新的问题和麻烦。
但是随后,安全部门的负责人决定,在他的所有服务器上都需要放置一个名为ScanIT的东西。 而且由于该设备将定期检查磁盘和内存中是否存在病毒和其他恶意软件,因此它需要完全的root用户访问权限。
杰里叹了口气,放下吉他,然后将ScanIT放在测试机上。 很快,事实证明:
- 在执行防病毒扫描时,scanit(这是启动该过程的脚本)会耗尽它可以达到的所有处理器时间。 而且这非常严重地影响了测试机的工作-一旦Jerry甚至无法通过ssh达到它。
- 此外,scanit进程会不时地吞噬内存,就像吞噬内存一样。 结果, OOM Killer唤醒并开始杀死除scanit本身以外的所有进程。
通常,需要为此做些事情。
杰瑞(Jerry)拾起吉他,弹奏《感恩的死者》(Grateful Dead),开始思考。 很快,他突然想到,来自Red Hat Enterprise Linux 7的相同cgroup可能会在这里有所帮助,一个名叫Alex的朋友在耳边嗡嗡作响。 杰里(Jerry)再次放下吉他,开始着手阅读Alex
在红帽企业Linux 6上发送的扩展坞。 事实证明,他需要的第一件事是libcgroup。
测试机器上没有libcgroup,因此Jerry开始安装它:
此外,Jerry还包括永久性cgroup的两个必需的服务:
- cgconfig-提供或多或少的简单接口来处理cgroup树。 Jerry当然可以手动安装和配置cgroup,但是为什么可以节省时间呢?
- cgred-这是一个cgroup规则引擎:进程启动时,此服务将根据指定的规则将其放入一个或另一个cgroup中。
安装并配置了所有这些功能之后,Jerry最终可以直接直接解决问题。 在仔细考虑之后,他做出了以下决定:
- scanit及其子进程应消耗不超过20%的CPU资源。 实际上,即使在多核计算机上,一个处理器核的资源甚至更少-最多不超过20%。 在cgroups中,这是使用CPU配额完成的。
- 至于内存,scanit及其子进程应占用不超过512 MB的系统内存。 如果它们越线,系统应杀死它们,而不是其他任何进程。
无需告诉我该怎么办!
杰瑞将不得不处理两组配置文件:
- /etc/cgconfig.conf-安装libcgroup时自动生成。
- /etc/cgrules.conf-包含一组规则集规则,根据这些规则集,cgred将按cgroups组对正在运行的进程进行排序。
这是默认的cgconfig.conf文件的样子:
杰里本可以直接对他进行必要的更改,但是最好使用嵌入式conf文件。 如何运作? 如果将(扩展名:drop-in-drop)放入扩展名为.conf的任何文件/etc/cgconfig.d中,系统将对其进行处理并对配置进行适当的更改。 这很方便,因为您可以创建用于不同任务的插件,并使用最喜欢的工具从配置中添加或删除它们(例如Ansible,好吧,它仍然是Red Hat博客)。
Jerry首先为CPU创建一个插入文件:
我们看看这里有什么以及它是如何工作的。
group关键字只是设置新cgroup的名称,在本例中为scanit。 在花括号内,我们指定要使用的cgroup控件。 在这里,它们cpu.cfs_period_us和cpu.cfs_quota_us允许您在完全公平的调度程序中设置相应的限制,该调度程序是Red Hat Enterprise Linux 6中默认使用的内核调度程序。
6 :
换句话说,Jerry在他的插件中写道:“对于与名为scanit的cgroup相关的每个进程,每秒检查一次分配给它的CPU资源量。 如果该组中所有进程的总处理器时间超过200,000毫秒,则完全停止为这些进程提供处理器时间。” 好吧,就是要分配给scanit cgroup-group中的所有进程及其子进程,总共不超过处理器时间的20%。
重新启动cgconfig后,服务器将更新配置,如果您进入文件系统,我们将看到scanit现在位于CPU控制器目录中:
当然,这很好,但是我们仍然需要以某种方式将scanit自身推入该cgroup中。 Crged派上用场了,默认情况下,它看起来像这样:
使用此文件或多或少容易。 但是,为此,我们将必须直接编辑cgrules.conf文件,因为此处不支持插入机制。 我们指出拥有该进程的用户或组,以及特定进程(如果需要)的名称,以及自定义控制器和cgroup目标组。
在我们的示例中,我们使用的脚本也称为scanit,而不是真正的防病毒扫描程序scanit,但实际上只是模拟负载。 没有cgroup,一切看起来像这样:
CPU已被完全占用,主要由用户空间和一部分系统占用。
杰里es了一下胡子。 它启动vi,并使用一根食指进行一些更改,然后重新启动cgred守护程序:
然后,它手动启动scanit ...:
还有-干杯! 胜利的
如您所见,我们的负载模拟进程(scanits的子进程)现在总共消耗了20%的CPU资源,主要是在用户空间和少量系统中。 因此,该死的杀毒软件将不再使汽车充满精神错乱。
还记得下一步吗?
杰瑞对成功感到高兴,几乎忘了他的记忆。 但是后来他仍然记得并再次启动vi来修复他的配置文件。
现在他添加了两个有关内存的设置:
- Memory.limit_in_bytes-最大 scanit cgroup中所有进程可以使用的RAM数量。 并排除交换空间。 Jerry将其限制为256 MB
- Memory.memsw.limit_in_bytes-最大 RAM容量,加上交换文件中的空间,总共可以分配给scanit cgroup-group中的所有进程。 如果超过此阈值,则OOM杀手将杀死进程。 Jerry将其设置为512 MB。
哦,不! 怎么了
杰瑞(Jerry)在顶部查看,发现scanit子进程仍在运行。 由于此cgroup当前正在使用中,因此Jerry无法启动该服务。 因此,它会手动终止子进程并重新启动此类服务。
现在在cgred.conf中进行一些编辑:
为了进行检查,Jerry一次运行了几个scanit任务,这样OOM杀手肯定会工作。
然后,Jerry查看了系统日志并满意地点头-scanit不再留下任何数量的内存而不受惩罚。
我们希望我们的cgroups系列文章可以帮助您了解它的含义,如何在Red Hat Enterprise Linux 7中使用它们,如何在Red Hat Enterprise Linux 6中创建它们以及如何在您的环境中使用它们。