在CentOS7中,使用cgroups(Control Groups)限制不同用户的CPU和内存资源,使用root权限配置集群所有节点。
1、安装cgroup工具
yum install -y libcgroup libcgroup-tools
安装后启动服务并设置开机自启:
systemctl start cgconfig cgred
systemctl enable cgconfig cgred
2、配置cgroup资源组
1-创建资源组配置文件
vi /etc/cgconfig.d/user_limits.conf(添加用户user1和user2):
group user1_limit {
cpu {
针对的是逻辑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限制调整,若需限制多核CPU使用率,4核的30%
cpu.cfs_period_us = 100000;
cpu.cfs_quota_us = 100000; # 100ms周期内可用100ms * 4核 * 30% = 120ms
}
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上限。
2-多核CPU限制调整
若需限制多核CPU使用率(如4核的25%):
cpu.cfs_quota_us = 100000; # 100ms周期内可用100ms * 4核 * 25% = 100ms
cpu.cfs_period_us = 100000;
3、关联用户与资源组
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
4、验证配置
检查资源组限制:
cgget -g cpu,memory:user1_limit
输出应包含配置的CPU和内存参数。
测试用户资源限制:
以user1登录,运行压力测试:
stress --cpu 4 --vm 2 --vm-bytes 500M
监控资源使用:
top # 查看CPU占用(应不超过50%)
cgstats -s # 查看cgroup资源统计
5、注意
1-避免资源组复用
同一资源组内多个用户会共享配额(如user1_limit组内两用户共争50% CPU),建议每用户独立资源组。
2-Swap限制依赖
memory.memsw.limit_in_bytes需内核启用swapaccount=1(默认启用)。
3-持久化与临时调整
持久化:通过/etc/cgconfig.d/配置。
临时调整(重启失效):
cgset -r cpu.cfs_quota_us=80000 user1_limit # 动态修改CPU配额
4-进程数限制补充
若需限制用户进程数,可在资源组中添加pids子系统:
pids {
pids.max = 100; # 最大进程数
}
实际样例:
创建仅包含 CPU 子系统的 cgroup
这会在 /sys/fs/cgroup/cpu/hive_cpu_limit/ 创建目录。
sudo cgcreate -g cpu:/hive_cpu_limit
调度周期 40 核 = 40 × 100000 = 4,000,000 微秒
sudo cgset -r cpu.cfs_period_us=100000 hive_cpu_limit
设置配额:40 核
sudo cgset -r cpu.cfs_quota_us=4000000 hive_cpu_limit
策略文件
echo 'hive cpu hive_cpu_limit' | sudo tee -a /etc/cgrules.conf
启动cgred进程
sudo systemctl start cgred
sudo systemctl enable cgred
持久Cgourp Conf
sudo tee -a /etc/cgconfig.conf <<EOF
group hive_cpu_invlimit {
cpu {
cpu.cfs_period_us = 100000;
cpu.cfs_quota_us = 2000000;
}
}
EOF
启动服务
sudo systemctl enable cgconfig
sudo systemctl start cgconfig
验证
cat /sys/fs/cgroup/cpu/hive_cpu_limit/cpu.cfs_quota_us