在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的精细化控制,可有效避免单个用户过度消耗资源导致系统卡顿,尤其适合多用户共享的服务器环境。
浙公网安备 33010602011771号