使用cgroup工具对服务器某些/全部用户进行计算资源限制
主要介绍,如何对指定/所有用户进行资源限定(这里主要介绍cpu和内存占用限制),防止某些用户大量占用服务器计算资源,影响和挤占他人正常使用服务器。
- 安装cgroup管理工具sudo apt-get install cgroup-tools
- 使用mount -t cgroup命令检查验证

可以通过编写 /etc/cgconfig.conf和 /etc/cgrules.conf 文件进行计算资源的配置,其中:
- /etc/cgconfig.conf实现具体的配置设置
- /etc/cgrules.conf确定每个用户属于哪个配置
cgroup工具,会根据上面的两个文件中的不同资源限制,自动生成一些具体的配置文件,放在/sys/fs/cgroup/下的对应文件夹下,有点类似CMakeLists.txt。
使用group限制单用户/多用户计算资源
 
使用 group字段,创建资源限制组,进行组内成员的资源控制限制
-  在 /etc/cgconfig.conf添加如下配置,将会对组users_mem_limit内的用户所能申请的最大内存进行限制。# `group`是特殊字段,`users_mem_limit`是组的名称 group users_mem_limit{memory{memory.limit_in_bytes = 15G;memory.memsw.limit_in_bytes = 16G;} }其中: -  memory.limit_in_bytes只限制实际的物理内存使用,不包括交换空间
-  memory.memsw.limit_in_bytes限制实际物理内存和交换空间的总使用
-  一般来说,两个参数需要使用字节(bytes)为单位,但是也可以直接使用这里的 G
 
-  
-  在 /etc/cgrules.conf添加如下配置,实现将某个/某些用户添加到该组。#用户名 #限制类型 #所属组 user01 memory users_mem_limit/ user02 memory users_mem_limit/
-  设置限制服务开机启动 #开机启动 systemctl enable cgconfig systemctl enable cgred #重启服务 systemctl restart cgconfig systemctl restart cgred
注意点:
-  这种情况下,该组内的用户将会共用受限的15G内存,而不是每个人最大15G,例如上面的例子中, user01和user02将共用15G内存;
-  如果程序申请不到内存,自己会停下来并报错。如果仅限制物理内存的容量,不限制swap的容量,那么进程不会被杀死。可以保持运行。 
使用template限制多个用户的内存和CPU占用
 
刚才使用group 也可以实现多用户的限制,但是被限制的用户将会共用受限资源,如何实现对每个用户的计算资源进行同等配置,同时限制所有用户对共用服务器CPU和内存资源的过度使用? 这里使用template 实现。
template 本质上只是一个模板,本质上是会对所有用户都单独生成一个组?。
-  在 /etc/cgconfig.conf添加如下配置,使用template,设置了memory 不能超过60GB,最多100%占用36个CPU核心。template users/%u {memory {memory.limit_in_bytes = 60G;memory.memsw.limit_in_bytes = 61G;}cpu {cpu.cfs_quota_us = 3600000;cpu.cfs_period_us = 100000;} }其中cpu的限制逻辑是: -  在 cpu.cfs_period_us周期内,只能使用最多cpu.cfs_quota_us的cpu资源。
-  默认情况下, cpu.cfs_period_us的单位为微秒,默认值为100000。cpu.cfs_quota_us的值为-1,即不做限制。
-  例子中,利用两个参数的比值 cpu.cfs_quota_us/cpu.cfs_period_us=3600%,实现最多100%占用36个CPU核心。
 
-  
-  在 /etc/cgrules.conf添加如下配置,对所有用户的cpu和内存进行控制。#所有用户 限制类型 模板 * cpu,memory users/%u
-  设置服务 #开机启动 systemctl enable cgconfig systemctl enable cgred #重启服务 systemctl restart cgconfig systemctl restart cgred
一些注意点
在/sys/fs/cgroup下,有不同的文件夹,这些文件分别包含了不同的资源配置文件。
cgroup根据 /etc/cgconfig.conf配置文件,自动生成一些具体的文件,然后在在/sys/fs/cgroup的不同文件夹下生成对应的配置,例如:
-  刚才使用的 group配置中生成的cgroup文件在/sys/fs/cgroup/memory/users_mem_limit目录下。
-  刚才使用的 template将会自动生成以下数据- /sys/fs/cgroup/memory/users/user01
- /sys/fs/cgroup/memory/users/user02
- /sys/fs/cgroup/cpu/users/user01
- /sys/fs/cgroup/cpu/users/user02
 
-  可以使用如下指令删除某个用户的配置,当他重新登录时,就会自动取消 cgdelete cpu:/users/user01 cgdelete memory:/users/user01
参考
- 使用 nice、cpulimit 和 cgroups 限制 cpu 占用率
- 如何对占据服务器大量cpu资源的用户进行限制
- Linux系统使用cgroup限制用户进程过度使用内存
- 精准限制CPU:Cgroups