Cgroup 资源控制

前言

        在 Linux 操作系统中「Cgroup」(Control Groups)是一项非常重要的技术,它允许系统管理员对运行的软件进程执行组织进行分组,并进行 CPU 、内存、IO 等资源的限制、统计和监控。

一、Cgroup 的概念

        Cgroup 是由 Google 开发,后被各大 Linux 分支接受并组成为一个标准性的系统资源管理功能,当前已成为启动器 systemd 的核心技术之一。

通过 cgroup,我们可以:

  • 限制软件使用的资源(如内存、CPU 、IO 、网络并发数量等)

  • 统计或跟踪软件使用的资源

  • 分配或分隔资源,并与容器技术结合。

二、Cgroup 版本:v1 vs v2

    Linux Cgroup 有两个主要版本:

  • v1 :使用独立的管理器,各个资源分别管理
  • v2 :结合管理,类似于组合式架构,让资源管理更简洁

查看当前使用版本

cat /sys/fs/cgroup/cgroup.controllers     # v2
ls /sys/fs/cgroup/memory/                 # v1

切换或启用 v2

        在 /etc/default/grub 中添加:

GRUB_CMDLINE_LINUX="... systemd.unified_cgroup_hierarchy=1"

        然后执行

sudo update-grub
sudo reboot

三、Cgroup 工作原理

        Cgroup 通过文件系统进行控制,形成一些相关目录,每一个目录就是一个进程组。

比如:

/sys/fs/cgroup/memory/mygroup/
/sys/fs/cgroup/cpu/mygroup/

        通过将 pid 写入特定的 cgroup 文件,就可以把进程分配到该 cgroup 中。

四、使用 Cgroup 的基础指令

使用 cgcreate 创建分组

sudo cgcreate -g memory,cpu:mygroup

限制 memory

echo 100000000 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

限制 CPU

echo 512 > /sys/fs/cgroup/cpu/mygroup/cpu.shares  # 高值优先级高

分配进程

echo 1234 > /sys/fs/cgroup/memory/mygroup/tasks

使用 cgexec 启动进程

cgexec -g memory,cpu:mygroup stress --vm 1 --vm-bytes 128M

使用 systemd 配合

创建服务:

[Service]
Slice=mygroup.slice
MemoryMax=200M
CPUQuota=20%

五、Cgroup 实际应用场景

1. 限制单个软件的内存使用

如果一个 Java 运行时占定太多内存,可以这样制定:

sudo cgcreate -g memory:/java
sudo cgset -r memory.limit_in_bytes=1G java
sudo cgexec -g memory:java java -jar yourapp.jar

2. 限制某些怪软件不能占死 IO

sudo cgcreate -g blkio:/limit
sudo cgset -r blkio.throttle.read_bps_device="8:0 1048576" limit  # 限制阅读速度

3. 配合容器 Docker 和 Kubernetes

        Docker 和 k8s 都是基于 Cgroup 来进行资源隔离和管理的,例如:

docker run --memory="500m" --cpus="0.5" busybox

六、常见问题

1. 设置不生效

确认是 root 权限操作,确认路径正确

2. systemd 下无法直接使用 cgcreate

可通过创建 slice 或 service 配合

3. 文件系统很复杂

可使用 cgroup相关工具:

  • cgtop

  • cgexec

  • cgroupfs-mount

七、结言

        Cgroup 是环境隔离、资源限制和性能管理的基石,无论是纯 Linux 系统管理,还是容器和分应用环境,Cgroup 的熟悉程度展示了系统管理和性能调优能力。并且在终端、服务器、零件设备、实时操作系统中都有重要场景。

你可能感兴趣的:(Linux,linux,服务器,运维)