使用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