Cgroup(Control Group)是Linux内核提供的一种机制,用于限制、记录和隔离进程组使用的物理资源(如CPU、内存、磁盘I/O等)。它是Linux容器技术(如Docker、LXC)实现资源隔离的基础。
每个子系统(如cpu、memory)同一时间只能附加到一个层级上。例如: - cpu子系统不能同时附加到层级A和层级B - memory子系统也不能同时附加到多个层级
一个层级可以附加多个子系统。例如: - 可以创建一个层级同时附加cpu和memory子系统 - 这样该层级下的cgroup可以同时控制CPU和内存资源
一个进程在同一子系统中只能属于一个cgroup。例如: - 一个进程不能同时属于cpu子系统的cgroup1和cgroup2 - 但可以属于cpu子系统的cgroup1和memory子系统的cgroupA
# 创建并挂载一个包含cpu和memory子系统的层级
mkdir /sys/fs/cgroup/cpu_mem
mount -t cgroup -o cpu,memory cpu_mem /sys/fs/cgroup/cpu_mem
# 在该层级下创建子cgroup
mkdir /sys/fs/cgroup/cpu_mem/group1
# 设置CPU限制
echo 100000 > /sys/fs/cgroup/cpu_mem/group1/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu_mem/group1/cpu.cfs_period_us
# 设置内存限制
echo 100M > /sys/fs/cgroup/cpu_mem/group1/memory.limit_in_bytes
# 将进程加入该cgroup
echo $PID > /sys/fs/cgroup/cpu_mem/group1/tasks
无法附加子系统到新层级:
cat /proc/cgroups
查看子系统状态资源限制不生效:
层级结构混乱:
理解Cgroup的层级规则对于合理设计容器资源隔离方案至关重要。掌握单子系统单层级、多子系统单层级和进程单cgroup三大核心规则,能够帮助开发者在实际应用中避免常见陷阱,构建高效可靠的资源控制系统。