在 Linux 中,cgroup(Control Groups) 和 namespace(命名空间) 是容器化技术(如 Docker、Kubernetes)实现的核心机制,它们共同提供了进程的资源隔离和管理能力。
1. cgroup(控制组)
作用:资源限制与管理 cgroup 允许管理员对进程组进行资源管理,包括 CPU、内存、I/O、网络等,确保进程不会占用超出设定的资源上限。
主要功能:
- 资源限制(Resource Limiting) :限制 CPU、内存、磁盘 IO 等资源的使用。
- 优先级控制(Priority) :为不同进程设置 CPU 和 IO 权重。
- 统计监控(Accounting) :记录进程资源使用情况,方便监控。
- 进程分组(Grouping) :可以将多个进程归为一个 cgroup 进行统一管理。
常见子系统(Controllers):
| 控制器 | 作用 |
|---|---|
| cpu | 限制 CPU 使用率 |
| cpuacct | 统计 CPU 使用情况 |
| memory | 限制和监控内存使用 |
| blkio | 限制磁盘 I/O 读写 |
| devices | 限制进程访问设备 |
| freezer | 挂起或恢复进程 |
| net_cls | 网络流量分类 |
| pids | 限制进程数 |
示例: 限制 myprocess 进程的 CPU 使用率不超过 50%:
mkdir /sys/fs/cgroup/cpu/mygroup
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
echo $$ > /sys/fs/cgroup/cpu/mygroup/tasks
2. namespace(命名空间)
作用:进程隔离 namespace 提供了一种机制,使不同的进程可以在相互隔离的环境中运行,彼此看不到对方的资源。
主要类型:
| 命名空间 | 作用 |
|---|---|
Mount (mnt) | 隔离文件系统挂载点 |
UTS (uts) | 隔离主机名和域名 |
IPC (ipc) | 隔离进程间通信(如消息队列、共享内存) |
PID (pid) | 隔离进程 ID 号(不同 namespace 可以有相同 PID) |
Network (net) | 隔离网络接口(如独立 IP、端口、iptables 规则) |
User (user) | 隔离用户 ID(UID/GID 映射) |
示例: 创建新的 UTS 和 PID 命名空间,并在其中启动一个 bash 进程:
unshare -u -p --fork bash
hostname new-host # 仅在新命名空间生效
ps aux # 只能看到自己创建的进程
cgroup vs. namespace
| 特性 | cgroup | namespace |
|---|---|---|
| 作用 | 限制和管理资源 | 进程隔离 |
| 影响范围 | 控制资源分配 | 隔离不同进程的环境 |
| 典型用途 | 限制 CPU/内存等使用 | 隔离容器、虚拟化环境 |
总结
- cgroup 主要用于 资源限制,确保进程不会滥用系统资源。
- namespace 主要用于 进程隔离,让不同进程在各自的 "小世界" 中运行。
- 两者结合 可以实现完整的 容器化,如 Docker、Kubernetes 中的容器技术。
🚀 在 Kubernetes 中,Pod 通过 namespace 实现进程隔离,cgroup 控制资源分配,确保不同容器互不影响!