Linux系统中安装配置cgroup的具体步骤和方法有哪些?

Linux中的cgroup(control group,控制组)是内核提供的一种资源管理机制,能够限制、审计和隔离进程组所使用的物理资源(如CPU、内存、磁盘I/O、网络带宽等),通过cgroup,用户可以精细化管理系统资源,实现资源配额、优先级控制及容器化隔离等场景,以下将详细介绍Linux环境下cgroup的安装与配置步骤。

linux如何安装及配置cgroup

cgroup安装

多数Linux发行版默认已启用cgroup功能,但需确认内核参数及工具是否正确安装,不同发行版的安装命令略有差异,以下以主流发行版为例说明。

Ubuntu/Debian系统

Ubuntu 18.04及后续版本默认使用cgroup v2,但部分场景可能需安装cgroup工具,执行以下命令安装cgroup-tools(包含cgcreate、cgexec等命令):

sudo apt update
sudo apt install cgroup-tools

若需启用cgroup v1(旧版工具依赖),可通过内核参数systemd.unified_cgroup_hierarchy=0重启系统切换(不推荐,除非有兼容性需求)。

CentOS/RHEL/Fedora系统

CentOS 7及以上版本默认使用cgroup v2,安装libcgroup-tools即可:

sudo yum install libcgroup-tools  # CentOS 7/RHEL 7
sudo dnf install libcgroup-tools  # CentOS 8+/RHEL 8+/Fedora

若使用CentOS 6等旧版系统,需安装cgroup-bin并手动挂载cgroup v1:

sudo yum install cgroup-bin
sudo mount -t cgroup none /sys/fs/cgroup

检查cgroup状态

安装后,可通过以下命令确认cgroup版本及挂载状态:

# 查看cgroup版本(v2会显示unified挂载点)
mount | grep cgroup
# 输出示例(v2):
# cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,memory_recursiveprot)
# 检查内核是否支持cgroup
grep CONFIG_CGROUPS /boot/config-$(uname -r) | grep =y

若未启用,需重新编译内核并添加CONFIG_CGROUPS=y等参数(生产环境建议使用发行版提供的内核)。

cgroup配置

cgroup的配置核心是“子系统+层级结构”,通过子系统(如cpumemory)定义资源类型,通过层级结构(目录树)组织进程组,以下以cgroup v2(推荐)为例说明配置步骤,v1的配置逻辑类似,但参数文件路径和子系统分离。

理解cgroup子系统与挂载点

  • 子系统(Controller):定义资源控制类型,v2中子系统统一挂载到/sys/fs/cgroup,v1则按子系统分别挂载(如/sys/fs/cgroup/cpu)。
  • 挂载点:v2的统一挂载点为/sys/fs/cgroup,所有资源控制通过该目录下的文件实现。

v2支持的常见子系统功能:
| 子系统 | 作用 |
|———-|——————————-|
| cpu | CPU限制与调度(如周期配额) |
| memory | 内存使用限制与统计 |
| io | 块设备I/O限制(读写速率/IOPS)|
| pids | 进程数量限制 |

创建cgroup层级结构

/sys/fs/cgroup下创建目录作为cgroup组,目录名自定义,支持层级嵌套,例如创建一个名为webapp的cgroup,用于限制Web应用的资源:

linux如何安装及配置cgroup

sudo mkdir -p /sys/fs/cgroup/webapp

创建后,目录下会自动生成资源控制文件(如cpu.maxmemory.max等)。

设置资源限制

通过修改cgroup目录下的参数文件设置资源配额,以下以webapp为例,配置CPU、内存及I/O限制。

(1)CPU限制

v2中CPU控制通过cpu.max文件实现,格式为<period> <quota>

  • <period>:CPU时间配额周期(单位:微秒,默认100000,即100ms)
  • <quota>:周期内允许使用的CPU时间(-1表示无限制,50000表示50% CPU)

例如限制webapp最多使用30% CPU:

# 周期100ms,配额30ms(30% CPU)
echo 30000 100000 | sudo tee /sys/fs/cgroup/webapp/cpu.max

(2)内存限制

通过memory.max设置内存上限,单位为字节(支持K/M/G):

# 限制内存使用不超过512MB
echo 536870912 | sudo tee /sys/fs/cgroup/webapp/memory.max

还可设置memory.swap.max限制Swap使用量(需开启Swap):

echo 1073741824 | sudo tee /sys/fs/cgroup/webapp/memory.swap.max  # 内存+Swap不超过1GB

(3)I/O限制

通过io.max限制块设备I/O,格式为<major>:<minor> <rbps> <wbps> <riops> <wiops>(设备号、读速率、写速率、读IOPS、写IOPS)。
首先查看目标设备的设备号(如/dev/sda1):

lsblk -d -o NAME,MAJ:MIN
# 输出示例:sda1 8:1

限制webappsda1的读写速率不超过10MB/s:

echo "8:1 10485760 10485760 0 0" | sudo tee /sys/fs/cgroup/webapp/io.max

