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搭建Web服务器高效灵活吗?

    准备工作系统要求Linux发行版:推荐 Ubuntu 22.04 LTS 或 CentOS 9(社区免费版),硬件:至少1核CPU、1GB内存、10GB存储(根据流量调整),网络:公网IP地址(云服务器如阿里云/腾讯云)或本地端口映射,权限:使用 sudo 命令或 root 用户操作,更新系统终端执行:sudo……

    2025年8月6日
    12000
  • Linux大型C程序如何高效开发?

    开发环境配置(专业工具链)编译器与调试器使用 GCC/G++(支持C11/C17标准):gcc -std=c17 -Wall -Wextra -Werror调试工具:GDB(配合 GEF 插件增强内存分析)示例调试命令: gdb -q ./programbreak mainrunbacktrace构建系统Mak……

    2025年7月5日
    14000
  • Linux系统下如何在终端输入或文件命名中正确使用下划线?

    在Linux系统中,下划线(_)是一种常见的字符,广泛应用于文件命名、变量定义、配置文件编写等多个场景,其使用不仅符合Linux的命名规范,还能提升标识的可读性,以下从文件与目录命名、命令行与脚本变量、配置文件编写等角度,详细说明如何在Linux中正确使用下划线,文件与目录命名中的下划线使用Linux文件系统允……

    2025年10月5日
    11200
  • Linux中如何设置行号显示?

    在Linux系统中,行号是文本处理和编程调试中的重要辅助工具,能够快速定位文件内容的位置,无论是使用文本编辑器编写代码,还是通过终端命令查看文件内容,设置行号都能提升操作效率,本文将详细介绍在不同场景下设置行号的方法,包括常用文本编辑器(如Vim、Nano、Gedit)和终端命令(如cat、less、grep等……

    2025年10月7日
    12900
  • 如何删除Linux子目录下的文件?

    在Linux系统中,删除子目录文件是日常运维和开发中常见的操作,但不同场景需要选择不同的命令和方法,以确保操作安全且高效,以下是详细的操作指南,涵盖常用命令、参数说明及注意事项,基础删除命令:rm 与 rmdirrm 命令:通用删除工具rm 是最常用的删除命令,支持删除文件、目录(需配合参数),核心参数如下……

    2025年10月6日
    12600

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信