在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

添加内容(以用户user1user2为例):

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
    

🧪 ​​四、验证配置​

  1. ​检查资源组限制​​:

    cgget -g cpu,memory:user1_limit
    

    输出应包含配置的CPU和内存参数。

  2. ​测试用户资源限制​​:

    • user1登录,运行压力测试:
      stress --cpu 4 --vm 2 --vm-bytes 500M
      
    • 监控资源使用:
      top  # 查看CPU占用(应不超过50%)
      cgstats -s    # 查看cgroup资源统计
      

⚠️ ​​五、注意事项​

  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;  # 最大进程数
    }
    

🔍 ​​六、故障排查​

  • ​服务状态检查​​:

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

posted on 2025-07-30 14:18  LeeHang  阅读(339)  评论(0)    收藏  举报