将进程加入cgroup

将目标进程的PID写入cgroup的cgroup.procs文件(v2)或tasks文件(v1),将Nginx主进程(PID为1234)加入webapp

# 查看Nginx主进程PID
ps aux | grep nginx | grep -v grep | awk '{print $2}'
# 假设PID为1234,写入cgroup.procs
echo 1234 | sudo tee /sys/fs/cgroup/webapp/cgroup.procs

若需加入多个进程,可逐行写入或使用echo -e "1234n5678" | sudo tee ...

linux如何安装及配置cgroup

监控cgroup资源使用

通过cgroup目录下的统计文件查看资源使用情况:

# 查看CPU使用时间(单位:纳秒)
cat /sys/fs/cgroup/webapp/cpu.stat
# 查看内存使用量(单位:字节)
cat /sys/fs/cgroup/webapp/memory.current
# 查看I/O统计(读/写字节数、IOPS)
cat /sys/fs/cgroup/webapp/io.stat

也可使用cgtop命令实时监控cgroup资源占用(需安装cgroup-tools):

sudo cgtop

删除cgroup

删除cgroup前需确保其中无进程(或先移除进程),直接删除目录即可:

sudo rmdir /sys/fs/cgroup/webapp

systemd与cgroup集成

现代Linux发行版(如Ubuntu 20.04、CentOS 8)普遍使用systemd管理服务,systemd直接支持通过cgroup限制服务资源,创建一个systemd服务单元文件/etc/systemd/system/webapp.service,添加资源限制:

[Unit]
Description=Web Application Service
[Service]
ExecStart=/usr/bin/nginx
# 限制CPU使用率不超过30%
CPUQuota=30%
# 限制内存不超过512MB
MemoryMax=512M
# 限制IOPS不超过1000
IOReadIOPSMax=1000
IOWriteIOPSMax=1000
[Install]
WantedBy=multi-user.target

加载并启动服务后,systemd会自动将服务进程加入对应的cgroup中,无需手动操作。

相关问答FAQs

问题1:如何查看某个进程所属的cgroup?
答:通过读取进程的/proc/[pid]/cgroup文件可查看其所属cgroup路径,查看PID为1234的进程的cgroup:

cat /proc/1234/cgroup
# 输出示例(v2):
# 0::/user.slice/user-1000.slice/session-1.scope

若使用systemd管理,路径中会包含service名称(如/system.slice/webapp.service)。

问题2:cgroup限制设置后不生效,可能的原因有哪些?
答:常见原因及解决方法如下:

  1. 进程未正确加入cgroup:检查cgroup.procs文件中是否包含目标进程PID,若进程为子进程,可能需设置cgroup.threads(v2)确保子进程继承。
  2. 内核参数未启用:确认内核启动参数包含systemd.unified_cgroup_hierarchy=1(v2)或对应v1参数,可通过cat /proc/cmdline查看。
  3. 权限不足:修改cgroup参数需root权限,普通用户可通过sudo或设置cgroup目录权限(如sudo chmod 777 /sys/fs/cgroup/webapp,不推荐)。
  4. 资源冲突:若父cgroup已设置更严格的限制(如父cgroup限制CPU 20%,子cgroup设置30%),则以父限制为准。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/16097.html

(0)
酷番叔酷番叔
上一篇 5小时前
下一篇 5小时前

相关推荐

  • linux如何创建系统用户名和密码错误

    Linux 中创建系统用户名和密码,可使用命令“sudo user

    6天前
    500
  • Linux部署PHP选LAMP方案?

    环境准备更新系统sudo apt update && sudo apt upgrade -y # Debian/Ubuntusudo yum update -y # CentOS/RHEL安装Apache服务器sudo apt install apache2 -y # Debian/Ubuntu……

    2025年7月15日
    2400
  • 如何按字母降序排列文件内容?

    在Linux系统中,降序排列数据通常通过sort命令实现,结合其反向排序选项-r,以下是详细操作指南:核心命令语法sort -r [选项] [文件]-r(–reverse):核心降序参数,将默认升序转为降序,常用辅助选项:-n:按数值大小排序(避免”10″排在”2″前),-k:指定排序的列(如-k 2表示按第……

    2025年7月1日
    2600
  • Linux系统如何查看硬盘总大小及剩余空间?命令方法详解

    在Linux系统中,查看硬盘大小有多种方法,涵盖命令行和图形界面工具,适用于不同使用场景和用户需求,以下从常用命令行工具、图形界面操作及注意事项三个方面展开说明,命令行工具查看硬盘大小命令行是Linux系统管理的高效方式,以下工具可满足不同角度的硬盘容量查询需求,lsblk:列出块设备信息lsblk(list……

    2天前
    400
  • linux如何开启路由转发功能

    Linux中,可通过执行命令echo 1 ˃ /proc/sys/net/ipv4/ip_forward开启路由转发功能,使系统能转发

    2025年8月17日
    500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信