cgroups (控制组)
cgroups(控制组)是 Linux 内核的一个功能,用于限制、记录和隔离进程组使用的物理资源(如 CPU、内存、磁盘 I/O 等)。cgroups 允许系统管理员精细地管理和监控系统资源的使用,以及实现资源的隔离和优先级控制。
cgroups 的主要组件
cgroups 主要由以下几个组件(子系统)组成,每个组件负责不同类型的资源管理:
- cpu:管理对 CPU 的访问。
- cpuacct:生成 CPU 资源使用报告。
- cpuset:分配单独的 CPU 核和内存节点给进程组。
- memory:限制进程组的内存使用,并生成内存资源使用报告。
- blkio:限制进程组的块设备 I/O。
- devices:允许或拒绝进程组访问设备。
- net_cls:标记网络包,以便使用 tc 模块(Linux 流量控制器)进行不同的网络带宽分配。
- freezer:挂起或恢复进程组。
- perf_event:监控进程组的性能计数器。
- hugetlb:限制 HugeTLB 页面的使用。
如何使用 cgroups 进行资源限制和隔离
创建和管理 cgroups
cgroups 可以通过命令行工具(如 cgcreate
, cgexec
, cgset
等)或直接通过文件系统接口来管理。cgroups 的配置通常在 /sys/fs/cgroup
目录下进行。
示例:创建一个新的 cgroup 并设置 CPU 和内存限制
# 创建一个名为 example 的 cgroup
mkdir /sys/fs/cgroup/cpu/example
mkdir /sys/fs/cgroup/memory/example
# 设置 CPU 使用的限制,这里设置 CPU 使用率不超过一个核心
echo 100000 > /sys/fs/cgroup/cpu/example/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/example/cpu.cfs_period_us
# 设置内存限制,这里限制为 1GB
echo 1073741824 > /sys/fs/cgroup/memory/example/memory.limit_in_bytes
# 将进程添加到 cgroup
echo $$ > /sys/fs/cgroup/cpu/example/tasks
echo $$ > /sys/fs/cgroup/memory/example/tasks
资源限制和隔离的工作原理
- CPU:通过
cpu.cfs_quota_us
和cpu.cfs_period_us
控制 CPU 时间的分配。例如,如果quota
是period
的一半,则 cgroup 可以使用最多 50% 的 CPU 时间。 - 内存:通过
memory.limit_in_bytes
设置内存使用上限。如果进程组尝试使用超过此限制的内存,将触发 OOM(内存不足)处理机制。 - 磁盘 I/O:通过
blkio
子系统的blkio.throttle.read_bps_device
和blkio.throttle.write_bps_device
控制读写速率。 - 网络:通过
net_cls.classid
设置网络类别标识符,然后可以用 tc 设置带宽限制。
总结
cgroups 提供了一种强大的机制来管理和限制系统资源的使用,它是现代 Linux 系统中实现资源隔离和优先级控制的基石。通过精细地控制各种资源的使用,系统管理员可以确保系统的稳定性和性能,防止某个进程或进程组过度消耗资源而影响整个系统的运行。