先查看cgroups的版本支持:
cat /proc/filesystems | grep cgroup
运行结果:
如上表示支持cgroup2版本
一、对内存进行控制
cgroup版本对于内存控制是单独使用/sys/fs/cgroup/memory路径控制的,而在cgroup2版本中是统一管理,所以没有该路径,所以只需先进入该路径:
cd /sys/fs/cgroup
然后在该路径下创建一个新的cgroup目录,如下:
mkdir test_memory
查看目录可以发现里面已经自动添加了一些文件:
假设场景为限制cgroup的内存使用最大为20MB,那么需要设置的文件为memory.max,先查看原本的限制大小:
max就表示不对内存的使用作限制,那么通过指令来修改它:
echo "20M" > memory.max
再查看就是被修改后的值了,这里通过压力测试工具stress进行测试,指令如下:
stress -m 1 --vm-bytes 50m
表示产生1个进程,该进程循环调用malloc/free函数分配和释放内存,内存大小为50MB,再通过pidstat监控进程的内存的占用情况:
pidstat -C stress -r -p ALL 2 10000
结果如下:
没问题,但是为什么设置的cgroup没有生效?很简单,因为没有把该进程加入监管控制中,把该进程加入创建的cgroup中即可,返回/sys/fs/cgroup/test_memory,找到cgroup.procs文件,将需要控制的进程写入即可:
echo "294594" >> cgroup.procs
回车按下后,stress会结束运行,因为之前的内存使用超过了限制,这是stress的结束信息:
pidstat则不会显示该进程的内存监控信息了.
二、对cpu进行控制
与内存控制大致的步骤,先在/sys/fs/cgroup下创建一个cgroup目录,再修改相关文件即可,假设场景为限制cpu使用率在20%,那么先创建然后进入目录,找到cpu.max文件,文件原内容为:
cpu.max文件的格式为: quota period
- quota是允许的最大cpu时间量,以微秒为单位
- period是一个周期长度,也以微秒为单位
而cpu使用率的计算方式为: quota / period,那么要限制cpu的使用率为20%,只需设置quota为20000,period为100000即可,而原文件为max / 100000则表示对于cpu的使用率不作限制.
修改如下:
echo "20000 100000" > cpu.max
依然是通过stress和pidstat来进行测试和观察,stress指令为:
stress -c 1
pidstat指令:
pidstat -C stress -p ALL 2 10000
结果如下:
可以看到cpu使用率高达98%,限制不起效?原因和之前一样,没有把进程加入cgroup,加入即可,把进程id写入cgroup.procs即可:
echo "294860" >> cgroup.procs
回车按下后可以马上看到cpu使用率的变化: