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)
酷番叔酷番叔
上一篇 2025年8月24日 16:19
下一篇 2025年8月24日 16:31

相关推荐

  • 在Linux系统中如何彻底卸载Oracle数据库并清理所有残留?

    在Linux系统中卸载Oracle数据库需要谨慎操作,涉及服务停止、文件清理、用户组删除等多个步骤,不同版本的Oracle(如11g、12c、19c等)和Linux发行版(如RHEL、Ubuntu等)可能存在差异,但核心流程基本一致,以下是详细的卸载步骤及注意事项,确保彻底清理Oracle相关组件,避免残留文件……

    2025年8月30日
    5800
  • 为什么用这3个AI工具的人效率偷偷翻倍?

    前提条件安装GCC编译器Linux默认不安装编译器,需手动安装GCC(GNU Compiler Collection):sudo apt update && sudo apt install gcc # Debian/Ubuntusudo yum install gcc # CentOS/RHE……

    2025年7月19日
    6500
  • Linux如何删除LV?操作步骤与注意事项详解

    在Linux系统中,逻辑卷(LV)作为LVM(逻辑卷管理)的核心组件,提供了灵活的存储管理能力,当需要释放存储空间、调整存储结构或废弃不再使用的逻辑卷时,删除LV是必要的操作,但删除LV涉及数据安全,需严格遵循操作流程并注意细节,避免误删导致数据丢失,以下将详细介绍Linux中删除LV的完整步骤、注意事项及特殊……

    2025年8月26日
    5700
  • 如何在使用IBus时添加输入法?

    在Linux系统中添加输入法需要根据您使用的桌面环境和发行版选择合适的方法,以下是详细的操作指南,涵盖主流发行版(Ubuntu/Debian、Fedora、Arch)和输入法框架(IBus、Fcitx),确保您能高效完成配置:选择输入法框架Linux常用两种输入法框架:IBus(推荐给GNOME用户)Fcitx……

    2025年7月26日
    7200
  • linux如何查询进程时间

    Linux中,可使用ps -eo pid,etime,comm命令查询进程时间,

    2025年8月10日
    5200

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信