Namespace概述
Namespace 用于不同进程组之间的资源隔离,其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例。
Linux 内核中实现了六种 namespace,按照引入的先后顺序,列表如下:
namespace |
引入内核版本 |
被隔离的全局系统资源 |
在容器语境下的隔离效果 |
Mount namespaces |
文档系统挂接点 |
每个容器能看到不同的文档系统层次结构 |
|
UTS namespaces |
nodename 和 domainname |
每个容器可以有自己的 hostname 和 domainame |
|
PID namespaces |
进程 ID 数字空间 (process ID number space) |
每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。 |
|
IPC namespaces |
特定的进程间通信资源,包括System V IPC 和 POSIX message queues |
每个容器有其自己的 System V IPC 和 POSIX 消息队列文档系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信 |
|
Network namespaces |
网络相关的系统资源 |
每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。 |
|
User namespaces |
用户和组 ID 空间 |
在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同; 每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户; |
Cgroup概述
在Linux里,一直以来就有对进程进行分组的概念和需求,比如session group, progress group等,后来随着人们对这方面的需求越来越多,比如需要追踪一组进程的内存和IO使用情况等,于是出现了cgroup,主要有两大用途:
o 用来统一将进程进行分组。
o 在分组的基础上对进程进行监控和资源控制管理等。
cgroup是Linux下的一种将进程按组进行管理的机制,在用户层看来,cgroup技术就是把系统中的所有进程组织成一颗一颗独立的树,每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个subsystem关联,树的作用是将进程分组,而subsystem的作用就是对这些组进行操作。cgroup主要包括下面两部分:
o subsystem 一个subsystem就是一个内核模块,他被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem经常被称作"resource controller",因为它主要被用来调度或者限制每个进程组的资源,但是这个说法不完全准确,因为有时我们将进程分组只是为了做一些监控,观察一下他们的状态,比如perf_event subsystem。
o hierarchy 一个hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。系统中可以有很多颗cgroup树,每棵树都和不同的subsystem关联,一个进程可以属于多颗树,即一个进程可以属于多个进程组,只是这些进程组和不同的subsystem关联。目前Linux支持12种subsystem,如果不考虑不与任何subsystem关联的情况(systemd就属于这种情况),Linux里面最多可以建12颗cgroup树,每棵树关联一个subsystem,当然也可以只建一棵树,然后让这棵树关联所有的subsystem。当一颗cgroup树不和任何subsystem关联的时候,意味着这棵树只是将进程进行分组,至于要在分组的基础上做些什么,将由应用进程自己决定,systemd就是一个这样的例子。
到目前为止,Linux支持12种subsystem,比如限制CPU的使用时间,限制使用的内存,统计CPU的使用情况,冻结和恢复一组进程等。
subsystemID |
引入内核版本 |
提供效果 |
Linux 2.6.24; CONFIG_CGROUP_SCHED |
用来限制cgroup的CPU使 |
|
Linux 2.6.24; CONFIG_CGROUP_CPUACCT |
统计cgroup的CPU的使用率。 |
|
Linux 2.6.24; CONFIG_CPUSETS |
绑定cgroup到指定CPUs和NUMA节点。 |
|
Linux 2.6.25; CONFIG_MEMCG |
统计和限制cgroup的内存的使用率,包括process memory, kernel memory, 和swap。 |
|
Linux 2.6.26; CONFIG_CGROUP_DEVICE |
限制cgroup创建(mknod)和访问设备的权限。 |
|
Linux 2.6.28; CONFIG_CGROUP_FREEZER |
suspend和restore一个cgroup中的所有进程。 |
|
Linux 2.6.29; CONFIG_CGROUP_NET_CLASSID |
将一个cgroup中进程创建的所有网络包加上一个classid标记,用于tc和iptables。 只对发出去的网络包生效,对收到的网络包不起作用。 |
|
Linux 2.6.33; CONFIG_BLK_CGROUP |
限制cgroup访问块设备的IO速度。 |
|
Linux 2.6.39; CONFIG_CGROUP_PERF |
对cgroup进行性能监控 |
|
Linux 3.3; CONFIG_CGROUP_NET_PRIO |
针对每个网络接口设置cgroup的访问优先级。 |
|
Linux 3.5; CONFIG_CGROUP_HUGETLB |
限制cgroup的huge pages的使用量。 |
|
Linux 4.3; CONFIG_CGROUP_PIDS |
限制一个cgroup及其子孙cgroup中的总进程数。 |