linux 的cgroup 和namespace 作用?

127 阅读2分钟

在 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

特性cgroupnamespace
作用限制和管理资源进程隔离
影响范围控制资源分配隔离不同进程的环境
典型用途限制 CPU/内存等使用隔离容器、虚拟化环境

总结

  • cgroup 主要用于 资源限制,确保进程不会滥用系统资源。
  • namespace 主要用于 进程隔离,让不同进程在各自的 "小世界" 中运行。
  • 两者结合 可以实现完整的 容器化,如 Docker、Kubernetes 中的容器技术。

🚀 在 Kubernetes 中,Pod 通过 namespace 实现进程隔离,cgroup 控制资源分配,确保不同容器互不影响!