**cgroups(控制组)** 是 Linux 内核的一项功能,用于对进程或进程组进行**资源分配、限制和隔离**。它通过将进程分组并管理这些组的资源使用(如 CPU、内存、磁盘 I/O 等),实现系统资源的精细化控制。
---
### **核心功能**
1. **资源限制**
- 限制组内进程的资源使用量(如内存上限、CPU 配额)。
2. **优先级控制**
- 分配资源使用的权重(如为关键进程分配更多 CPU)。
3. **资源统计**
- 监控组内进程的资源消耗(如 CPU 使用时长)。
4. **进程隔离**
- 结合命名空间(namespaces)实现容器化环境(如 Docker、Kubernetes)。
---
### **关键概念**
- **子系统(Controllers)**
每种资源类型对应一个子系统,例如:
- `cpu`:限制 CPU 时间。
- `memory`:控制内存使用量。
- `blkio`:限制块设备 I/O。
- `devices`:控制设备访问权限。
- `freezer`:暂停/恢复进程组。
- **层级结构**
cgroups 按树形层级组织,子组继承父组的限制,并可添加额外规则。
- **管理接口**
通过虚拟文件系统(通常挂载在 `/sys/fs/cgroup`)配置参数,例如:
- 设置内存限制:`echo 100M > /sys/fs/cgroup/memory/group1/memory.limit_in_bytes`。
---
### **cgroups v1 vs v2**
- **v1**:各子系统独立管理,可能导致配置碎片化。
- **v2**:统一层级结构,支持跨子系统协同限制(如同时限制 CPU 和内存),功能更一致。
---
### **应用场景**
1. **容器技术**
Docker、Kubernetes 使用 cgroups 限制容器的资源使用。
2. **多租户系统**
防止单个用户/服务耗尽系统资源。
3. **性能优化**
确保关键服务(如数据库)获得足够资源。
---
### **操作示例**
- **通过命令行工具**(需安装 `cgroup-tools`):
```bash
# 创建 cgroup
cgcreate -g cpu,memory:/my_group
# 设置 CPU 限制
cgset -r cpu.cfs_quota_us=50000 /my_group
# 将进程加入 cgroup
cgexec -g cpu,memory:/my_group ./my_process
```
- **通过 systemd**:
使用 `systemctl set-property` 为服务动态调整资源限制。
---
### **与 Namespaces 的关系**
- **Namespaces**:隔离进程的视图(如文件系统、网络、PID),提供独立的运行环境。
- **cgroups**:控制资源分配。
两者结合(如 Docker)实现完整的容器化:隔离 + 资源限制。
---
cgroups 是 Linux 系统资源和容器技术的基石,通过精细化的资源管理提升系统稳定性和效率。