为资源而战,第1部分:Cgroup的基础

计算机是硬件。 今天,我们回到了起点,从某种意义上说,现在您几乎找不到执行单个任务的物理主机。 即使服务器上仅运行一个应用程序,它也很可能由多个进程,容器甚至虚拟机(VM)组成,并且它们都在同一服务器上运行。 在这种情况下,红帽企业Linux 7很好地应对了系统资源的分配,但是默认情况下,它的行为就像一个善良的祖母,用自制的蛋糕对待她的孙子,并说:“每个人平等,每个人平等。”



从理论上讲,“均等划分”的原则当然很漂亮,但是在实践中,某些进程,容器或VM比其他进程更重要,因此应该得到更多。

Linux长期以来一直具有资源管理工具(nice,ulimit等),但是随着Red Hat Enterprise Linux 7和systemd的出现,我们终于在OS本身中内置了一套强大的此类工具。 事实是systemd的关键组件是现成的,定制的cgroup集,它们在OS级别上得到了充分利用。

那么,这些是什么样的cgroup,资源或性能管理又去了哪里?

内核级别控制


从2008年1月发布的2.6.24版本开始,出现了Linux内核,该内核最初是由Google在Google上以“进程容器”的名称发明和创建的,在Linux中它被称为“控制组”,缩写为cgroups。 简而言之,cgroups是一种内核机制,可让您在进程集合级别限制使用,保留记录并隔离系统资源(CPU,内存,磁盘I / O,网络等)的消耗。 Cgroup还可以冻结进程以进行检查和重新启动。 Cgroups控制器最初出现在Red Hat Enterprise Linux的版本6中,但在那里必须手动配置。 但是随着Red Hat Enterprise Linux 7和systemd的出现,预配置的cgroup组与操作系统捆绑在一起。

所有这些都在操作系统的内核级别上起作用,因此可以保证对每个进程的严格控制。 因此,对于任何恶意软件而言,现在都很难加载系统,使其停止响应并冻结。 当然,尽管可以直接访问硬件(例如,驱动程序)的错误代码仍然可以做到这一点。 同时,Red Hat Enterprise Linux 7提供了一个与cgroup进行交互的接口,与它们进行的所有工作主要是通过systemd命令完成的。

你这小菜一碟


下图让人想起一个扇形的饼图,显示了默认情况下在Red Hat Enterprise Linux 7服务器上的三个cgroup:系统,用户和计算机。 这些组中的每一个都称为“切片”(切片扇区)。 如您在图中所看到的,每个切片可以具有子切片扇区。 并且,就像蛋糕一样,所有切片总共提供100%的相应资源。



现在让我们以处理器资源为例,看看几个cgroup概念。

上图显示,处理器时间在三个上层切片(系统,用户和计算机)之间平均分配。 但这仅在负载下发生。 如果“用户”片中的某个进程要求100%的处理器资源,而此时没有其他人需要这些资源,则它将获得所有100%的处理器时间。

三个顶级切片中的每个切片都是针对其工作负载类型而设计的,该工作负荷在父切片中切片子扇区:

  • 系统 -守护程序和服务。
  • 用户 -用户会话。 每个用户都会收到一个子切片,并且具有相同UID的所有会话都将“存活”在同一切片中,因此,特别聪明的wiseacres无法获得超出其应有资源的资源。
  • 机器 -虚拟机,例如KVM guest虚拟机。

另外,所谓的“球”(共享)概念用于控制资源的使用。 球是相对数值参数; 仅与同一个cgroup中包含的其他球的值相比,它的值才有意义。 默认情况下,所有片都具有等于1024的球。在上图中的System片中,对于httpd,sshd,crond和gdm,CPU球设置为1024。System,User和Machine片的球值也为1024。这有点令人困惑吗? 实际上,这可以表示为树:

  • 系统-1024
    • httpd-1024
    • SSHD-1024
    • crond-1024
    • gdm-1024
  • 用户-1024
    • bash(mrichter)-1024
    • bash(dorf)-1024
  • 机器-1024
    • 测试机-1024

在此列表中,我们有几个正在运行的守护程序,几个用户和一个虚拟机。 现在想象一下,它们都同时请求可以获得的所有处理器时间。

总结:

  • Slice系统接收33.333%的处理器时间,并在四个恶魔之间平均分配,这给每个恶魔提供了8.25%的CPU资源。
  • 用户切片获得33.333%的处理器时间,并在两个用户之间共享,每个用户拥有16.5%的CPU资源。 如果用户mrichter注销或停止所有正在运行的进程,则dorf将有权访问33%的CPU资源。
  • Slice Machine获得了33.333%的处理器时间。 如果关闭VM或将其置于空闲模式,则系统和用户片将获得大约50%的CPU资源,然后将在其子片之间共享这些资源。

此外,对于任何守护程序,用户或虚拟机,您不仅可以输入相对的,而且可以绝对限制处理器时间的消耗,不仅可以限制一个处理器,还可以限制多个处理器。 例如,用户切片mrichter具有CPUQuota属性。 如果将其设置为20%,则mrichter在任何情况下都不会获得一个CPU的20%以上的资源。 在多核服务器上,CPUQuota可以超过100%,以便片可以使用一个以上处理器的资源。 例如,在CPUQuota = 200%的情况下,片可以完全利用两个处理器内核。 重要的是要了解CPUQuota不会保留,换句话说,它不能保证给定的百分比的处理器时间用于任何系统负载-考虑到所有其他片和设置,这只是可以分配给片的最大值。

充分扭转!


如何更改切片设置?

为此,每个切片都具有自定义属性。 由于它是Linux,因此我们可以在配置文件中手动写入设置,也可以从命令行进行设置。

在第二种情况下,使用systemctl set-property命令。 如果您键入以下命令,则在屏幕上将发生以下情况:在末尾添加切片的名称(在我们的示例中为User),然后按Tab键显示选项:



并非此屏幕快照中的所有属性都是cgroup设置。 我们主要对从块,CPU和内存开始的内容感兴趣。

如果您不喜欢命令行,而是喜欢配置文件(例如,用于在多个主机上进行自动部署),那么您将不得不处理/ etc / systemd / system文件夹中的文件。 这些文件是在使用systemctl命令设置属性时自动创建的,但是它们也可以在文本编辑器中创建,通过Puppet标记或什至由脚本即时生成。

因此,使用cgroups的基本概念,一切都应该清楚。 下次,我们将介绍一些方案,并查看某些属性的更改如何影响性能。

从字面上看,明天,我们邀请所有人参加俄罗斯红帽论坛2018-将有机会直接向红帽工程师提问。

我们的“资源之战”系列中的其他cgroup帖子可在以下位置找到:

Source: https://habr.com/ru/post/zh-CN423051/


All Articles