乐趣区

关于linux:白话-Linux-容器资源的隔离限制原理

作者:烧鸡太子爷

起源:恒生 LIGHT 云社区

背景

最近在给组内新人解说一些 docker 容器化,大家都可能了解,docker 容器实际上就是运行的一个过程,只不过因为 docker 帮忙咱们包装了这个过程,给这个过程加以一个可运行的微 linux 环境而已,让咱们感觉看起来 ” 像 ” 虚拟机而已。那么他是如何做到资源管制的呢,大家也都晓得是用了 namespace、cgroup。集体也比拟好奇,所以也花了一点工夫去学习了一下, 也做一些笔记,能够和大家一起学习一下

Linux namespace

Linux namespace 是一种内核级别的资源隔离机制,用来让运行在同一个操作系统上的过程相互不会烦扰。

namespace 目标就是隔离,要做到的成果是:如果某个 namespace 中有过程在外面运行,它们只能看到该 namespace 的信息,无奈看到 namespace 以外的货色。

咱们来想一下:一个过程在运行的时候,它会晓得哪些信息?

  • 看到零碎的 hostname
  • 可用的网络资源(bridge、interface、网络端口的时候状况……)
  • 过程的关系(有哪些过程,过程之间的父子关系等)、
  • 零碎的用户信息(有哪些用户、组,它们的权限是怎么样的)
  • 文件系统(有哪些可用的文件系统,应用状况)
  • IPC(怎么实现过程间通信)
  • …… 也就是说,如果要实现隔离,必须保障不同 namespace 中过程看到的下面这些货色是不同的。

如果让我来做,首先的想法是每个 namespace 都实现一整套上述资源的隔离,然而实际上 linux 的实现中,上述的所有资源都是能够独自隔离的。

目前 linux 内核次要实现了一下几种不同的资源 namespace, 官网有如下介绍:

名称 宏定义 宏定义
IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19)
Network CLONE_NEWNET network device interfaces, IPv4 and IPv6 protocol stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc (since Linux 2.6.24)
Mount CLONE_NEWNS Mount points (since Linux 2.4.19)
PID CLONE_NEWPID Process IDs (since Linux 2.6.24)
User CLONE_NEWUSER User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8)
UTS CLONE_NEWUSER Hostname and NIS domain name (since Linux 2.6.19)
Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6)

这些 namespace 基本上笼罩了一个程序运行所需的环境,保障运行在的隔离的 namespace 中的,会让程序不会受到其余收到 namespace 程序的烦扰。但不是所有的系统资源都能隔离,工夫就是个例外,没有对应的 namespace,因而同一台 Linux 启动的容器工夫都是雷同的。

然而 Namespace 解决的问题次要是环境隔离的问题,这只是虚拟化中最最根底的一步,咱们还须要解决对计算机资源应用上的隔离。也就是说,尽管你通过 Namespace 把我加到一个特定的环境中去了,然而我在其中的过程应用用 CPU、内存、磁盘等这些计算资源其实还是能够得心应手的。所以,咱们心愿对过程进行资源利用上的限度或管制。这就是 Linux CGroup 进去了的起因。

Linux cgroup

Linux CGroup 全称 Linux Control Group,是 Linux 内核的一个性能,用来限度,管制与拆散一个过程组群的资源(如 CPU、内存、磁盘输入输出等)。

Linux CGroupCgroup 可让您为零碎中所运行工作(过程)的用户定义组群分配资源 — 比方 CPU 工夫、零碎内存、网络带宽或者这些资源的组合。您能够监控您配置的 cgroup,回绝 cgroup 拜访某些资源,甚至在运行的零碎中动静配置您的 cgroup。

它次要提供了如下性能:

  • Resource limitation: 限度资源应用,比方内存应用下限以及文件系统的缓存限度。
  • Prioritization: 优先级管制,比方:CPU 利用和磁盘 IO 吞吐。
  • Accounting: 一些审计或一些统计,次要目标是为了计费。
  • Control: 挂起过程,复原执行过程。应用 cgroup,系统管理员可更具体地管制对系统资源的调配、优先程序、回绝、治理和监控。可更好地依据工作和用户调配硬件资源,进步总体效率。

cgroups 的作用:

  • 资源限度
    cgroups 能够对工作应用的资源(内存,CPU,磁盘等资源)总额进行限度。如 设定利用运行时应用的内存下限,一旦超过配额就收回 OOM 提醒
  • 优先级调配
    通过调配的 CPU 工夫片数量以及磁盘 IO 带宽大小,实际上就相当于管制了工作运行的优先级
  • 资源统计
    cgroups 能够统计零碎的资源使用量 如 CPU 应用时长,内存用量等,这个性能十分实用于计费
  • 工作管制
    cgroups 能够对工作进行挂起、复原等操作

总结

Docker 容器的实质是宿主机上的一个过程。Docker 通过 namespace 实现了资源隔离,通过 cgroups 实现了资源限度。namespace 技术实际上批改了利用过程对待整个计算机“视图”,即它的“眼帘”被操作系统做了限度,只能“看到”默写指定的内容,而这个过程可能应用的资源量,则受 cgroup 配置的限度,但对于宿主机来说,这些被隔离和限度了的过程和其余过程并没有太大的区别。

另外,namespace 和 cgroup 尽管曾经做的很好了,然而他们还是有很多不欠缺的中央,比方做不到工夫的隔离,比方 /proc 文件系统的问题,这些前面有工夫也能够和大家一起讨论一下,本章不做具体的介绍了。

退出移动版