cgroup(Control Groups) 是 Linux 内核提供的一种机制,用于对进程进行资源隔离、限制和统计管理。它允许系统管理员将一组进程及其子进程划分为一个控制组,并对该组的资源使用(如 CPU、内存、磁盘 I/O、网络等)进行精细化控制。
核心功能
资源限制
- 可以限制 cgroup 中进程使用的 CPU、内存、磁盘带宽等资源,防止某个进程或服务占用过多资源导致系统不稳定。
优先级分配
- 为不同的 cgroup 分配不同的资源使用权重(如 CPU 时间片、磁盘 I/O 优先级)。
资源统计
- 监控 cgroup 中进程的资源使用情况(如 CPU 时间、内存占用等),便于分析和优化。
进程隔离
- 结合 Namespace 技术(如 Docker/Kubernetes),实现容器间的资源隔离。
cgroup v1 vs v2
- cgroup v1:早期版本,功能分散,子系统(如
cpu
、memory
)各自独立管理。 - cgroup v2:统一层级结构,所有子系统集成管理,更简洁且功能更强(主流 Linux 发行版默认支持)。
常见应用场景
容器技术(Docker/Kubernetes)
- Docker/Containerd 默认使用 cgroups 限制容器的 CPU、内存等资源。
- Kubernetes 通过
Resource Quotas
和Limit Ranges
依赖 cgroups。
系统资源管理
- 限制后台服务的 CPU/内存使用(如数据库、Web服务器)。
- 避免批处理任务耗尽系统资源。
多租户环境
- 在云计算中为不同用户或租户分配公平的资源配额。
基本操作示例
(1)查看已挂载的 cgroup
mount | grep cgroup
# cgroup v2通常挂载在/sys/fs/cgroup/
(2)创建并配置一个 cgroup
# 创建cgroup(以内存限制为例)
sudo mkdir /sys/fs/cgroup/memory/my_group
echo "100000000" > /sys/fs/cgroup/memory/my_group/memory.limit_in_bytes # 限制100MB内存
#将进程加入cgroup
echo $$ > /sys/fs/cgroup/memory/my_group/croup.procs #当前shell进程加入该组
(3)通过 systemd
管理 cgroups
#创建一个systemd单元并限制CPU使用率
sudo systemd-run --unit=my_service --scope --slice=my_slice \
bash -c "while true; do echo 'test'; done"
sudo systemctl set-property my_service.service CPUShares=500 #限制50%CPU份额
相关工具
systemd-cgtop
:动态查看各 cgroups的资源使用情况。cgcreate/cgset
:命令行工具管理 cgroups。- Docker/Kubernetes:自动调用底层 cgroups接口实现容器资源管理。
如果需要更深入的技术细节(如内核实现原理或性能调优),可以进一步探讨!
内容由零声教学AI助手提供,问题来源于学员提问