Linux中的cgroup(control group,控制组)是内核提供的一种资源管理机制,能够限制、审计和隔离进程组所使用的物理资源(如CPU、内存、磁盘I/O、网络带宽等),通过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的配置核心是“子系统+层级结构”,通过子系统(如cpu
、memory
)定义资源类型,通过层级结构(目录树)组织进程组,以下以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应用的资源:
sudo mkdir -p /sys/fs/cgroup/webapp
创建后,目录下会自动生成资源控制文件(如cpu.max
、memory.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
限制webapp
对sda1
的读写速率不超过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 ...
。
监控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限制设置后不生效,可能的原因有哪些?
答:常见原因及解决方法如下:
- 进程未正确加入cgroup:检查
cgroup.procs
文件中是否包含目标进程PID,若进程为子进程,可能需设置cgroup.threads
(v2)确保子进程继承。 - 内核参数未启用:确认内核启动参数包含
systemd.unified_cgroup_hierarchy=1
(v2)或对应v1参数,可通过cat /proc/cmdline
查看。 - 权限不足:修改cgroup参数需root权限,普通用户可通过
sudo
或设置cgroup目录权限(如sudo chmod 777 /sys/fs/cgroup/webapp
,不推荐)。 - 资源冲突:若父cgroup已设置更严格的限制(如父cgroup限制CPU 20%,子cgroup设置30%),则以父限制为准。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/16097.html