作者:烧鸡太子爷

来历:恒生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文件体系的问题,这些后面有时刻也能够和咱们一同讨论一下,本章不做具体的介绍了。