Linux Cgroups(Control Groups)限制多用户CPU和内存资源管理
在CentOS 7中,使用cgroups(Control Groups)限制不同用户的CPU和内存资源,可通过以下步骤实现。以下操作需root权限,且配置需在集群所有节点执行(如适用)。
一、安装cgroup工具
yum install -y libcgroup libcgroup-tools
- 安装后启动服务并设置开机自启:
systemctl start cgconfig cgred
systemctl enable cgconfig cgred
⚙️ 二、配置cgroup资源组
1. 创建资源组配置文件
编辑 /etc/cgconfig.d/ 目录下的配置文件(例:user_limits.conf):
vi /etc/cgconfig.d/user_limits.conf
添加内容(以用户user1和user2为例):
group user1_limit {
cpu {
# 限制CPU使用率为单核的50%(周期100ms,配额50ms)
cpu.cfs_period_us = 100000;
cpu.cfs_quota_us = 50000;
}
memory {
# 物理内存限制1GB,总内存(含swap)限制1.5GB
memory.limit_in_bytes = 1G;
memory.memsw.limit_in_bytes = 1.5G;
}
}
group user2_limit {
cpu {
# 限制CPU使用率为单核的30%
cpu.cfs_quota_us = 30000;
cpu.cfs_period_us = 100000;
}
memory {
memory.limit_in_bytes = 2G;
memory.memsw.limit_in_bytes = 3G;
}
}
- 参数说明:
cpu.cfs_period_us:CPU周期(默认100ms)。cpu.cfs_quota_us:周期内可用CPU时间(例:50000us= 单核50%)。memory.limit_in_bytes:物理内存上限。memory.memsw.limit_in_bytes:物理内存+Swap上限。
或者如果多用户需要统一管理,在/etc/cgconfig.conf配置文件当中配置模板
template processlimit/%u {
cpu {
# limit to max 16 cpu cores
cpu.cfs_quota_us = 400000;
cpu.cfs_period_us = 100000;
}
memory {
# limit to 10GB=10*1024*1024*1024 B
# limit to 20GB=20*1024*1024*1024 B
# memory.limit_in_bytes = 10737418240;
memory.limit_in_bytes = 107374182400;
}
}
template cpulimit1/%u {
cpu {
# limit to max 8 cpu cores
cpu.cfs_quota_us = 800000;
cpu.cfs_period_us = 100000;
}
}
template memlimit/%u {
memory {
# limit to 10GB=10*1024*1024*1024 B
# limit to 20GB=20*1024*1024*1024 B
# memory.limit_in_bytes = 10737418240;
memory.limit_in_bytes = 214748364800;
}
}
2. 多核CPU限制调整
若需限制多核CPU使用率(如4核的25%):
cpu.cfs_quota_us = 100000; # 100ms周期内可用100ms * 4核 * 25% = 100ms
cpu.cfs_period_us = 100000;
三、关联用户与资源组
编辑规则文件 /etc/cgrules.conf:
vi /etc/cgrules.conf
添加用户映射规则:
user1 cpu,memory user1_limit/
user2 cpu,memory user2_limit/
@analog cpu,memory processlimit/%u
@digital cpu,memory processlimit/%u
@layout cpu,memory processlimit/%u
每条规则由三部分组成:
主体:@analog、@digital、@layout
以 @ 开头表示 用户组(如 analog 组、digital 组、layout 组)。
子系统:cpu,memory
指定资源限制类型,此处表示同时限制 CPU 和 内存 资源。
资源组路径:processlimit/%u
processlimit:cgroup 的父目录名称(需在 /sys/fs/cgroup/ 下预先创建)。
%u:动态占位符,自动替换为 实际用户名(例如用户 bob 属于 analog 组,则路径为 processlimit/bob)
格式:
<用户> <子系统> <资源组路径>重启服务生效:
systemctl restart cgconfig cgred
四、验证配置
检查资源组限制:
cgget -g cpu,memory:user1_limit
输出应包含配置的CPU和内存参数。
测试用户资源限制:
- 以
user1登录,运行压力测试:stress --cpu 4 --vm 2 --vm-bytes 500M
- 监控资源使用:
top # 查看CPU占用(应不超过50%)
cgstats -s # 查看cgroup资源统计
- 以
️ 五、注意事项
避免资源组复用
同一资源组内多个用户会共享配额(如user1_limit组内两用户共争50% CPU),建议每用户独立资源组。Swap限制依赖
memory.memsw.limit_in_bytes需内核启用swapaccount=1(默认启用)。持久化与临时调整
- 持久化:通过
/etc/cgconfig.d/配置。 - 临时调整(重启失效):
cgset -r cpu.cfs_quota_us=80000 user1_limit # 动态修改CPU配额
- 持久化:通过
进程数限制补充
若需限制用户进程数,可在资源组中添加pids子系统:pids {
pids.max = 100; # 最大进程数
}
六、故障排查
服务状态检查:
systemctl status cgconfig cgred
日志查看:
journalctl -u cgred
进程是否在cgroup中:
cat /sys/fs/cgroup/cpu/user1_limit/cgroup.procs
七、流程总结
1.配置规则文件/etc/cgrules.conf,关联用户或者用户组限制cpu/内存
2.配置模板文件/etc/cgconfig.conf 配置用户或者用户组默认的cpu/内存限制大小,统一管理模板限制文件
3.配置完成后重启cgroup服务systemctl restart cgconfig cgred
4.测试新用户cgroup cpu/内存限制是否生效(可以用stress-ng或者cgexec执行操作结果)
以上步骤通过配置文件实现永久生效。如需对已存在进程动态限制,可用
cgclassify手动加入资源组:
cgclassify -g cpu,memory:user1_limit <PID>
通过cgroups的精细化控制,可有效避免单个用户过度消耗资源导致系统卡顿,尤其适合多用户共享的服务器环境。
Linux Cgroups(Control Groups)限制多用户CPU和内存资源管理的更多相关文章
- linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定
背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[root@test vhost]# ps auxUSER ...
- Linux下用程序实现统计cpu和内存的利用率
Linux下没有直接可以调用系统函数知道CPU占用和内存占用.那么如何知道CPU和内存信息呢.只有通过proc伪文件系统来实现. proc伪文件就不介绍了,只说其中4个文件.一个是/proc/stat ...
- linux下分析java程序占用CPU、内存过高
一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...
- linux ps命令,查看进程cpu和内存占用率排序(转)
使用以下命令查看: ps -aux | sort -k4,4n ps auxw --sort=rss ps auxw --sort=%cpu linux 下的ps命令 %CPU 进程的cpu占用率 % ...
- Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch& ...
- linux学习--查看操作系统版本及cpu及内存信息
查看版本当前操作系统内核信息 uname -a 查看当前操作系统版本信息 cat /proc/version 查看物理cpu个数: cat /proc/cpuinfo| grep "phy ...
- linux ps命令查看最消耗CPU、内存的进程
1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...
- linux系统PS命令,按CPU、内存使用率对进程排序
https://blog.csdn.net/weixin_42123737/article/details/90081318
- Docker之Linux Cgroups
Linux Cgroups介绍 上面是构建Linux容器的namespace技术,它帮进程隔离出自己单独的空间,但Docker又是怎么限制每个空间的大小,保证他们不会互相争抢呢?那么就要用到Linux ...
- linux cgroups 简介
cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统 ...
随机推荐
- c++并发编程实战-第1章 c++并发世界
前言 c++11开始支持多线程,使得编写c++多线程程序无需依赖特定的平台,使开发者能够编写可移植的.行为确定的多线程程序代码. 什么是并发 所谓并发,是两个或多个同时独立进行的活动.而计算机中的并发 ...
- 干货分享:Dify中4种核心变量详解!
在 Dify 工作流(Workflow 和 Chatflow)的实现中,"变量"做为最基础.最核心的组件发挥着不可或缺的作用,因为它承载了不同节点间数据传递的作用. 也就是说,我们 ...
- 聊一聊 .NET在Linux下的IO多路复用select和epoll
一:背景 1. 讲故事 在windows平台上,相信很多人都知道.NET异步机制是借助了Windows自带的 IO完成端口 实现的异步交互,那在 Linux 下.NET 又是怎么玩的呢?主要还是传统的 ...
- 控制ERP物料主数据通过Middleware传往CRM
先说一下优化过滤的必要性. CRM物料主数据一百多万. 感谢MDM或者相关的系统,每天通过接口更新的不知道什么东西,每天数百万的物料更新队列进入CRM. CRM系统被搞死了好几次. 然后各种优化报表, ...
- 【SPIE独立出版-稳定检索】第二届遥感与数字地球国际学术会议 (RSDE 2025)
第二届遥感与数字地球国际学术会议 (RSDE 2025) 2025 2nd International Conference on Remote Sensing and Digital Earth 大 ...
- 从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化
在大数据时代,企业对数据的依赖程度越来越高.然而,随着业务的不断发展和技术的快速迭代,大数据平台的集群迁移已成为企业数据中台发展途中无法回避的需求.在大数据平台发展初期,国内数据中台市场主要以国外开源 ...
- Django数据库配置避坑指南:从初始化到生产环境的实战优化
一.数据库配置 介绍 Django 4.2 支持多种数据库后端 数据库类型 推荐版本 官方支持 驱动 / 后端 默认端口 适用场景 备注 PostgreSQL 12+ psycopg2-binary ...
- Win11 23H2 升级到 24H2 后,VB程序出错的一个解决方法:重新修复Office。
单位VB小程序用着一直正常,它是从EXCEL中读取数据,写入ERP里.某天同事操作系统由Win11 23H2升级到 24H2后,小程序运行就死机,但如果是全新安装的24H2版本就没问题. 一开始以为是 ...
- tp5 后台日程(日历)安排
1)记录----日程安排 2)需求: ) 1.遍历月份到后台 实现切换月份 并显示当月的今天高亮 设计数据表 ) 2. 添加日程 添加可见用户,只有可见用户才可以看到该发布的日程安排 ) 3.日程提交 ...
- .net core webapi Post接收不到ajax请求data数据
https://blog.csdn.net/weixin_44352179/article/details/106633989 在做.NET CORE WEBAPI接口案例的时候碰到了前端页面ajax ...