Namespace
Namespace提供了一种隔离机制,使得每个容器都有自己独立的进程空间。Linux支持多种类型的 Namespace,包括:
PID Namespace:隔离进程ID,每个容器内的进程ID是独立的。
Network Namespace:隔离网络设备、网络栈、端口等,每个容器有独立的网络环境。
IPC Namespace:隔离进程间通信,如信号量、消息队列等。
Mount Namespace:隔离文件系统挂载点,每个容器有自己的文件系统视图。
UTS Namespace:隔离主机名和域名。
User Namespace:隔离用户和用户组,允许容器内的用户映射到宿主机上的用户。
通过这些 Namespace,容器内的进程就像是在独立的系统上运行一样,互不干扰。
| Namespace | 隔离内容 | 系统调用参数 |
|---|---|---|
| UTS | 主机名与域名 | CLONE_NEWUTS |
| IPC | 信号量、消息队列和共享内存 | CLONE_NEWIPC |
| Network | 网络设备、网络栈、端口等 | CLONE_NEWNET |
| PID | 进程编号 | CLONE_NEWPID |
| Mount | 挂载点(文件系统) | CLONE_NEWNS |
| User | 用户和用户组 | CLONE_NEWUSER |

Cgroups
在Linux系统中,CGroups(Control Groups)是一项强大的内核功能,它允许系统管理员对进程组(即一组进程)使用的物理资源进行限制、记录、隔离和优先级分配。CGroups是构建包括Docker在内的现代容器技术的基础,同时也是Linux系统资源管理的关键工具。
CGroups简介
CGroups由Google工程师开发,自Linux内核2.6.24版本开始引入。它通过将进程分组并对这些组应用资源限制和优先级设置,实现了对系统资源的精细管理。CGroups包含多个子系统,每个子系统管理一类资源,如CPU、内存、输入/输出等。
CGroups的版本
CGroups有两个主要版本:v1和v2。v1版本在功能上比较分散,而v2版本旨在解决v1的一些问题,提供更统一的资源管理方式。Linux内核4.5以上版本开始支持CGroupsv2。
CGroups的关键概念
任务(Task):在CGroups中,任务指的是系统的一个进程。
控制组(Control Group):一组按照特定标准划分的进程,资源控制以控制组为单位。
层级(Hierarchy):控制组可以组织成层级结构,形成控制组树。
子系统(Subsystem):子系统是资源控制器,如CPU子系统控制CPU时间分配。
几种比较常用的 CGroups 子系统:
CPU 子系统,用来限制一个控制组(一组进程,你可以理解为一个容器里所有的进程)可使用的最大 CPU。memory 子系统,用来限制一个控制组最大的内存使用量。pids 子系统,用来限制一个控制组里最多可以运行多少个进程。cpuset 子系统, 这个子系统来限制一个控制组里的进程可以在哪几个物理 CPU 上运行。
CGroups的资源限制
CGroups可以限制进程组使用的资源数量,如内存子系统可以设定内存使用上限,超出限额时触发OOM(Out of Memory)。
CGroups的优先级控制
通过为进程组分配CPU时间片和硬盘IO带宽,实际上控制了进程的运行优先级。
CGroups的资源统计
CGroups可以统计资源使用量,如CPU使用时长、内存用量等,适用于计费和资源监控。
CGroups的进程控制
CGroups可以对进程组执行挂起、恢复等操作。
CGroups在Docker中的应用
Docker使用CGroups来限制容器的资源使用,确保容器不会消耗过多系统资源。通过CGroups,Docker可以:
限制容器的CPU使用率。
控制容器的内存使用,包括物理内存和交换分区。
设置磁盘IO的优先级和限制。
CGroupsv2的优势
与CGroupsv1相比,CGroupsv2提供了统一的层次结构设计,更安全的子树委派,以及更新的功能特性,如压力阻塞信息(PSI)和跨多个资源的增强资源分配管理和隔离。
要记住的key point
Namespace 帮助容器来实现各种计算资源的隔离,
Cgroups 主要限制的是容器能够使用的某种资源量。
最后,插个话题:
容器和虚拟机的区别
虚拟机(VM)运行一个成熟的“guest”操作系统,通过hypervisor对主机资源进行虚拟访问。一般来说,vm会产生大量开销,超出应用程序逻辑所消耗的开销。使用虚拟机好处是:提供了更为彻底的隔离和完整的操作系统功能,适合需要运行复杂应用和不同操作系统环境的场景。
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,占用的内存不比其他的filesystem多,因此它是轻量级的。容器对比虚拟机的优势是:容器提供了一种轻量级、高效的虚拟化解决方案,适合快速迭代和大规模部署





